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

📄 mgcdistlin3tri3.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                    fR0 = 0.0;                    if ( fSqrDist0 < fSqrDist )                    {                        fSqrDist = fSqrDist0;                        fR = fR0;                        fS = fS0;                        fT = fT0;                    }                }            }        }        else if ( fR <= 1.0 )        {            if ( fS+fT <= 1.0 )            {                if ( fS < 0.0 )                {                    if ( fT < 0.0 )  // region 4                    {                        // min on face s=0 or t=0                        kTriSeg.Origin() = rkTri.Origin();                        kTriSeg.Direction() = rkTri.Edge1();                        fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fT);                        fS = 0.0;                        kTriSeg.Origin() = rkTri.Origin();                        kTriSeg.Direction() = rkTri.Edge0();                        fSqrDist0 = MgcSqrDistance(rkSeg,kTriSeg,&fR0,&fS0);                        fT0 = 0.0;                        if ( fSqrDist0 < fSqrDist )                        {                            fSqrDist = fSqrDist0;                            fR = fR0;                            fS = fS0;                            fT = fT0;                        }                    }                    else  // region 3                    {                        // min on face s=0                        kTriSeg.Origin() = rkTri.Origin();                        kTriSeg.Direction() = rkTri.Edge1();                        fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fT);                        fS = 0.0;                    }                }                else if ( fT < 0.0 )  // region 5                {                    // min on face t=0                    kTriSeg.Origin() = rkTri.Origin();                    kTriSeg.Direction() = rkTri.Edge0();                    fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fS);                    fT = 0.0;                }                else  // region 0                {                    // global minimum is interior, done                    fSqrDist = fR*(fA00*fR+fA01*fS+fA02*fT+2.0*fB0)                          +fS*(fA01*fR+fA11*fS+fA12*fT+2.0*fB1)                          +fT*(fA02*fR+fA12*fS+fA22*fT+2.0*fB2)                          +kDiff.SquaredLength();                }            }            else            {                if ( fS < 0.0 )  // region 2                {                    // min on face s=0 or s+t=1                    kTriSeg.Origin() = rkTri.Origin();                    kTriSeg.Direction() = rkTri.Edge1();                    fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fT);                    fS = 0.0;                    kTriSeg.Origin() = rkTri.Origin()+rkTri.Edge0();                    kTriSeg.Direction() = rkTri.Edge1()-rkTri.Edge0();                    fSqrDist0 = MgcSqrDistance(rkSeg,kTriSeg,&fR0,&fT0);                    fS0 = 1.0-fT0;                    if ( fSqrDist0 < fSqrDist )                    {                        fSqrDist = fSqrDist0;                        fR = fR0;                        fS = fS0;                        fT = fT0;                    }                }                else if ( fT < 0.0 )  // region 6                {                    // min on face t=0 or s+t=1                    kTriSeg.Origin() = rkTri.Origin();                    kTriSeg.Direction() = rkTri.Edge0();                    fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fS);                    fT = 0.0;                    kTriSeg.Origin() = rkTri.Origin()+rkTri.Edge0();                    kTriSeg.Direction() = rkTri.Edge1()-rkTri.Edge0();                    fSqrDist0 = MgcSqrDistance(rkSeg,kTriSeg,&fR0,&fT0);                    fS0 = 1.0-fT0;                    if ( fSqrDist0 < fSqrDist )                    {                        fSqrDist = fSqrDist0;                        fR = fR0;                        fS = fS0;                        fT = fT0;                    }                }                else  // region 1                {                    // min on face s+t=1                    kTriSeg.Origin() = rkTri.Origin()+rkTri.Edge0();                    kTriSeg.Direction() = rkTri.Edge1()-rkTri.Edge0();                    fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fT);                    fS = 1.0-fT;                }            }        }        else  // fR > 1        {            if ( fS+fT <= 1.0 )            {                if ( fS < 0.0 )                {                    if ( fT < 0.0 )  // region 4p                    {                        // min on face s=0 or t=0 or r=1                        kTriSeg.Origin() = rkTri.Origin();                        kTriSeg.Direction() = rkTri.Edge1();                        fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fT);                        fS = 0.0;                        kTriSeg.Origin() = rkTri.Origin();                        kTriSeg.Direction() = rkTri.Edge0();                        fSqrDist0 = MgcSqrDistance(rkSeg,kTriSeg,&fR0,&fS0);                        fT0 = 0.0;                        if ( fSqrDist0 < fSqrDist )                        {                            fSqrDist = fSqrDist0;                            fR = fR0;                            fS = fS0;                            fT = fT0;                        }                        kPt = rkSeg.Origin()+rkSeg.Direction();                        fSqrDist0 = MgcSqrDistance(kPt,rkTri,&fS0,&fT0);                        fR0 = 1.0;                        if ( fSqrDist0 < fSqrDist )                        {                            fSqrDist = fSqrDist0;                            fR = fR0;                            fS = fS0;                            fT = fT0;                        }                    }                    else  // region 3p                    {                        // min on face s=0 or r=1                        kTriSeg.Origin() = rkTri.Origin();                        kTriSeg.Direction() = rkTri.Edge1();                        fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fT);                        fS = 0.0;                        kPt = rkSeg.Origin()+rkSeg.Direction();                        fSqrDist0 = MgcSqrDistance(kPt,rkTri,&fS0,&fT0);                        fR0 = 1.0;                        if ( fSqrDist0 < fSqrDist )                        {                            fSqrDist = fSqrDist0;                            fR = fR0;                            fS = fS0;                            fT = fT0;                        }                    }                }                else if ( fT < 0.0 )  // region 5p                {                    // min on face t=0 or r=1                    kTriSeg.Origin() = rkTri.Origin();                    kTriSeg.Direction() = rkTri.Edge0();                    fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fS);                    fT = 0.0;                    kPt = rkSeg.Origin()+rkSeg.Direction();                    fSqrDist0 = MgcSqrDistance(kPt,rkTri,&fS0,&fT0);                    fR0 = 1.0;                    if ( fSqrDist0 < fSqrDist )                    {                        fSqrDist = fSqrDist0;                        fR = fR0;                        fS = fS0;                        fT = fT0;                    }                }                else  // region 0p                {                    // min face on r=1                    kPt = rkSeg.Origin()+rkSeg.Direction();                    fSqrDist = MgcSqrDistance(kPt,rkTri,&fS,&fT);                    fR = 1.0;                }            }            else            {                if ( fS < 0.0 )  // region 2p                {                    // min on face s=0 or s+t=1 or r=1                    kTriSeg.Origin() = rkTri.Origin();                    kTriSeg.Direction() = rkTri.Edge1();                    fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fT);                    fS = 0.0;                    kTriSeg.Origin() = rkTri.Origin()+rkTri.Edge0();                    kTriSeg.Direction() = rkTri.Edge1()-rkTri.Edge0();                    fSqrDist0 = MgcSqrDistance(rkSeg,kTriSeg,&fR0,&fT0);                    fS0 = 1.0-fT0;                    if ( fSqrDist0 < fSqrDist )                    {                        fSqrDist = fSqrDist0;                        fR = fR0;                        fS = fS0;                        fT = fT0;                    }                    kPt = rkSeg.Origin()+rkSeg.Direction();                    fSqrDist0 = MgcSqrDistance(kPt,rkTri,&fS0,&fT0);                    fR0 = 1.0;                    if ( fSqrDist0 < fSqrDist )                    {                        fSqrDist = fSqrDist0;                        fR = fR0;                        fS = fS0;                        fT = fT0;                    }                }                else if ( fT < 0.0 )  // region 6p                {                    // min on face t=0 or s+t=1 or r=1                    kTriSeg.Origin() = rkTri.Origin();                    kTriSeg.Direction() = rkTri.Edge0();                    fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fS);                    fT = 0.0;                    kTriSeg.Origin() = rkTri.Origin()+rkTri.Edge0();                    kTriSeg.Direction() = rkTri.Edge1()-rkTri.Edge0();                    fSqrDist0 = MgcSqrDistance(rkSeg,kTriSeg,&fR0,&fT0);                    fS0 = 1.0-fT0;                    if ( fSqrDist0 < fSqrDist )                    {                        fSqrDist = fSqrDist0;                        fR = fR0;                        fS = fS0;                        fT = fT0;                    }                    kPt = rkSeg.Origin()+rkSeg.Direction();                    fSqrDist0 = MgcSqrDistance(kPt,rkTri,&fS0,&fT0);                    fR0 = 1.0;                    if ( fSqrDist0 < fSqrDist )                    {                        fSqrDist = fSqrDist0;                        fR = fR0;                        fS = fS0;                        fT = fT0;                    }                }                else  // region 1p                {                    // min on face s+t=1 or r=1                    kTriSeg.Origin() = rkTri.Origin()+rkTri.Edge0();                    kTriSeg.Direction() = rkTri.Edge1()-rkTri.Edge0();                    fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fT);                    fS = 1.0-fT;                    kPt = rkSeg.Origin()+rkSeg.Direction();                    fSqrDist0 = MgcSqrDistance(kPt,rkTri,&fS0,&fT0);                    fR0 = 1.0;                    if ( fSqrDist0 < fSqrDist )                    {                        fSqrDist = fSqrDist0;                        fR = fR0;                        fS = fS0;                        fT = fT0;                    }                }            }        }    }    else    {        // segment and triangle are parallel        kTriSeg.Origin() = rkTri.Origin();        kTriSeg.Direction() = rkTri.Edge0();        fSqrDist = MgcSqrDistance(rkSeg,kTriSeg,&fR,&fS);        fT = 0.0;        kTriSeg.Direction() = rkTri.Edge1();        fSqrDist0 = MgcSqrDistance(rkSeg,kTriSeg,&fR0,&fT0);        fS0 = 0.0;        if ( fSqrDist0 < fSqrDist )        {            fSqrDist = fSqrDist0;            fR = fR0;            fS = fS0;            fT = fT0;        }        kTriSeg.Origin() = rkTri.Origin() + rkTri.Edge0();        kTriSeg.Direction() = rkTri.Edge1() - rkTri.Edge0();        fSqrDist0 = MgcSqrDistance(rkSeg,kTriSeg,&fR0,&fT0);        fS0 = 1.0-fT0;        if ( fSqrDist0 < fSqrDist )        {            fSqrDist = fSqrDist0;            fR = fR0;            fS = fS0;            fT = fT0;        }        fSqrDist0 = MgcSqrDistance(rkSeg.Origin(),rkTri,&fS0,&fT0);        fR0 = 0.0;        if ( fSqrDist0 < fSqrDist )        {            fSqrDist = fSqrDist0;            fR = fR0;            fS = fS0;            fT = fT0;        }        kPt = rkSeg.Origin()+rkSeg.Direction();        fSqrDist0 = MgcSqrDistance(kPt,rkTri,&fS0,&fT0);        fR0 = 1.0;        if ( fSqrDist0 < fSqrDist )        {            fSqrDist = fSqrDist0;            fR = fR0;            fS = fS0;            fT = fT0;        }    }    if ( pfSegP )
        *pfSegP = fR;

    if ( pfTriP0 )
        *pfTriP0 = fS;

    if ( pfTriP1 )
        *pfTriP1 = fT;

    return MgcMath::Abs(fSqrDist);
}//----------------------------------------------------------------------------MgcReal MgcDistance (const MgcLine3& rkLine, const MgcTriangle3& rkTri,
    MgcReal* pfLinP, MgcReal* pfTriP0, MgcReal* pfTriP1)
{
    return MgcMath::Sqrt(MgcSqrDistance(rkLine,rkTri,pfLinP,pfTriP0,
        pfTriP1));
}
//----------------------------------------------------------------------------
MgcReal MgcDistance (const MgcRay3& rkRay, const MgcTriangle3& rkTri,
    MgcReal* pfRayP, MgcReal* pfTriP0, MgcReal* pfTriP1)
{
    return MgcMath::Sqrt(MgcSqrDistance(rkRay,rkTri,pfRayP,pfTriP0,
        pfTriP1));
}
//----------------------------------------------------------------------------
MgcReal MgcDistance (const MgcSegment3& rkSeg, const MgcTriangle3& rkTri,
    MgcReal* pfSegP, MgcReal* pfTriP0, MgcReal* pfTriP1)
{
    return MgcMath::Sqrt(MgcSqrDistance(rkSeg,rkTri,pfSegP,pfTriP0,
        pfTriP1));
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -