📄 wmldistlin3rct3.cpp
字号:
Real fRhs1 = -fB1*fInvDet;
Real fRhs2 = -fB2*fInvDet;
fR = fCof00*fRhs0+fCof01*fRhs1+fCof02*fRhs2;
fS = fCof01*fRhs0+fCof11*fRhs1+fCof12*fRhs2;
fT = fCof02*fRhs0+fCof12*fRhs1+fCof22*fRhs2;
if ( fR < (Real)0.0 )
{
if ( fS < (Real)0.0 )
{
if ( fT < (Real)0.0 ) // region 6m
{
// min on face s=0 or t=0 or r=0
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)0.0;
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fS0);
fT0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
fR0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= (Real)1.0 ) // region 5m
{
// min on face s=0 or r=0
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)0.0;
fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
fR0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else // region 4m
{
// min on face s=0 or t=1 or r=0
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)0.0;
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge1();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fS0);
fT0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
fR0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
else if ( fS <= (Real)1.0 )
{
if ( fT < (Real)0.0 ) // region 7m
{
// min on face t=0 or r=0
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
fT = (Real)0.0;
fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
fR0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= (Real)1.0 ) // region 0m
{
// min on face r=0
fSqrDist = SqrDistance(rkSeg.Origin(),rkRct,&fS,&fT);
fR = (Real)0.0;
}
else // region 3m
{
// min on face t=1 or r=0
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge1();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
fT = (Real)1.0;
fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
fR0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
else
{
if ( fT < (Real)0.0 ) // region 8m
{
// min on face s=1 or t=0 or r=0
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)1.0;
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fS0);
fT0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
fR0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= (Real)1.0 ) // region 1m
{
// min on face s=1 or r=0
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)1.0;
fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
fR0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else // region 2m
{
// min on face s=1 or t=1 or r=0
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)1.0;
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge1();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fS0);
fT0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
fR0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
}
else if ( fR <= (Real)1.0 )
{
if ( fS < (Real)0.0 )
{
if ( fT < (Real)0.0 ) // region 6
{
// min on face s=0 or t=0
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)0.0;
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fS0);
fT0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= (Real)1.0 ) // region 5
{
// min on face s=0
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)0.0;
}
else // region 4
{
// min on face s=0 or t=1
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)0.0;
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge1();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fS0);
fT0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
else if ( fS <= (Real)1.0 )
{
if ( fT < (Real)0.0 ) // region 7
{
// min on face t=0
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
fT = (Real)0.0;
}
else if ( fT <= (Real)1.0 ) // region 0
{
// global minimum is interior
fSqrDist = fR*(fA00*fR+fA01*fS+fA02*fT+2.0f*fB0)
+fS*(fA01*fR+fA11*fS+2.0f*fB1)
+fT*(fA02*fR+fA22*fT+2.0f*fB2)
+kDiff.SquaredLength();
}
else // region 3
{
// min on face t=1
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge1();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
fT = (Real)1.0;
}
}
else
{
if ( fT < 0.0 ) // region 8
{
// min on face s=1 or t=0
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)1.0;
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fS0);
fT0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= (Real)1.0 ) // region 1
{
// min on face s=1
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)1.0;
}
else // region 2
{
// min on face s=1 or t=1
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)1.0;
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge1();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fS0);
fT0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
}
else
{
if ( fS < (Real)0.0 )
{
if ( fT < (Real)0.0 ) // region 6p
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -