vis.js is a dynamic, browser-based visualization library
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.4 KiB

  1. /**
  2. *
  3. * @param {Object} body
  4. * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody
  5. * @param {Object} options
  6. * @constructor CentralGravitySolver
  7. */
  8. class CentralGravitySolver {
  9. constructor(body, physicsBody, options) {
  10. this.body = body;
  11. this.physicsBody = physicsBody;
  12. this.setOptions(options);
  13. }
  14. setOptions(options) {
  15. this.options = options;
  16. }
  17. solve() {
  18. let dx, dy, distance, node;
  19. let nodes = this.body.nodes;
  20. let nodeIndices = this.physicsBody.physicsNodeIndices;
  21. let forces = this.physicsBody.forces;
  22. for (let i = 0; i < nodeIndices.length; i++) {
  23. let nodeId = nodeIndices[i];
  24. node = nodes[nodeId];
  25. dx = -node.x;
  26. dy = -node.y;
  27. distance = Math.sqrt(dx * dx + dy * dy);
  28. this._calculateForces(distance, dx, dy, forces, node);
  29. }
  30. }
  31. /**
  32. * Calculate the forces based on the distance.
  33. * @param {number} distance
  34. * @param {number} dx
  35. * @param {number} dy
  36. * @param {Object<vis.Node.id, vis.Node>} forces
  37. * @param {vis.Node} node
  38. * @private
  39. */
  40. _calculateForces(distance, dx, dy, forces, node) {
  41. let gravityForce = (distance === 0) ? 0 : (this.options.centralGravity / distance);
  42. forces[node.id].x = dx * gravityForce;
  43. forces[node.id].y = dy * gravityForce;
  44. }
  45. }
  46. export default CentralGravitySolver;