package tc.oc.commons.bukkit.geometry;
import org.bukkit.util.Vector;
import tc.oc.commons.core.util.Numbers;
/**
* A 3D solid consisting of all points within a given distance from a {@link LineSegment}.
*
* Can also be defined as a {@link Sphere} swept along a {@link LineSegment},
* making it useful for representing moving spheres.
*/
public class Capsule {
private final LineSegment center;
private final double radius, radiusSquared;
private Capsule(LineSegment center, double radius) {
this.center = center;
this.radius = radius;
this.radiusSquared = radius * radius;
}
public static Capsule fromCenterAndRadius(LineSegment center, double radius) {
return new Capsule(center, radius);
}
public static Capsule fromEndpointsAndRadius(Vector start, Vector finish, double radius) {
return fromCenterAndRadius(LineSegment.between(start, finish), radius);
}
public static Capsule fromSweptSphere(Sphere sphere, Vector delta) {
return new Capsule(LineSegment.from(sphere.center(), delta), sphere.radius());
}
/**
* Line segment at the center of the capsule
*/
public LineSegment center() {
return center;
}
/**
* Distance from the {@link #center()} to the boundary of the capsule
*/
public double radius() {
return radius;
}
public double radiusSquared() {
return radiusSquared;
}
public boolean intersects(Vector point) {
return center.distanceSquared(point) <= radiusSquared;
}
public boolean intersects(Sphere sphere) {
return center.distanceSquared(sphere.center()) <= Numbers.square(radius + sphere.radius());
}
}