UNPKG

visjs-network

Version:

A dynamic, browser-based network visualization library.

57 lines (50 loc) 1.63 kB
import BarnesHutSolver from './BarnesHutSolver' /** * @extends BarnesHutSolver */ class ForceAtlas2BasedRepulsionSolver extends BarnesHutSolver { /** * @param {Object} body * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody * @param {Object} options */ constructor(body, physicsBody, options) { super(body, physicsBody, options) } /** * Calculate the forces based on the distance. * * @param {number} distance * @param {number} dx * @param {number} dy * @param {Node} node * @param {Object} parentBranch * @private */ _calculateForces(distance, dx, dy, node, parentBranch) { if (distance === 0) { distance = 0.1 * Math.random() dx = distance } if (this.overlapAvoidanceFactor < 1 && node.shape.radius) { distance = Math.max( 0.1 + this.overlapAvoidanceFactor * node.shape.radius, distance - node.shape.radius ) } let degree = node.edges.length + 1 // the dividing by the distance cubed instead of squared allows us to get the fx and fy components without sines and cosines // it is shorthand for gravityforce with distance squared and fx = dx/distance * gravityForce let gravityForce = (this.options.gravitationalConstant * parentBranch.mass * node.options.mass * degree) / Math.pow(distance, 2) let fx = dx * gravityForce let fy = dy * gravityForce this.physicsBody.forces[node.id].x += fx this.physicsBody.forces[node.id].y += fy } } export default ForceAtlas2BasedRepulsionSolver