📄 wmldistlin3rct3.cpp
字号:
{
// min on face s=0 or t=0 or r=1
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;
}
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist0 = SqrDistance(kPt,rkRct,&fS0,&fT0);
fR0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= (Real)1.0 ) // region 5p
{
// min on face s=0 or r=1
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);
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist0 = SqrDistance(kPt,rkRct,&fS0,&fT0);
fR0 = (Real)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() = 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;
}
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist0 = SqrDistance(kPt,rkRct,&fS0,&fT0);
fR0 = (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 7p
{
// min on face t=0 or r=1
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
fT = (Real)0.0;
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist0 = SqrDistance(kPt,rkRct,&fS0,&fT0);
fR0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= (Real)1.0 ) // region 0p
{
// min on face r=1
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist = SqrDistance(kPt,rkRct,&fS,&fT);
fR = (Real)1.0;
}
else // region 3p
{
// min on face t=1 or r=1
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge1();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
fT = (Real)1.0;
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist0 = SqrDistance(kPt,rkRct,&fS0,&fT0);
fR0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
else
{
if ( fT < (Real)0.0 ) // region 8p
{
// min on face s=1 or t=0 or r=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();
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;
}
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist0 = SqrDistance(kPt,rkRct,&fS0,&fT0);
fR0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
else if ( fT <= (Real)1.0 ) // region 1p
{
// min on face s=1 or r=1
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
fS = (Real)1.0;
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist0 = SqrDistance(kPt,rkRct,&fS0,&fT0);
fR0 = (Real)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() = 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;
}
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist0 = SqrDistance(kPt,rkRct,&fS0,&fT0);
fR0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
}
}
else
{
// segment and rectangle are parallel
kSegPgm.Origin() = rkRct.Origin();
kSegPgm.Direction() = rkRct.Edge0();
fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
fT = (Real)0.0;
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fT0);
fS0 = (Real)0.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
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;
}
kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
kSegPgm.Direction() = rkRct.Edge1();
fSqrDist0 = SqrDistance(rkSeg,kSegPgm,&fR0,&fT0);
fS0 = (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;
}
kPt = rkSeg.Origin()+rkSeg.Direction();
fSqrDist0 = SqrDistance(kPt,rkRct,&fS0,&fT0);
fR0 = (Real)1.0;
if ( fSqrDist0 < fSqrDist )
{
fSqrDist = fSqrDist0;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
if ( pfSegP )
*pfSegP = fR;
if ( pfRctP0 )
*pfRctP0 = fS;
if ( pfRctP1 )
*pfRctP1 = fT;
return Math<Real>::FAbs(fSqrDist);
}
//----------------------------------------------------------------------------
template <class Real>
Real Wml::Distance (const Line3<Real>& rkLine, const Rectangle3<Real>& rkRct,
Real* pfLinP, Real* pfRctP0, Real* pfRctP1)
{
return Math<Real>::Sqrt(SqrDistance(rkLine,rkRct,pfLinP,pfRctP0,pfRctP1));
}
//----------------------------------------------------------------------------
template <class Real>
Real Wml::Distance (const Ray3<Real>& rkRay, const Rectangle3<Real>& rkRct,
Real* pfRayP, Real* pfRctP0, Real* pfRctP1)
{
return Math<Real>::Sqrt(SqrDistance(rkRay,rkRct,pfRayP,pfRctP0,pfRctP1));
}
//----------------------------------------------------------------------------
template <class Real>
Real Wml::Distance (const Segment3<Real>& rkSeg,
const Rectangle3<Real>& rkRct, Real* pfSegP, Real* pfRctP0, Real* pfRctP1)
{
return Math<Real>::Sqrt(SqrDistance(rkSeg,rkRct,pfSegP,pfRctP0,pfRctP1));
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// explicit instantiation
//----------------------------------------------------------------------------
namespace Wml
{
template WML_ITEM float SqrDistance<float> (const Line3<float>&,
const Rectangle3<float>&, float*, float*, float*);
template WML_ITEM float SqrDistance<float> (const Ray3<float>&,
const Rectangle3<float>&, float*, float*, float*);
template WML_ITEM float SqrDistance<float> (const Segment3<float>&,
const Rectangle3<float>&, float*, float*, float*);
template WML_ITEM float Distance<float> (const Line3<float>&,
const Rectangle3<float>&, float*, float*, float*);
template WML_ITEM float Distance<float> (const Ray3<float>&,
const Rectangle3<float>&, float*, float*, float*);
template WML_ITEM float Distance<float> (const Segment3<float>&,
const Rectangle3<float>&, float*, float*, float*);
template WML_ITEM double SqrDistance<double> (const Line3<double>&,
const Rectangle3<double>&, double*, double*, double*);
template WML_ITEM double SqrDistance<double> (const Ray3<double>&,
const Rectangle3<double>&, double*, double*, double*);
template WML_ITEM double SqrDistance<double> (const Segment3<double>&,
const Rectangle3<double>&, double*, double*, double*);
template WML_ITEM double Distance<double> (const Line3<double>&,
const Rectangle3<double>&, double*, double*, double*);
template WML_ITEM double Distance<double> (const Ray3<double>&,
const Rectangle3<double>&, double*, double*, double*);
template WML_ITEM double Distance<double> (const Segment3<double>&,
const Rectangle3<double>&, double*, double*, double*);
}
//----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -