package am2.api.math;
public class AMPlane {
AMVector3 planeDef[];
public AMPlane(AMVector3...plane){
planeDef = plane;
}
private AMVector3 planeNormal(){
AMVector3 vVector1 = new AMVector3(planeDef[2], planeDef[0]);
AMVector3 vVector2 = new AMVector3(planeDef[1], planeDef[0]);
AMVector3 vNormal = AMVector3.crossProduct(vVector1, vVector2);
vNormal.normalize();
return vNormal;
}
private float planeDistance(AMVector3 normal, AMVector3 point){
float distance = 0;
distance = - ((normal.x * point.x) + (normal.y * point.y) + (normal.z * point.z));
return distance;
}
public boolean lineSegmentCrosses(AMVector3 p1, AMVector3 p2){
float distance1=0, distance2=0;
AMVector3 vNormal = planeNormal();
float originDistance = planeDistance(vNormal, planeDef[0]);
distance1 = ((vNormal.x * p1.x) + // Ax +
(vNormal.y * p1.y) + // Bx +
(vNormal.z * p1.z)) + originDistance; // Cz + D
distance2 = ((vNormal.x * p2.x) + // Ax +
(vNormal.y * p2.y) + // Bx +
(vNormal.z * p2.z)) + originDistance; // Cz + D
if(distance1 * distance2 >= 0) // Check to see if both point's distances are both negative or both positive
return false; // Return false if each point has the same sign. -1 and 1 would mean each point is on either side of the plane. -1 -2 or 3 4 wouldn't...
return true; // The line intersected the plane, Return TRUE
}
}