📄 wmlintpakimauniform3.cpp
字号:
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 + -