visjs-network
Version:
A dynamic, browser-based network visualization library.
62 lines (55 loc) • 1.46 kB
JavaScript
/**
* 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