text: import BarnesHutSolver from "./BarnesHutSolver"
  
  class ForceAtlas2BasedRepulsionSolver extends BarnesHutSolver {
    constructor(body, physicsBody, options) {
      super(body, physicsBody, options);
    }
  
    /**
     * Calculate the forces based on the distance.
     *
     * @param distance
     * @param dx
     * @param dy
     * @param node
     * @param 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;
  