Graphics Reference
In-Depth Information
In fact, these six dot products, d1 to d6 , can be used to compute the snom , sdenom ,
tnom , tdenom , unom , and udenom terms as well:
float snom = d1;
float sdenom = -d3;
float tnom = d2;
float tdenom = -d6;
float unom = d4 - d3;
float udenom = d5 - d6;
The vector n is no longer needed. This allows the code to be optimized to the final
version.
Point ClosestPtPointTriangle(Point p, Point a, Point b, Point c)
{
// Check if P in vertex region outside A
Vector ab=b-a;
Vector ac=c-a;
Vector ap=p-a;
float d1 = Dot(ab, ap);
float d2 = Dot(ac, ap);
if (d1 <= 0.0f && d2 <= 0.0f) return a;
// barycentric coordinates (1,0,0)
// Check if P in vertex region outside B
Vector bp=p-b;
float d3 = Dot(ab, bp);
float d4 = Dot(ac, bp);
if (d3 >= 0.0f && d4 <= d3) return b;
// barycentric coordinates (0,1,0)
// Check if P in edge region of AB, if so return projection of P onto AB
float vc = d1*d4 - d3*d2;
if (vc <= 0.0f && d1 >= 0.0f && d3 <= 0.0f) {
floatv=d1/(d1-d3);
returna+v*ab; // barycentric coordinates (1-v,v,0)
}
// Check if P in vertex region outside C
Vector cp=p-c;
float d5 = Dot(ab, cp);
float d6 = Dot(ac, cp);
if (d6 >= 0.0f && d5 <= d6) return c;
// barycentric coordinates (0,0,1)
 
Search WWH ::




Custom Search