9 Point TriEdge0 = p1 - p0;
10 Point TriEdge1 = p2 - p0;
12 Point kDiff = p0 - point;
14 float fA01 = TriEdge0 | TriEdge1;
16 float fB0 = kDiff | TriEdge0;
17 float fB1 = kDiff | TriEdge1;
19 float fDet = fabsf(fA00*fA11 - fA01*fA01);
20 float fS = fA01*fB1-fA11*fB0;
21 float fT = fA01*fB0-fA00*fB1;
32 if(-fB0 >= fA00) fSqrDist = fA00+2.0f*fB0+fC;
33 else fSqrDist = fB0*(-fB0/fA00)+fC;
37 if(fB1 >= 0.0
f) fSqrDist = fC;
38 else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC;
39 else fSqrDist = fB1*(-fB1/fA11)+fC;
44 if(fB1 >= 0.0
f) fSqrDist = fC;
45 else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC;
46 else fSqrDist = fB1*(-fB1/fA11)+fC;
51 if(fB0 >= 0.0
f) fSqrDist = fC;
52 else if(-fB0 >= fA00) fSqrDist = fA00+2.0f*fB0+fC;
53 else fSqrDist = fB0*(-fB0/fA00)+fC;
64 float fInvDet = 1.0f/fDet;
67 fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0
f*fB1)+fC;
73 float fTmp0, fTmp1, fNumer, fDenom;
81 fNumer = fTmp1 - fTmp0;
82 fDenom = fA00-2.0f*fA01+fA11;
85 fSqrDist = fA00+2.0f*fB0+fC;
91 fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0
f*fB1)+fC;
96 if(fTmp1 <= 0.0
f) fSqrDist = fA11+2.0f*fB1+fC;
97 else if(fB1 >= 0.0
f) fSqrDist = fC;
98 else fSqrDist = fB1*(-fB1/fA11)+fC;
107 fNumer = fTmp1 - fTmp0;
108 fDenom = fA00-2.0f*fA01+fA11;
111 fSqrDist = fA11+2.0f*fB1+fC;
117 fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0
f*fB1)+fC;
122 if(fTmp1 <= 0.0
f) fSqrDist = fA00+2.0f*fB0+fC;
123 else if(fB0 >= 0.0
f) fSqrDist = fC;
124 else fSqrDist = fB0*(-fB0/fA00)+fC;
129 fNumer = fA11 + fB1 - fA01 - fB0;
132 fSqrDist = fA11+2.0f*fB1+fC;
136 fDenom = fA00-2.0f*fA01+fA11;
139 fSqrDist = fA00+2.0f*fB0+fC;
145 fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0
f*fB1)+fC;
150 return fabsf(fSqrDist);
161 float fA01 = -rkSeg0Direction.
Dot(rkSeg1Direction);
163 float fB0 = kDiff.
Dot(rkSeg0Direction);
165 float fDet = fabsf(fA00*fA11-fA01*fA01);
167 float fB1, fS, fT, fSqrDist, fTmp;
172 fB1 = -kDiff.
Dot(rkSeg1Direction);
173 fS = fA01*fB1-fA11*fB0;
174 fT = fA01*fB0-fA00*fB1;
185 float fInvDet = 1.0f/fDet;
188 fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0
f*fB1)+fC;
193 if(fTmp>=0.0
f) fSqrDist = fA11+2.0f*fB1+fC;
194 else if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp);
195 else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0
f*fB1+fC;
200 if(fB0>=0.0
f) fSqrDist = fC;
201 else if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC;
202 else fSqrDist = fB0*(-fB0/fA00)+fC;
212 if(fTmp>=0.0
f) fSqrDist = fA00+2.0f*fB0+fC;
213 else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp);
214 else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0
f*fB0+fC;
221 if(fTmp>=0.0
f) fSqrDist = fA11+2.0f*fB1+fC;
222 else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0
f*fB1+fC;
227 if(fTmp>=0.0
f) fSqrDist = fA00+2.0f*fB0+fC;
228 else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp);
229 else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0
f*fB0+fC;
237 if(fB0>=0.0
f) fSqrDist = fC;
238 else fSqrDist = fB0*(-fB0/fA00)+fC;
243 if(fTmp>=0.0
f) fSqrDist = fA00+2.0f*fB0+fC;
244 else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp);
245 else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0
f*fB0+fC;
256 if(fB1>=0.0
f) fSqrDist = fC;
257 else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC;
258 else fSqrDist = fB1*(-fB1/fA11)+fC;
265 if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp);
266 else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0
f*fB1+fC;
270 if(fB1>=0.0
f) fSqrDist = fC;
271 else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC;
272 else fSqrDist = fB1*(-fB1/fA11)+fC;
280 if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC;
281 else fSqrDist = fB0*(-fB0/fA00)+fC;
285 if(fB1>=0.0
f) fSqrDist = fC;
286 else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC;
287 else fSqrDist = fB1*(-fB1/fA11)+fC;
302 else if ( -fB0 <= fA00 )
304 fSqrDist = fB0*(-fB0/fA00)+fC;
308 fB1 = -kDiff.
Dot(rkSeg1Direction);
312 fSqrDist = fA00+fA11+fC+2.0f*(fA01+fB0+fB1);
317 fSqrDist = fA00+2.0f*fB0+fC+fT*(fA11*fT+2.0f*(fA01+fB1));
326 fSqrDist = fA00+2.0f*fB0+fC;
328 else if ( fB0 <= 0.0
f )
330 fSqrDist = fB0*(-fB0/fA00)+fC;
334 fB1 = -kDiff.
Dot(rkSeg1Direction);
337 fSqrDist = fA11+2.0f*fB1+fC;
342 fSqrDist = fC+fT*(2.0f*fB1+fA11*fT);
347 return fabsf(fSqrDist);
358 const Point TriEdge0 = p1 - p0;
359 const Point TriEdge1 = p2 - p0;
364 Point kDiff = p0 - rkSegOrigin;
366 float fA01 = -rkSegDirection.
Dot(TriEdge0);
367 float fA02 = -rkSegDirection.
Dot(TriEdge1);
369 float fA12 = TriEdge0.
Dot(TriEdge1);
370 float fA22 = TriEdge1.
Dot(TriEdge1);
371 float fB0 = -kDiff.
Dot(rkSegDirection);
372 float fB1 = kDiff.
Dot(TriEdge0);
373 float fB2 = kDiff.
Dot(TriEdge1);
374 float fCof00 = fA11*fA22-fA12*fA12;
375 float fCof01 = fA02*fA12-fA01*fA22;
376 float fCof02 = fA01*fA12-fA02*fA11;
377 float fDet = fA00*fCof00+fA01*fCof01+fA02*fCof02;
381 float fSqrDist, fSqrDist0;
385 float fCof11 = fA00*fA22-fA02*fA02;
386 float fCof12 = fA02*fA01-fA00*fA12;
387 float fCof22 = fA00*fA11-fA01*fA01;
388 float fInvDet = 1.0f/fDet;
389 float fRhs0 = -fB0*fInvDet;
390 float fRhs1 = -fB1*fInvDet;
391 float fRhs2 = -fB2*fInvDet;
393 float fR = fCof00*fRhs0+fCof01*fRhs1+fCof02*fRhs2;
394 float fS = fCof01*fRhs0+fCof11*fRhs1+fCof12*fRhs2;
395 float fT = fCof02*fRhs0+fCof12*fRhs1+fCof22*fRhs2;
407 kTriSeg.
mDir = TriEdge1;
410 kTriSeg.
mDir = TriEdge0;
412 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
414 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
420 kTriSeg.
mDir = TriEdge1;
423 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
426 else if ( fT < 0.0
f )
430 kTriSeg.
mDir = TriEdge0;
433 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
447 kTriSeg.
mDir = TriEdge1;
450 kTriSeg.
mDir = TriEdge1-TriEdge0;
452 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
454 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
456 else if ( fT < 0.0
f )
460 kTriSeg.
mDir = TriEdge0;
463 kTriSeg.
mDir = TriEdge1-TriEdge0;
465 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
467 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
473 kTriSeg.
mDir = TriEdge1-TriEdge0;
476 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
480 else if ( fR <= 1.0
f )
490 kTriSeg.
mDir = TriEdge1;
493 kTriSeg.
mDir = TriEdge0;
495 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
501 kTriSeg.
mDir = TriEdge1;
505 else if ( fT < 0.0
f )
509 kTriSeg.
mDir = TriEdge0;
515 fSqrDist = fR*(fA00*fR+fA01*fS+fA02*fT+2.0f*fB0)
516 +fS*(fA01*fR+fA11*fS+fA12*fT+2.0
f*fB1)
517 +fT*(fA02*fR+fA12*fS+fA22*fT+2.0f*fB2)
527 kTriSeg.
mDir = TriEdge1;
530 kTriSeg.
mDir = TriEdge1-TriEdge0;
532 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
534 else if ( fT < 0.0
f )
538 kTriSeg.
mDir = TriEdge0;
541 kTriSeg.
mDir = TriEdge1-TriEdge0;
543 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
549 kTriSeg.
mDir = TriEdge1-TriEdge0;
564 kTriSeg.
mDir = TriEdge1;
567 kTriSeg.
mDir = TriEdge0;
569 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
570 kPt = rkSegOrigin+rkSegDirection;
572 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
578 kTriSeg.
mDir = TriEdge1;
580 kPt = rkSegOrigin+rkSegDirection;
582 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
585 else if ( fT < 0.0
f )
589 kTriSeg.
mDir = TriEdge0;
591 kPt = rkSegOrigin+rkSegDirection;
593 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
598 kPt = rkSegOrigin+rkSegDirection;
608 kTriSeg.
mDir = TriEdge1;
611 kTriSeg.
mDir = TriEdge1-TriEdge0;
613 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
614 kPt = rkSegOrigin+rkSegDirection;
616 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
618 else if ( fT < 0.0
f )
622 kTriSeg.
mDir = TriEdge0;
625 kTriSeg.
mDir = TriEdge1-TriEdge0;
627 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
628 kPt = rkSegOrigin+rkSegDirection;
630 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
636 kTriSeg.
mDir = TriEdge1-TriEdge0;
638 kPt = rkSegOrigin+rkSegDirection;
640 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
649 kTriSeg.
mDir = TriEdge0;
652 kTriSeg.
mDir = TriEdge1;
654 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
657 kTriSeg.
mDir = TriEdge1 - TriEdge0;
659 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
662 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
664 kPt = rkSegOrigin+rkSegDirection;
666 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
668 return fabsf(fSqrDist);