Skip to content
Snippets Groups Projects
Select Git revision
  • f2e8e3472a3f899a06bc5fc734b357213131067c
  • main default protected
  • polish
3 results

field.c

Blame
  • field.c 1.58 KiB
    #include <math.h>
    #include <stdbool.h>
    #include <stdlib.h>
    
    #include "physics.h"
    
    
    // Compute E*qP/norm(qP)
    // Return false if norm(qP) < eps
    /// qP = vectoriel(P-q)
    /// Compute the vector value of the field generated by a charge at a given point in space.
    bool compute_e(charge_t c, vec2 p, double eps, vec2 *e) {
    	vec2 relative_position = vec2_sub(p, c.pos);
    	if (vec2_norm(relative_position) < eps) return false;
    	double field = K * c.q / vec2_norm_sqr(relative_position);
    	*e = vec2_mul(field, vec2_normalize(relative_position));
    	return true;
    }
    
    // Compute the normalized sum of Ei*qiP/norm(qiP)
    // Return false if for some qiP, norm(qiP) < eps
    bool compute_total_normalized_e(charge_t *charges, int num_charges, vec2 p, double eps, vec2 *e) {
    	*e = vec2_create_zero();
    	vec2 ei = vec2_create_zero();
    	for (size_t i = 0; i < num_charges; ++i) {
    		if (!compute_e(charges[i], p, eps, &ei)) return false;
    		*e = vec2_add(acc, ei);
    	}
    	*e = vec2_normalize(*e);
    	return true;
    }
    
    // Compute and then draw all the points belonging to a field line,
    // starting from pos0.
    // Returns false if pos0 is not a valid position
    // (for example if pos0 is too close to a charge).
    static bool draw_field_line(struct gfx_context_t *ctxt, charge_t *charges, int num_charges, double dx, vec2 pos0, double x0, double x1, double y0, double y1) {
    	return EXIT_SUCCESS;
    }
    
    // Draw all the charges
    // A circle with minus sign for negative charges
    // A circle with a plus sign for positive charges
    static void draw_charges(struct gfx_context_t *context, charge_t *charges, int num_charges, double x0, double x1, double y0, double y1) {
    }