package gl8080.physics.domain.force; import java.util.Objects; import gl8080.physics.domain.ActingForce; import gl8080.physics.domain.Physical; import gl8080.physics.domain.primitive.Force; import gl8080.physics.domain.primitive.Point; import gl8080.physics.domain.primitive.Vector; import gl8080.physics.domain.primitive.Velocity; public class Tension implements ActingForce { private final Point fixdPoint; public Tension(Point fixdPoint) { Objects.requireNonNull(fixdPoint); this.fixdPoint = fixdPoint; } @Override public Force getForce(Physical target) { // 重力と Force gravityForce = this.calcGravityForce(target); // 張力を求めて Force tensionForce = this.calcTensionForce(target); // 2つの合力を返す return gravityForce.add(tensionForce); } private Force calcGravityForce(Physical target) { return new Force(0.0, target.getMass().quantity * -9.8, 0.0); } private Force calcTensionForce(Physical target) { double m = target.getMass().quantity; double g = 9.8; Vector op = Vector.create(this.fixdPoint, target.getLocation()); Velocity v = target.getVelocity(); double vv = v.x*v.x + v.y*v.y + v.z*v.z; double opop = op.x*op.x + op.y*op.y + op.z*op.z; double k = m * (g*op.y - vv) / opop; double fx = k * op.x; double fy = k * op.y; double fz = k * op.z; return new Force(fx, fy, fz); } }