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

📄 wmlintpakimauniform3.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        return afSlope[1];
    }
}
//----------------------------------------------------------------------------
template <class Real>
void IntpAkimaUniform3<Real>::Construct (Polynomial& rkPoly,
    Real aaafF[2][2][2], Real aaafFX[2][2][2], Real aaafFY[2][2][2],
    Real aaafFZ[2][2][2], Real aaafFXY[2][2][2], Real aaafFXZ[2][2][2],
    Real aaafFYZ[2][2][2], Real aaafFXYZ[2][2][2])
{
    Real fDX = m_fXSpacing, fDY = m_fYSpacing, fDZ = m_fZSpacing;
    Real fInvDX = ((Real)1.0)/fDX, fInvDX2 = fInvDX*fInvDX;
    Real fInvDY = ((Real)1.0)/fDY, fInvDY2 = fInvDY*fInvDY;
    Real fInvDZ = ((Real)1.0)/fDZ, fInvDZ2 = fInvDZ*fInvDZ;
    Real fB0, fB1, fB2, fB3, fB4, fB5, fB6, fB7;

    rkPoly.A(0,0,0) = aaafF[0][0][0];
    rkPoly.A(1,0,0) = aaafFX[0][0][0];
    rkPoly.A(0,1,0) = aaafFY[0][0][0];
    rkPoly.A(0,0,1) = aaafFZ[0][0][0];
    rkPoly.A(1,1,0) = aaafFXY[0][0][0];
    rkPoly.A(1,0,1) = aaafFXZ[0][0][0];
    rkPoly.A(0,1,1) = aaafFYZ[0][0][0];
    rkPoly.A(1,1,1) = aaafFXYZ[0][0][0];

    // solve for Aij0
    fB0 = (aaafF[1][0][0] - rkPoly(0,0,0,fDX,(Real)0.0,(Real)0.0))*fInvDX2;
    fB1 = (aaafFX[1][0][0] - rkPoly(1,0,0,fDX,(Real)0.0,(Real)0.0))*fInvDX;
    rkPoly.A(2,0,0) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(3,0,0) = (-((Real)2.0)*fB0 + fB1)*fInvDX;

    fB0 = (aaafF[0][1][0] - rkPoly(0,0,0,(Real)0.0,fDY,(Real)0.0))*fInvDY2;
    fB1 = (aaafFY[0][1][0] - rkPoly(0,1,0,(Real)0.0,fDY,(Real)0.0))*fInvDY;
    rkPoly.A(0,2,0) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(0,3,0) = (-((Real)2.0)*fB0 + fB1)*fInvDY;

    fB0 = (aaafFY[1][0][0] - rkPoly(0,1,0,fDX,(Real)0.0,(Real)0.0))*fInvDX2;
    fB1 = (aaafFXY[1][0][0] - rkPoly(1,1,0,fDX,(Real)0.0,(Real)0.0))*fInvDX;
    rkPoly.A(2,1,0) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(3,1,0) = (-((Real)2.0)*fB0 + fB1)*fInvDX;

    fB0 = (aaafFX[0][1][0] - rkPoly(1,0,0,(Real)0.0,fDY,(Real)0.0))*fInvDY2;
    fB1 = (aaafFXY[0][1][0] - rkPoly(1,1,0,(Real)0.0,fDY,(Real)0.0))*fInvDY;
    rkPoly.A(1,2,0) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(1,3,0) = (-((Real)2.0)*fB0 + fB1)*fInvDY;

    fB0 = (aaafF[1][1][0] - rkPoly(0,0,0,fDX,fDY,(Real)0.0))*fInvDX2*fInvDY2;
    fB1 = (aaafFX[1][1][0] - rkPoly(1,0,0,fDX,fDY,(Real)0.0))*fInvDX*fInvDY2;
    fB2 = (aaafFY[1][1][0] - rkPoly(0,1,0,fDX,fDY,(Real)0.0))*fInvDX2*fInvDY;
    fB3 = (aaafFXY[1][1][0] - rkPoly(1,1,0,fDX,fDY,(Real)0.0))*fInvDX*fInvDY;
    rkPoly.A(2,2,0) = ((Real)9.0)*fB0 - ((Real)3.0)*fB1 - ((Real)3.0)*fB2
        + fB3;
    rkPoly.A(3,2,0) = (-((Real)6.0)*fB0 + ((Real)3.0)*fB1 + ((Real)2.0)*fB2
        - fB3)*fInvDX;
    rkPoly.A(2,3,0) = (-((Real)6.0)*fB0 + ((Real)2.0)*fB1 + ((Real)3.0)*fB2
        - fB3)*fInvDY;
    rkPoly.A(3,3,0) = (((Real)4.0)*fB0 - ((Real)2.0)*fB1 - ((Real)2.0)*fB2
        + fB3)*fInvDX*fInvDY;

    // solve for Ai0k
    fB0 = (aaafF[0][0][1] - rkPoly(0,0,0,(Real)0.0,(Real)0.0,fDZ))*fInvDZ2;
    fB1 = (aaafFZ[0][0][1] - rkPoly(0,0,1,(Real)0.0,(Real)0.0,fDZ))*fInvDZ;
    rkPoly.A(0,0,2) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(0,0,3) = (-((Real)2.0)*fB0 + fB1)*fInvDZ;

    fB0 = (aaafFZ[1][0][0] - rkPoly(0,0,1,fDX,(Real)0.0,(Real)0.0))*fInvDX2;
    fB1 = (aaafFXZ[1][0][0] - rkPoly(1,0,1,fDX,(Real)0.0,(Real)0.0))*fInvDX;
    rkPoly.A(2,0,1) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(3,0,1) = (-((Real)2.0)*fB0 + fB1)*fInvDX;

    fB0 = (aaafFX[0][0][1] - rkPoly(1,0,0,(Real)0.0,(Real)0.0,fDZ))*fInvDZ2;
    fB1 = (aaafFXZ[0][0][1] - rkPoly(1,0,1,(Real)0.0,(Real)0.0,fDZ))*fInvDZ;
    rkPoly.A(1,0,2) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(1,0,3) = (-((Real)2.0)*fB0 + fB1)*fInvDZ;

    fB0 = (aaafF[1][0][1] - rkPoly(0,0,0,fDX,(Real)0.0,fDZ))*fInvDX2*fInvDZ2;
    fB1 = (aaafFX[1][0][1] - rkPoly(1,0,0,fDX,(Real)0.0,fDZ))*fInvDX*fInvDZ2;
    fB2 = (aaafFZ[1][0][1] - rkPoly(0,0,1,fDX,(Real)0.0,fDZ))*fInvDX2*fInvDZ;
    fB3 = (aaafFXZ[1][0][1] - rkPoly(1,0,1,fDX,(Real)0.0,fDZ))*fInvDX*fInvDZ;
    rkPoly.A(2,0,2) = ((Real)9.0)*fB0 - ((Real)3.0)*fB1 - ((Real)3.0)*fB2
        + fB3;
    rkPoly.A(3,0,2) = (-((Real)6.0)*fB0 + ((Real)3.0)*fB1 + ((Real)2.0)*fB2
        - fB3)*fInvDX;
    rkPoly.A(2,0,3) = (-((Real)6.0)*fB0 + ((Real)2.0)*fB1 + ((Real)3.0)*fB2
        - fB3)*fInvDZ;
    rkPoly.A(3,0,3) = (((Real)4.0)*fB0 - ((Real)2.0)*fB1 - ((Real)2.0)*fB2
        + fB3)*fInvDX*fInvDZ;

    // solve for A0jk
    fB0 = (aaafFZ[0][1][0] - rkPoly(0,0,1,(Real)0.0,fDY,(Real)0.0))*fInvDY2;
    fB1 = (aaafFYZ[0][1][0] - rkPoly(0,1,1,(Real)0.0,fDY,(Real)0.0))*fInvDY;
    rkPoly.A(0,2,1) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(0,3,1) = (-((Real)2.0)*fB0 + fB1)*fInvDY;

    fB0 = (aaafFY[0][0][1] - rkPoly(0,1,0,(Real)0.0,(Real)0.0,fDZ))*fInvDZ2;
    fB1 = (aaafFYZ[0][0][1] - rkPoly(0,1,1,(Real)0.0,(Real)0.0,fDZ))*fInvDZ;
    rkPoly.A(0,1,2) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(0,1,3) = (-((Real)2.0)*fB0 + fB1)*fInvDZ;

    fB0 = (aaafF[0][1][1] - rkPoly(0,0,0,(Real)0.0,fDY,fDZ))*fInvDY2*fInvDZ2;
    fB1 = (aaafFY[0][1][1] - rkPoly(0,1,0,(Real)0.0,fDY,fDZ))*fInvDY*fInvDZ2;
    fB2 = (aaafFZ[0][1][1] - rkPoly(0,0,1,(Real)0.0,fDY,fDZ))*fInvDY2*fInvDZ;
    fB3 = (aaafFYZ[0][1][1] - rkPoly(0,1,1,(Real)0.0,fDY,fDZ))*fInvDY*fInvDZ;
    rkPoly.A(0,2,2) = ((Real)9.0)*fB0 - ((Real)3.0)*fB1 - ((Real)3.0)*fB2
        + fB3;
    rkPoly.A(0,3,2) = (-((Real)6.0)*fB0 + ((Real)3.0)*fB1 + ((Real)2.0)*fB2
        - fB3)*fInvDY;
    rkPoly.A(0,2,3) = (-((Real)6.0)*fB0 + ((Real)2.0)*fB1 + ((Real)3.0)*fB2
        - fB3)*fInvDZ;
    rkPoly.A(0,3,3) = (((Real)4.0)*fB0 - ((Real)2.0)*fB1 - ((Real)2.0)*fB2
        + fB3)*fInvDY*fInvDZ;

    // solve for Aij1
    fB0 = (aaafFYZ[1][0][0] - rkPoly(0,1,1,fDX,(Real)0.0,(Real)0.0))*fInvDX2;
    fB1 = (aaafFXYZ[1][0][0] - rkPoly(1,1,1,fDX,(Real)0.0,(Real)0.0))*fInvDX;
    rkPoly.A(2,1,1) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(3,1,1) = (-((Real)2.0)*fB0 + fB1)*fInvDX;

    fB0 = (aaafFXZ[0][1][0] - rkPoly(1,0,1,(Real)0.0,fDY,(Real)0.0))*fInvDY2;
    fB1 = (aaafFXYZ[0][1][0] - rkPoly(1,1,1,(Real)0.0,fDY,(Real)0.0))*fInvDY;
    rkPoly.A(1,2,1) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(1,3,1) = (-((Real)2.0)*fB0 + fB1)*fInvDY;

    fB0 = (aaafFZ[1][1][0] - rkPoly(0,0,1,fDX,fDY,(Real)0.0))*fInvDX2*fInvDY2;
    fB1 = (aaafFXZ[1][1][0] - rkPoly(1,0,1,fDX,fDY,(Real)0.0))*fInvDX*fInvDY2;
    fB2 = (aaafFYZ[1][1][0] - rkPoly(0,1,1,fDX,fDY,(Real)0.0))*fInvDX2*fInvDY;
    fB3 = (aaafFXYZ[1][1][0] - rkPoly(1,1,1,fDX,fDY,(Real)0.0))*fInvDX*fInvDY;
    rkPoly.A(2,2,1) = ((Real)9.0)*fB0 - ((Real)3.0)*fB1 - ((Real)3.0)*fB2
        + fB3;
    rkPoly.A(3,2,1) = (-((Real)6.0)*fB0 + ((Real)3.0)*fB1 + ((Real)2.0)*fB2
        - fB3)*fInvDX;
    rkPoly.A(2,3,1) = (-((Real)6.0)*fB0 + ((Real)2.0)*fB1 + ((Real)3.0)*fB2
        - fB3)*fInvDY;
    rkPoly.A(3,3,1) = (((Real)4.0)*fB0 - ((Real)2.0)*fB1 - ((Real)2.0)*fB2
        + fB3)*fInvDX*fInvDY;

    // solve for Ai1k
    fB0 = (aaafFXY[0][0][1] - rkPoly(1,1,0,(Real)0.0,(Real)0.0,fDZ))*fInvDZ2;
    fB1 = (aaafFXYZ[0][0][1] - rkPoly(1,1,1,(Real)0.0,(Real)0.0,fDZ))*fInvDZ;
    rkPoly.A(1,1,2) = ((Real)3.0)*fB0 - fB1;
    rkPoly.A(1,1,3) = (-((Real)2.0)*fB0 + fB1)*fInvDZ;

    fB0 = (aaafFY[1][0][1] - rkPoly(0,1,0,fDX,(Real)0.0,fDZ))*fInvDX2*fInvDZ2;
    fB1 = (aaafFXY[1][0][1] - rkPoly(1,1,0,fDX,(Real)0.0,fDZ))*fInvDX*fInvDZ2;
    fB2 = (aaafFYZ[1][0][1] - rkPoly(0,1,1,fDX,(Real)0.0,fDZ))*fInvDX2*fInvDZ;
    fB3 = (aaafFXYZ[1][0][1] - rkPoly(1,1,1,fDX,(Real)0.0,fDZ))*fInvDX*fInvDZ;
    rkPoly.A(2,1,2) = ((Real)9.0)*fB0 - ((Real)3.0)*fB1 - ((Real)3.0)*fB2
        + fB3;
    rkPoly.A(3,1,2) = (-((Real)6.0)*fB0 + ((Real)3.0)*fB1 + ((Real)2.0)*fB2
        - fB3)*fInvDX;
    rkPoly.A(2,1,3) = (-((Real)6.0)*fB0 + ((Real)2.0)*fB1 + ((Real)3.0)*fB2
        - fB3)*fInvDZ;
    rkPoly.A(3,1,3) = (((Real)4.0)*fB0 - ((Real)2.0)*fB1 - ((Real)2.0)*fB2
        + fB3)*fInvDX*fInvDZ;

    // solve for A1jk
    fB0 = (aaafFX[0][1][1] - rkPoly(1,0,0,(Real)0.0,fDY,fDZ))*fInvDY2*fInvDZ2;
    fB1 = (aaafFXY[0][1][1] - rkPoly(1,1,0,(Real)0.0,fDY,fDZ))*fInvDY*fInvDZ2;
    fB2 = (aaafFXZ[0][1][1] - rkPoly(1,0,1,(Real)0.0,fDY,fDZ))*fInvDY2*fInvDZ;
    fB3 = (aaafFXYZ[0][1][1] - rkPoly(1,1,1,(Real)0.0,fDY,fDZ))*fInvDY*fInvDZ;
    rkPoly.A(1,2,2) = ((Real)9.0)*fB0 - ((Real)3.0)*fB1 - ((Real)3.0)*fB2
        + fB3;
    rkPoly.A(1,3,2) = (-((Real)6.0)*fB0 + ((Real)3.0)*fB1 + ((Real)2.0)*fB2
        - fB3)*fInvDY;
    rkPoly.A(1,2,3) = (-((Real)6.0)*fB0 + ((Real)2.0)*fB1 + ((Real)3.0)*fB2
        - fB3)*fInvDZ;
    rkPoly.A(1,3,3) = (((Real)4.0)*fB0 - ((Real)2.0)*fB1 - ((Real)2.0)*fB2
        + fB3)*fInvDY*fInvDZ;

    // solve for remaining Aijk with i >= 2, j >= 2, k >= 2
    fB0 = (aaafF[1][1][1]-rkPoly(0,0,0,fDX,fDY,fDZ))*fInvDX2*fInvDY2*fInvDZ2;
    fB1 = (aaafFX[1][1][1]-rkPoly(1,0,0,fDX,fDY,fDZ))*fInvDX*fInvDY2*fInvDZ2;
    fB2 = (aaafFY[1][1][1]-rkPoly(0,1,0,fDX,fDY,fDZ))*fInvDX2*fInvDY*fInvDZ2;
    fB3 = (aaafFZ[1][1][1]-rkPoly(0,0,1,fDX,fDY,fDZ))*fInvDX2*fInvDY2*fInvDZ;
    fB4 = (aaafFXY[1][1][1]-rkPoly(1,1,0,fDX,fDY,fDZ))*fInvDX*fInvDY*fInvDZ2;
    fB5 = (aaafFXZ[1][1][1]-rkPoly(1,0,1,fDX,fDY,fDZ))*fInvDX*fInvDY2*fInvDZ;
    fB6 = (aaafFYZ[1][1][1]-rkPoly(0,1,1,fDX,fDY,fDZ))*fInvDX2*fInvDY*fInvDZ;
    fB7 = (aaafFXYZ[1][1][1]-rkPoly(1,1,1,fDX,fDY,fDZ))*fInvDX*fInvDY*fInvDZ;
    rkPoly.A(2,2,2) = ((Real)27.0)*fB0 - ((Real)9.0)*fB1 - ((Real)9.0)*fB2 -
        ((Real)9.0)*fB3 + ((Real)3.0)*fB4 +
        ((Real)3.0)*fB5 + ((Real)3.0)*fB6 - fB7;
    rkPoly.A(3,2,2) = (-18.0f*fB0 + ((Real)9.0)*fB1 + ((Real)6.0)*fB2 +
        ((Real)6.0)*fB3 - ((Real)3.0)*fB4
        - ((Real)3.0)*fB5 - ((Real)2.0)*fB6 + fB7)*fInvDX;
    rkPoly.A(2,3,2) = (-18.0f*fB0 + ((Real)6.0)*fB1 + ((Real)9.0)*fB2 +
        ((Real)6.0)*fB3 - ((Real)3.0)*fB4
        - ((Real)2.0)*fB5 - ((Real)3.0)*fB6 + fB7)*fInvDY;
    rkPoly.A(2,2,3) = (-18.0f*fB0 + ((Real)6.0)*fB1 + ((Real)6.0)*fB2 +
        ((Real)9.0)*fB3 - ((Real)2.0)*fB4
        - ((Real)3.0)*fB5 - ((Real)3.0)*fB6 + fB7)*fInvDZ;
    rkPoly.A(3,3,2) = (12.0f*fB0 - ((Real)6.0)*fB1 - ((Real)6.0)*fB2 -
        ((Real)4.0)*fB3 + ((Real)3.0)*fB4
        + ((Real)2.0)*fB5 + ((Real)2.0)*fB6 - fB7)*fInvDX*fInvDY;
    rkPoly.A(3,2,3) = (12.0f*fB0 - ((Real)6.0)*fB1 - ((Real)4.0)*fB2 -
        ((Real)6.0)*fB3 + ((Real)2.0)*fB4
        + ((Real)3.0)*fB5 + ((Real)2.0)*fB6 - fB7)*fInvDX*fInvDZ;
    rkPoly.A(2,3,3) = (12.0f*fB0 - ((Real)4.0)*fB1 - ((Real)6.0)*fB2 -
        ((Real)6.0)*fB3 + ((Real)2.0)*fB4
        + ((Real)2.0)*fB5 + ((Real)3.0)*fB6 - fB7)*fInvDY*fInvDZ;
    rkPoly.A(3,3,3) = (-8.0f*fB0 + ((Real)4.0)*fB1 + ((Real)4.0)*fB2 +
        ((Real)4.0)*fB3 - ((Real)2.0)*fB4
        - ((Real)2.0)*fB5 - ((Real)2.0)*fB6 + fB7)*fInvDX*fInvDY*fInvDZ;
}
//----------------------------------------------------------------------------
template <class Real>
bool IntpAkimaUniform3<Real>::XLookup (Real fX, int& riXIndex, Real& rfDX)
    const
{
    if ( fX >= m_fXMin )
    {
        if ( fX <= m_fXMax )
        {
            for (riXIndex = 0; riXIndex+1 < m_iXBound; riXIndex++)
            {
                if ( fX < m_fXMin + m_fXSpacing*(riXIndex+1) )
                {
                    rfDX = fX - (m_fXMin + m_fXSpacing*riXIndex);
                    return true;
                }
            }

            riXIndex--;
            rfDX = fX - (m_fXMin + m_fXSpacing*riXIndex);
            return true;
        }
    }

    return false;
}
//----------------------------------------------------------------------------
template <class Real>
bool IntpAkimaUniform3<Real>::YLookup (Real fY, int& riYIndex, Real& rfDY)
    const
{
    if ( fY >= m_fYMin )
    {
        if ( fY <= m_fYMax )
        {
            for (riYIndex = 0; riYIndex+1 < m_iYBound; riYIndex++)
            {
                if ( fY < m_fYMin + m_fYSpacing*(riYIndex+1) )
                {
                    rfDY = fY - (m_fYMin + m_fYSpacing*riYIndex);
                    return true;
                }
            }

            riYIndex--;
            rfDY = fY - (m_fYMin + m_fYSpacing*riYIndex);
            return true;
        }
    }

    return false;
}
//----------------------------------------------------------------------------
template <class Real>
bool IntpAkimaUniform3<Real>::ZLookup (Real fZ, int& riZIndex, Real& rfDZ)
    const
{
    if ( fZ >= m_fZMin )
    {
        if ( fZ <= m_fZMax )
        {
            for (riZIndex = 0; riZIndex+1 < m_iZBound; riZIndex++)
            {
                if ( fZ < m_fZMin + m_fZSpacing*(riZIndex+1) )
                {
                    rfDZ = fZ - (m_fZMin + m_fZSpacing*riZIndex);
                    return true;
                }
            }

            riZIndex--;
            rfDZ = fZ - (m_fZMin + m_fZSpacing*riZIndex);
            return true;
        }
    }

    return false;
}
//----------------------------------------------------------------------------
template <class Real>
Real IntpAkimaUniform3<Real>::operator() (Real fX, Real fY, Real fZ) const
{
    int iX, iY, iZ;
    Real fDX, fDY, fDZ;

    if ( XLookup(fX,iX,fDX) && YLookup(fY,iY,fDY) && ZLookup(fZ,iZ,fDZ) )
        return m_aaakPoly[iZ][iY][iX](fDX,fDY,fDZ);
    else
        return Math<Real>::MAX_REAL;
}
//----------------------------------------------------------------------------
template <class Real>
Real IntpAkimaUniform3<Real>::operator() (int iXOrder, int iYOrder,
    int iZOrder, Real fX, Real fY, Real fZ) const
{
    int iX, iY, iZ;
    Real fDX, fDY, fDZ;

    if ( XLookup(fX,iX,fDX) && YLookup(fY,iY,fDY) && ZLookup(fZ,iZ,fDZ) )
        return m_aaakPoly[iZ][iY][iX](iXOrder,iYOrder,iZOrder,fDX,fDY,fDZ);
    else
        return Math<Real>::MAX_REAL;
}
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
// explicit instantiation
//----------------------------------------------------------------------------
namespace Wml
{
template class WML_ITEM IntpAkimaUniform3<float>;
template class WML_ITEM IntpAkimaUniform3<double>;
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

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