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.0f )
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.0f )
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.0f )
490 kTriSeg.
mDir = TriEdge1;
493 kTriSeg.
mDir = TriEdge0;
495 if(fSqrDist0<fSqrDist) fSqrDist = fSqrDist0;
501 kTriSeg.
mDir = TriEdge1;
505 else if ( fT < 0.0f )
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.0f*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.0f )
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.0f )
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.0f )
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);