/** * Compute the (inward) normal at each node by averaging the unit direction vectors of the two * edges connected to it. */ private void computeNormals() { for (int i = 0, n = nodeList.size(); i < n; i++) { Node prevNode = nodeList.get(i); Node curNode = nodeList.get((i + 1) % n); Node nextNode = nodeList.get((i + 2) % n); Vector2D prevEdge = curNode.getPosition().subtract(prevNode.getPosition()); Vector2D nextEdge = nextNode.getPosition().subtract(curNode.getPosition()); double crossProd = prevEdge.crossMag(nextEdge); Vector2D normal = prevEdge.normalize().subtract(nextEdge.normalize()).scaleTo(Math.signum(crossProd)); normals.put(curNode, normal); } }
public void update() { Vector2D prevVector = main.getPosition().subtract(previous.getPosition()); Vector2D nextVector = next.getPosition().subtract(main.getPosition()); double angleRad = Math.acos(prevVector.dot(nextVector) / (prevVector.norm() * nextVector.norm())); double angle = Math.toDegrees(angleRad); if (prevVector.crossMag(nextVector) > 0) { angle = 360.0 - angle; } double forceMag = ANGLE_CONSTANT * (angle - 90.0); forces.put(previous, prevVector.rotate270().scaleTo(NEIGHBOR_ANGLE_SCALE * forceMag)); forces.put(main, normals.get(main).scaleTo(forceMag)); forces.put(next, nextVector.rotate270().scaleTo(NEIGHBOR_ANGLE_SCALE * forceMag)); }