UNPKG

visjs-network

Version:

A dynamic, browser-based network visualization library.

62 lines (55 loc) 1.46 kB
/** * 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