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