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 CentripetalForce implements ActingForce {
private final Point center;
public CentripetalForce(Point center) {
Objects.requireNonNull(center);
this.center = center;
}
@Override
public Force getForce(Physical target) {
Point p = target.getLocation();
// 力の大きさを求める
double rx = this.center.x - p.x;
double ry = this.center.y - p.y;
double rz = this.center.z - p.z;
double r = Math.sqrt(rx*rx + ry*ry + rz*rz);
Velocity v = target.getVelocity();
double vv = v.x*v.x + v.y*v.y + v.z*v.z;
double m = target.getMass().quantity;
double quantityOfForce = m * vv / r;
// po ベクトルを求め
Vector po = Vector.create(p, this.center);
// 正規化し
Vector e = po.normalize();
// 力の大きさを掛ける
Vector f = e.multiply(quantityOfForce);
return new Force(f.x, f.y, f.z);
}
}