package spimedb.util.geom;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
import spimedb.util.math.InterpolateStrategy;
import java.io.Serializable;
/**
* Created by me on 6/13/15.
*/
@JsonIgnoreType
public interface XYZ extends Serializable {
float x();
float y();
float z();
default XYZ interpolateTo(XYZ v, float f) {
return new Vec3D(x() + (v.x() - x()) * f, y() + (v.y() - y()) * f, z()
+ (v.z() - z()) * f);
}
default XYZ interpolateTo(XYZ v, float f,
InterpolateStrategy s) {
return new Vec3D(s.interpolate(x(), v.x(), f),
s.interpolate(y(), v.y(), f), s.interpolate(z(), v.z(), f));
}
default Vec3D interpolateTo(Vec3D v, float f) {
return new Vec3D(x() + (v.x - x()) * f, y() + (v.y - y()) * f, z() + (v.z - z())
* f);
}
default XYZ interpolateTo(Vec3D v, float f, InterpolateStrategy s) {
return new Vec3D(s.interpolate(x(), v.x, f), s.interpolate(y(), v.y, f),
s.interpolate(z(), v.z, f));
}
default Vec3D scale(float s) {
return new Vec3D(x() * s, y() * s, z() * s);
}
default Vec3D sub(XYZ v) {
return new Vec3D(x() - v.x(), y() - v.y(), z() - v.z());
}
default float distanceTo(XYZ v) {
if (v != null) {
final float dx = x() - v.x();
final float dy = y() - v.y();
final float dz = z() - v.z();
return (float) Math.sqrt(dx * dx + dy * dy + dz * dz);
} else {
return Float.NaN;
}
}
default float distanceToSquared(roVec3D v) {
if (v != null) {
final float dx = x() - v.x();
final float dy = y() - v.y();
final float dz = z() - v.z();
return dx * dx + dy * dy + dz * dz;
} else {
return Float.NaN;
}
}
/*
* (non-Javadoc)
*
* @see toxi.geom.ReadonlyVec3D#getNormalized()
*/
default Vec3D getNormalized() {
return new Vec3D(this).normalize();
}
/*
* (non-Javadoc)
*
* @see toxi.geom.ReadonlyVec3D#isInAABB(toxi.geom.AABB)
*/
default boolean isInAABB(final BB box) {
return box.contains(this);
}
default float magnitude() {
return (float) Math.sqrt(magSquared());
}
default float magSquared() {
final float x = x();
final float y = y();
final float z = z();
return x*x + y*y + z*z;
}
default XYZ copy() { return new Vec3D(this); }
default float volume() {
return x() * y() * z();
}
}