diff --git a/sketch.js b/sketch.js index a04f4ac..d0a1b95 100644 --- a/sketch.js +++ b/sketch.js @@ -70,7 +70,7 @@ function draw() { camera.centerZ = 0; make_lights(); - if (physics) move_charges(charges); + if (physics) move_charges(charges, 8e-4); draw_charges(sphere_radius); if (skeleton) draw_skeleton(sphere_radius); diff --git a/thomson-problem.js b/thomson-problem.js index bb7466c..d13cc31 100644 --- a/thomson-problem.js +++ b/thomson-problem.js @@ -1,4 +1,4 @@ -function move_charges(charges) { +function move_charges(charges, force_constant) { for (let charge of charges) { charge.acceleration.setMag(0); } @@ -8,15 +8,21 @@ function move_charges(charges) { charges[i].position, charges[j].position, ); - let acceleration_mag = 1 / displacement.mag() * 0.001; + const force_mag = 1 / displacement.magSq() * force_constant; + // XXX possible extension: divide by charge's mass + const ai_mag = force_mag; + const aj_mag = force_mag; let ai; - if (acceleration_mag === Infinity) { + let aj; + if (force_mag === Infinity) { ai = p5.Vector.random3D(); + aj = p5.Vector.random3D(); } else { ai = displacement.copy().normalize(); + aj = ai.copy().mult(-1); } - ai.mult(acceleration_mag); - let aj = p5.Vector.mult(ai, -1); + ai.mult(ai_mag); + aj.mult(aj_mag); project_onto_plane(ai, charges[i].position); project_onto_plane(aj, charges[j].position); charges[i].acceleration.add(ai);