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

📄 wmldistlin3rct3.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        Real fRhs1 = -fB1*fInvDet;
        Real fRhs2 = -fB2*fInvDet;

        fR = fCof00*fRhs0+fCof01*fRhs1+fCof02*fRhs2;
        fS = fCof01*fRhs0+fCof11*fRhs1+fCof12*fRhs2;
        fT = fCof02*fRhs0+fCof12*fRhs1+fCof22*fRhs2;

        if ( fR < (Real)0.0 )
        {
            if ( fS < (Real)0.0 )
            {
                if ( fT < (Real)0.0 )  // region 6m
                {
                    // min on face s=0 or t=0 or r=0
                    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;
                    }
                    fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
                    fR0 = (Real)0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else if ( fT <= (Real)1.0 )  // region 5m
                {
                    // min on face s=0 or r=0
                    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);
                    fR0 = (Real)0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else  // region 4m
                {
                    // min on face s=0 or t=1 or r=0
                    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;
                    }
                    fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
                    fR0 = (Real)0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
            }
            else if ( fS <= (Real)1.0 )
            {
                if ( fT < (Real)0.0 )  // region 7m
                {
                    // min on face t=0 or r=0
                    kSegPgm.Origin() = rkRct.Origin();
                    kSegPgm.Direction() = rkRct.Edge0();
                    fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
                    fT = (Real)0.0;
                    fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
                    fR0 = (Real)0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else if ( fT <= (Real)1.0 )  // region 0m
                {
                    // min on face r=0
                    fSqrDist = SqrDistance(rkSeg.Origin(),rkRct,&fS,&fT);
                    fR = (Real)0.0;
                }
                else  // region 3m
                {
                    // min on face t=1 or r=0
                    kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge1();
                    kSegPgm.Direction() = rkRct.Edge0();
                    fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
                    fT = (Real)1.0;
                    fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
                    fR0 = (Real)0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
            }
            else
            {
                if ( fT < (Real)0.0 )  // region 8m
                {
                    // min on face s=1 or t=0 or r=0
                    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;
                    }
                    fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
                    fR0 = (Real)0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else if ( fT <= (Real)1.0 )  // region 1m
                {
                    // min on face s=1 or r=0
                    kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
                    kSegPgm.Direction() = rkRct.Edge1();
                    fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
                    fS = (Real)1.0;
                    fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
                    fR0 = (Real)0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else  // region 2m
                {
                    // min on face s=1 or t=1 or r=0
                    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;
                    }
                    fSqrDist0 = SqrDistance(rkSeg.Origin(),rkRct,&fS0,&fT0);
                    fR0 = (Real)0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
            }
        }
        else if ( fR <= (Real)1.0 )
        {
            if ( fS < (Real)0.0 )
            {
                if ( fT < (Real)0.0 )  // region 6
                {
                    // min on face s=0 or t=0
                    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;
                    }
                }
                else if ( fT <= (Real)1.0 )  // region 5
                {
                    // min on face s=0
                    kSegPgm.Origin() = rkRct.Origin();
                    kSegPgm.Direction() = rkRct.Edge1();
                    fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
                    fS = (Real)0.0;
                }
                else // region 4
                {
                    // min on face s=0 or t=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;
                    }
                }
            }
            else if ( fS <= (Real)1.0 )
            {
                if ( fT < (Real)0.0 )  // region 7
                {
                    // min on face t=0
                    kSegPgm.Origin() = rkRct.Origin();
                    kSegPgm.Direction() = rkRct.Edge0();
                    fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
                    fT = (Real)0.0;
                }
                else if ( fT <= (Real)1.0 )  // region 0
                {
                    // global minimum is interior
                    fSqrDist = fR*(fA00*fR+fA01*fS+fA02*fT+2.0f*fB0)
                          +fS*(fA01*fR+fA11*fS+2.0f*fB1)
                          +fT*(fA02*fR+fA22*fT+2.0f*fB2)
                          +kDiff.SquaredLength();
                }
                else  // region 3
                {
                    // min on face t=1
                    kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge1();
                    kSegPgm.Direction() = rkRct.Edge0();
                    fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fS);
                    fT = (Real)1.0;
                }
            }
            else
            {
                if ( fT < 0.0 )  // region 8
                {
                    // min on face s=1 or t=0
                    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;
                    }
                }
                else if ( fT <= (Real)1.0 )  // region 1
                {
                    // min on face s=1
                    kSegPgm.Origin() = rkRct.Origin()+rkRct.Edge0();
                    kSegPgm.Direction() = rkRct.Edge1();
                    fSqrDist = SqrDistance(rkSeg,kSegPgm,&fR,&fT);
                    fS = (Real)1.0;
                }
                else  // region 2
                {
                    // min on face s=1 or t=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;
                    }
                }
            }
        }
        else
        {
            if ( fS < (Real)0.0 )
            {
                if ( fT < (Real)0.0 )  // region 6p

⌨️ 快捷键说明

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