kdForce.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. /**
  2. * This is not used anywhere, but it is a good exploration into kd-tree based
  3. * simulation.
  4. */
  5. module.exports = createKDForce;
  6. function createKDForce(bodies, settings) {
  7. var KDBush = require('kdbush').default;
  8. var random = require('ngraph.random').random(1984);
  9. return kdForce;
  10. function kdForce(iterationNumber) {
  11. if (iterationNumber < 500) return;
  12. var gravity = settings.gravity;
  13. var points = new KDBush(bodies, p => p.pos.x0, p => p.pos.x1);
  14. var i = bodies.length;
  15. while (i--) {
  16. var body = bodies[i];
  17. body.reset();
  18. var neighbors = points.within(body.pos.x0, body.pos.x1, settings.springLength);
  19. var fx = 0, fy = 0;
  20. for (var j = 0; j < neighbors.length; ++j) {
  21. var other = bodies[neighbors[j]];
  22. if (other === body) continue;
  23. var dx = other.pos.x0 - body.pos.x0;
  24. var dy = other.pos.x1 - body.pos.x1;
  25. var r = Math.sqrt(dx * dx + dy * dy);
  26. if (r === 0) {
  27. // Poor man's protection against zero distance.
  28. dx = (random.nextDouble() - 0.5) / 50;
  29. dy = (random.nextDouble() - 0.5) / 50;
  30. r = Math.sqrt(dx * dx + dy * dy);
  31. }
  32. var v = gravity * other.mass * body.mass / (r * r * r);
  33. fx += v * dx;
  34. fy += v * dy;
  35. }
  36. body.force.x0 = fx;
  37. body.force.x1 = fy;
  38. //dragForce.update(body);
  39. }
  40. }
  41. }