| /** | |
|  * Central Gravity Solver | |
|  */ | |
| class CentralGravitySolver { | |
|   /** | |
|    * @param {Object} body | |
|    * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody | |
|    * @param {Object} options | |
|    */ | |
|   constructor(body, physicsBody, options) { | |
|     this.body = body; | |
|     this.physicsBody = physicsBody; | |
|     this.setOptions(options); | |
|   } | |
| 
 | |
|   /** | |
|    * | |
|    * @param {Object} options | |
|    */ | |
|   setOptions(options) { | |
|     this.options = options; | |
|   } | |
| 
 | |
|   /** | |
|    * Calculates forces for each node | |
|    */ | |
|   solve() { | |
|     let dx, dy, distance, node; | |
|     let nodes = this.body.nodes; | |
|     let nodeIndices = this.physicsBody.physicsNodeIndices; | |
|     let forces = this.physicsBody.forces; | |
| 
 | |
|     for (let i = 0; i < nodeIndices.length; i++) { | |
|       let nodeId = nodeIndices[i]; | |
|       node = nodes[nodeId]; | |
|       dx = -node.x; | |
|       dy = -node.y; | |
|       distance = Math.sqrt(dx * dx + dy * dy); | |
| 
 | |
|       this._calculateForces(distance, dx, dy, forces, node); | |
|     } | |
|   } | |
| 
 | |
|   /** | |
|    * Calculate the forces based on the distance. | |
|    * @param {number} distance | |
|    * @param {number} dx | |
|    * @param {number} dy | |
|    * @param {Object<Node.id, vis.Node>} forces | |
|    * @param {Node} node | |
|    * @private | |
|    */ | |
|   _calculateForces(distance, dx, dy, forces, node) { | |
|     let gravityForce = (distance === 0) ? 0 : (this.options.centralGravity / distance); | |
|     forces[node.id].x = dx * gravityForce; | |
|     forces[node.id].y = dy * gravityForce; | |
|   } | |
| } | |
| 
 | |
| 
 | |
| export default CentralGravitySolver;
 |