⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testdistance.cpp

📁 《3D游戏引擎设计》的源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    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 + -