📄 testdistance.cpp
字号:
MgcVector3 kP0, kP1, kDiff;
MgcReal fS, fT, fS0, fT0, fMin0, fMin1, fDist;
MgcReal fMaxDiff = 0.0;
for (int i = 0; i < 128; i++)
{
rkSeg.Origin() = MgcVector3(RAND,RAND,RAND);
rkSeg.Direction() = MgcVector3(RAND,RAND,RAND);
rkLine.Origin() = MgcVector3(RAND,RAND,RAND);
if ( i % 2 )
{
// non-parallel line segments
rkLine.Direction() = MgcVector3(RAND,RAND,RAND);
}
else
{
// parallel line segments
rkLine.Direction() = RAND*rkSeg.Direction();
}
MgcVector3 kUnit = rkLine.Direction();
kUnit.Unitize();
fMin0 = MgcMath::INFINITY;
int iYMax = 128, iXMax = 128;
for (int iY = 0; iY < iYMax; iY++)
{
fS0 = -4.0 + 8.0*iY/MgcReal(iYMax-1);
kP0 = rkLine.Origin()+fS0*kUnit;
for (int iX = 0; iX < iXMax; iX++)
{
fT0 = iX/MgcReal(iXMax-1);
kP1 = rkSeg.Origin()+fT0*rkSeg.Direction();
kDiff = kP1-kP0;
fDist = kDiff.Length();
if ( fDist < fMin0 )
{
fMin0 = fDist;
fS = fS0;
fT = fT0;
}
}
}
ostr << "sampled = " << fS << ' ' << fT << ' ' << fMin0 << endl;
fMin1 = MgcDistance(rkLine,rkSeg,&fS,&fT);
ostr << "analytic = " << fS << ' ' << fT << ' ' << fMin1 << endl;
MgcReal fCompDiff = fMin1-fMin0;
ostr << "diff = " << fCompDiff << endl;
if ( fCompDiff > fMaxDiff )
fMaxDiff = fCompDiff;
ostr << endl;
}
ostr << "max diff = " << fMaxDiff << endl;
}
//----------------------------------------------------------------------------
void TestDistRay3Seg3 ()
{
ofstream ostr("data.txt");
MgcSegment3 rkSeg;
MgcRay3 rkRay;
MgcVector3 kP0, kP1, kDiff;
MgcReal fS, fT, fS0, fT0, fMin0, fMin1, fDist;
MgcReal fMaxDiff = 0.0;
for (int i = 0; i < 128; i++)
{
rkSeg.Origin() = MgcVector3(RAND,RAND,RAND);
rkSeg.Direction() = MgcVector3(RAND,RAND,RAND);
rkRay.Origin() = MgcVector3(RAND,RAND,RAND);
if ( i % 2 )
{
// non-parallel line segments
rkRay.Direction() = MgcVector3(RAND,RAND,RAND);
}
else
{
// parallel line segments
rkRay.Direction() = RAND*rkSeg.Direction();
}
MgcVector3 kUnit = rkRay.Direction();
kUnit.Unitize();
fMin0 = MgcMath::INFINITY;
int iYMax = 128, iXMax = 128;
for (int iY = 0; iY < iYMax; iY++)
{
fS0 = 8.0*iY/MgcReal(iYMax-1);
kP0 = rkRay.Origin()+fS0*kUnit;
for (int iX = 0; iX < iXMax; iX++)
{
fT0 = iX/MgcReal(iXMax-1);
kP1 = rkSeg.Origin()+fT0*rkSeg.Direction();
kDiff = kP1-kP0;
fDist = kDiff.Length();
if ( fDist < fMin0 )
{
fMin0 = fDist;
fS = fS0;
fT = fT0;
}
}
}
ostr << "sampled = " << fS << ' ' << fT << ' ' << fMin0 << endl;
fMin1 = MgcDistance(rkRay,rkSeg,&fS,&fT);
ostr << "analytic = " << fS << ' ' << fT << ' ' << fMin1 << endl;
MgcReal fCompDiff = fMin1-fMin0;
ostr << "diff = " << fCompDiff << endl;
if ( fCompDiff > fMaxDiff )
fMaxDiff = fCompDiff;
ostr << endl;
}
ostr << "max diff = " << fMaxDiff << endl;
}
//----------------------------------------------------------------------------
void TestDistSeg3Tri3 ()
{
ofstream ostr("data.txt");
MgcTriangle3 kTri;
MgcSegment3 kSeg;
MgcVector3 kP, kQ, kDiff;
MgcReal fR, fS, fT, fR0, fS0, fT0, fMin0, fMin1, fDist;
MgcReal fMaxDiff = 0.0;
for (int i = 0; i < 128; i++)
{
kTri.Origin() = MgcVector3(RAND,RAND,RAND);
kTri.Edge0() = MgcVector3(RAND,RAND,RAND);
kTri.Edge1() = MgcVector3(RAND,RAND,RAND);
kSeg.Origin() = MgcVector3(RAND,RAND,RAND);
if ( i % 2 )
{
// non-parallel segment and triangle
kSeg.Direction() = MgcVector3(RAND,RAND,RAND);
}
else
{
// segment is parallel to triangle
kSeg.Direction() = RAND*kTri.Edge0()+RAND*kTri.Edge1();
}
fMin0 = MgcMath::INFINITY;
int iMax = 32;
for (int iZ = 0; iZ <= iMax; iZ++)
{
fR0 = iZ/MgcReal(iMax);
kP = kSeg.Origin()+fR0*kSeg.Direction();
for (int iY = 0; iY <= iMax; iY++)
{
fS0 = iY/MgcReal(iMax);
for (int iX = 0; iX+iY <= iMax; iX++)
{
fT0 = iX/MgcReal(iMax);
kQ = kTri.Origin()+fS0*kTri.Edge0()+fT0*kTri.Edge1();
kDiff = kP-kQ;
fDist = kDiff.Length();
if ( fDist < fMin0 )
{
fMin0 = fDist;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
}
ostr << "i = " << i << endl;
ostr << "sampled = " << fR << ' ' << fS << ' ' << fT << ' '
<< fMin0 << endl;
fMin1 = MgcDistance(kSeg,kTri,&fR,&fS,&fT);
ostr << "analytic = " << fR << ' ' << fS << ' ' << fT << ' '
<< fMin1 << endl;
ostr << "diff = " << fMin1-fMin0 << endl;
if ( fMin1-fMin0 > fMaxDiff )
fMaxDiff = fMin1-fMin0;
ostr << endl;
}
ostr << "max diff = " << fMaxDiff << endl;
}
//----------------------------------------------------------------------------
void TestDistSeg3Pgm3 ()
{
ofstream ostr("data.txt");
MgcParallelogram3 kPgm;
MgcSegment3 kSeg;
MgcVector3 kP, kQ, kDiff;
MgcReal fR, fS, fT, fR0, fS0, fT0, fMin0, fMin1, fDist;
MgcReal fMaxDiff = 0.0;
for (int i = 0; i < 128; i++)
{
kPgm.Origin() = MgcVector3(RAND,RAND,RAND);
kPgm.Edge0() = MgcVector3(RAND,RAND,RAND);
kPgm.Edge1() = MgcVector3(RAND,RAND,RAND);
kSeg.Origin() = MgcVector3(RAND,RAND,RAND);
if ( i % 2 )
{
// non-parallel segment and parallelogram
kSeg.Direction() = MgcVector3(RAND,RAND,RAND);
}
else
{
// segment is parallel to parallelogram
kSeg.Direction() = RAND*kPgm.Edge0()+RAND*kPgm.Edge1();
}
fMin0 = MgcMath::INFINITY;
int iMax = 32;
for (int iZ = 0; iZ <= iMax; iZ++)
{
fR0 = iZ/MgcReal(iMax);
kP = kSeg.Origin()+fR0*kSeg.Direction();
for (int iY = 0; iY <= iMax; iY++)
{
fS0 = iY/MgcReal(iMax);
for (int iX = 0; iX <= iMax; iX++)
{
fT0 = iX/MgcReal(iMax);
kQ = kPgm.Origin()+fS0*kPgm.Edge0()+fT0*kPgm.Edge1();
kDiff = kP-kQ;
fDist = kDiff.Length();
if ( fDist < fMin0 )
{
fMin0 = fDist;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
}
ostr << "i = " << i << endl;
ostr << "sampled = " << fR << ' ' << fS << ' ' << fT << ' '
<< fMin0 << endl;
fMin1 = MgcDistance(kSeg,kPgm,&fR,&fS,&fT);
ostr << "analytic = " << fR << ' ' << fS << ' ' << fT << ' '
<< fMin1 << endl;
ostr << "diff = " << fMin1-fMin0 << endl;
if ( fMin1-fMin0 > fMaxDiff )
fMaxDiff = fMin1-fMin0;
ostr << endl;
}
ostr << "max diff = " << fMaxDiff << endl;
}
//----------------------------------------------------------------------------
void TestDistSeg3Rct3 ()
{
ofstream ostr("data.txt");
MgcRectangle3 kRct;
MgcSegment3 kSeg;
MgcVector3 kP, kQ, kDiff;
MgcReal fR, fS, fT, fR0, fS0, fT0, fMin0, fMin1, fDist;
MgcReal fMaxDiff = 0.0;
for (int i = 0; i < 128; i++)
{
kRct.Origin() = MgcVector3(RAND,RAND,RAND);
kRct.Edge0() = MgcVector3(RAND,RAND,RAND);
MgcVector3::GenerateOrthonormalBasis(kP,kQ,kRct.Edge0(),false);
kRct.Edge1() = kP;
kSeg.Origin() = MgcVector3(RAND,RAND,RAND);
if ( i % 2 )
{
// non-parallel segment and parallelogram
kSeg.Direction() = MgcVector3(RAND,RAND,RAND);
}
else
{
// segment is parallel to parallelogram
kSeg.Direction() = RAND*kRct.Edge0() + RAND*kRct.Edge1();
}
fMin0 = MgcMath::INFINITY;
int iMax = 32;
for (int iZ = 0; iZ <= iMax; iZ++)
{
fR0 = iZ/MgcReal(iMax);
kP = kSeg.Origin()+fR0*kSeg.Direction();
for (int iY = 0; iY <= iMax; iY++)
{
fS0 = iY/MgcReal(iMax);
for (int iX = 0; iX <= iMax; iX++)
{
fT0 = iX/MgcReal(iMax);
kQ = kRct.Origin()+fS0*kRct.Edge0()+fT0*kRct.Edge1();
kDiff = kP-kQ;
fDist = kDiff.Length();
if ( fDist < fMin0 )
{
fMin0 = fDist;
fR = fR0;
fS = fS0;
fT = fT0;
}
}
}
}
ostr << "i = " << i << endl;
ostr << "sampled = " << fR << ' ' << fS << ' ' << fT << ' '
<< fMin0 << endl;
fMin1 = MgcDistance(kSeg,kRct,&fR,&fS,&fT);
ostr << "analytic = " << fR << ' ' << fS << ' ' << fT << ' '
<< fMin1 << endl;
ostr << "diff = " << fMin1-fMin0 << endl;
if ( fMin1-fMin0 > fMaxDiff )
fMaxDiff = fMin1-fMin0;
ostr << endl;
}
ostr << "max diff = " << fMaxDiff << endl;
}
//----------------------------------------------------------------------------
void TestDistTri3Tri3 ()
{
ofstream ostr("data.txt");
MgcTriangle3 kTri0, kTri1;
MgcVector3 kP, kQ, kDiff;
MgcReal fU, fV, fS, fT, fU0, fV0, fS0, fT0, fMin0, fMin1, fDist;
MgcReal fMaxDiff = 0.0;
for (int i = 0; i < 128; i++)
{
kTri0.Origin() = MgcVector3(RAND,RAND,RAND);
kTri0.Edge0() = MgcVector3(RAND,RAND,RAND);
kTri0.Edge1() = MgcVector3(RAND,RAND,RAND);
kTri1.Origin() = MgcVector3(RAND,RAND,RAND);
kTri1.Edge0() = MgcVector3(RAND,RAND,RAND);
kTri1.Edge1() = MgcVector3(RAND,RAND,RAND);
fMin0 = MgcMath::INFINITY;
int iMax = 32;
for (int iW = 0; iW <= iMax; iW++)
{
fT0 = iW/MgcReal(iMax);
for (int iZ = 0; iW+iZ <= iMax; iZ++)
{
fS0 = iZ/MgcReal(iMax);
kP = kTri0.Origin()+fS0*kTri0.Edge0()+fT0*kTri0.Edge1();
for (int iY = 0; iY <= iMax; iY++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -