📄 mgcdistlin3pgm3.cpp
字号:
}
fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
&fT0);
fR0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
else if ( fS <= 1.0 )
{
if ( fT < 0.0 ) // region 7m
{
// min on face t=0 or r=0
kSegPgm.Origin() = rkPgm.Origin();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fS);
fT = 0.0;
fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
&fT0);
fR0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= 1.0 ) // region 0m
{
// min on face r=0
fSqrDist = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS,
&fT);
fR = 0.0;
}
else // region 3m
{
// min on face t=1 or r=0
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fS);
fT = 1.0;
fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
&fT0);
fR0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
else
{
if ( fT < 0.0 ) // region 8m
{
// min on face s=1 or t=0 or r=0
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fT);
fS = 1.0;
kSegPgm.Origin() = rkPgm.Origin();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fS0);
fT0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
&fT0);
fR0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= 1.0 ) // region 1m
{
// min on face s=1 or r=0
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fT);
fS = 1.0;
fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
&fT0);
fR0 = 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() = rkPgm.Origin()+rkPgm.Edge0();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fT);
fS = 1.0;
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fS0);
fT0 = 1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
&fT0);
fR0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
}
else // fR > 0.0
{
if ( fS < 0.0 )
{
if ( fT < 0.0 ) // region 6p
{
// min on face s=0 or t=0
kSegPgm.Origin() = rkPgm.Origin();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
fS = 0.0;
kSegPgm.Origin() = rkPgm.Origin();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,0,&fS0);
fT0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= 1.0 ) // region 5p
{
// min on face s=0
kSegPgm.Origin() = rkPgm.Origin();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
fS = 0.0;
}
else // region 4p
{
// min on face s=0 or t=1
kSegPgm.Origin() = rkPgm.Origin();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
fS = 0.0;
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,0,&fS0);
fT0 = 1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fS = fS0;
fT = fT0;
}
}
}
else if ( fS <= 1.0 )
{
if ( fT < 0.0 ) // region 7p
{
// min on face t=0
kSegPgm.Origin() = rkPgm.Origin();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fS);
fT = 0.0;
}
else if ( fT <= 1.0 ) // region 0p
{
// ray intersects the parallelogram
fSqrDist = 0.0;
}
else // region 3p
{
// min on face t=1
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fS);
fT = 1.0;
}
}
else
{
if ( fT < 0.0 ) // region 8p
{
// min on face s=1 or t=0
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
fS = 1.0;
kSegPgm.Origin() = rkPgm.Origin();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,0,&fS0);
fT0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= 1.0 ) // region 1p
{
// min on face s=1
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
fS = 1.0;
}
else // region 2p
{
// min on face s=1 or t=1
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
fS = 1.0;
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,0,&fS0);
fT0 = 1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fS = fS0;
fT = fT0;
}
}
}
}
}
else
{
// ray and parallelogram are parallel
kSegPgm.Origin() = rkPgm.Origin();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fS);
fT = 0.0;
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fT0);
fS0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
kSegPgm.Direction() = rkPgm.Edge0();
fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fS0);
fT0 = 1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
kSegPgm.Direction() = rkPgm.Edge1();
fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fT0);
fS0 = 1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,&fT0);
fR0 = 0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
if ( pfRayP )
*pfRayP = fR;
if ( pfPgmP0 )
*pfPgmP0 = fS;
if ( pfPgmP1 )
*pfPgmP1 = fT;
return MgcMath::Abs(fSqrDist);
}
//----------------------------------------------------------------------------
MgcReal MgcSqrDistance (const MgcSegment3& rkSeg,
const MgcParallelogram3& rkPgm, MgcReal* pfSegP, MgcReal* pfPgmP0,
MgcReal* pfPgmP1)
{ MgcVector3 kDiff = rkPgm.Origin() - rkSeg.Origin(); MgcReal fA00 = rkSeg.Direction().SquaredLength(); MgcReal fA01 = -rkSeg.Direction().Dot(rkPgm.Edge0()); MgcReal fA02 = -rkSeg.Direction().Dot(rkPgm.Edge1()); MgcReal fA11 = rkPgm.Edge0().SquaredLength();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -