372 Chapter 10 Distance in 3D
float xMinusASq, yMinusBSq, zMinusCSq;
float xNextMinusASq, yNextMinusBSq, zNextMinusCSq;
xMinusA = vertices[0].x - p.x;
yMinusB = vertices[0].y - p.y;
zMinusC = vertices[0].z - p.z;
xMinusASq = xMinusA * xMinusA;
yMinusBSq = yMinusB * yMinusB;
zMinusCSq = zMinusC * zMinusC;
xNextMinusA = vertices[1].x - p.x;
yNextMinusB = vertices[1].y - p.y;
zNextMinusC = vertices[1].z - p.z;
xNextMinusASq = xNextMinusA * xMNextinusA;
yNextMinusBSq = yNextMinusB * yNextMinusB;
zNextMinusCSq = zNextMinusC * zNextMinusC;
// Compute distance to first segment
Line l = { vertices[i], vertices[i+1] - vertices[i] };
float t;
dSq = PointLineDistanceSquared3D(p, l, FALSE, t)
// If closest point not on segment, check appropriate end point
if(t<0){
dSq = MIN(dsq, xMinusASq + yMinusBSq + zMinusCSq);
} else if (t > 1) {
dSq = MIN(dsq, xNextMinusASq + yNextMinusBSq + zNextMinusCSq);
}
// Go through each successive segment, rejecting if possible,
// and computing the distance squared if not rejected.
for (i = 1; i < nSegments - 1; i++) {
// Rejection test
if (((Abs(xMinusASq) > dSq) && (Abs(xNextMinusASq) <= dSq)
&& (xMinusA * xNextMinusA > 0)) ||
((Abs(yMinusBSq) > dSq) && (Abs(yNextMinusBSq) <= dSq)
&& (yMinusB * yNextMinusB > 0)) ||
((Abs(zMinusCSq) > dSq) && (Abs(zNextMinusCSq) <= dSq)
&& (zMinusC * zNextMinusC > 0))) {
if (i != nSegments - 2) {