X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Finterpolator.h;h=e93e2f50a73396033200368bdbadd7b5d99479e3;hp=a3dd43a403ed64a82668f86307790864f8bdb2b5;hb=f13a8c004b8f182b42d9e4df2bcd7c7f030bf1ad;hpb=4f15a69a3150f180bd93fcbe1c87dbaca92a77ad diff --git a/include/interpolator.h b/include/interpolator.h index a3dd43a..e93e2f5 100644 --- a/include/interpolator.h +++ b/include/interpolator.h @@ -1,8 +1,6 @@ /***************************************************************************** ** This is part of the CTSim program -** Copyright (c) 1983-2001 Kevin Rosenberg -** -** $Id: interpolator.h,v 1.9 2003/03/23 18:37:42 kevin Exp $ +** Copyright (c) 1983-2009 Kevin Rosenberg ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -60,16 +58,16 @@ public: BilinearInterpolator (T** ppMatrix, unsigned int nx, unsigned int ny) : m_ppMatrix(ppMatrix), m_nx(nx), m_ny(ny) {} - + T interpolate (double dXPos, double dYPos) { int iFloorX = static_cast(floor(dXPos)); int iFloorY = static_cast(floor (dYPos)); double dXFrac = dXPos - iFloorX; double dYFrac = dYPos - iFloorY; - + T result = 0; - + if (iFloorX < 0 || iFloorY < 0 || iFloorX > m_nx-1 || iFloorY > m_ny-1) result = 0; else if (iFloorX == m_nx - 1 && iFloorY == m_ny - 1) @@ -80,11 +78,11 @@ public: result = static_cast(m_ppMatrix[iFloorX][iFloorY] + dXFrac * (m_ppMatrix[iFloorX+1][iFloorY] - m_ppMatrix[iFloorX][iFloorY])); else result = static_cast - ((1 - dXFrac) * (1 - dYFrac) * m_ppMatrix[iFloorX][iFloorY] + - dXFrac * (1 - dYFrac) * m_ppMatrix[iFloorX+1][iFloorY] + + ((1 - dXFrac) * (1 - dYFrac) * m_ppMatrix[iFloorX][iFloorY] + + dXFrac * (1 - dYFrac) * m_ppMatrix[iFloorX+1][iFloorY] + dYFrac * (1 - dXFrac) * m_ppMatrix[iFloorX][iFloorY+1] + dXFrac * dYFrac * m_ppMatrix[iFloorX+1][iFloorY+1]); - + return result; } }; @@ -97,10 +95,10 @@ private: const int m_nAngle; const int m_nPos; int m_nCenterPos; - + public: BilinearPolarInterpolator (T** ppMatrix, unsigned int nAngle, - unsigned int nPos) + unsigned int nPos) : m_ppMatrix(ppMatrix), m_nAngle(nAngle), m_nPos(nPos) { if (m_nPos %2) @@ -115,9 +113,9 @@ public: int iFloorPos = static_cast(floor (dPos)); double dAngleFrac = dAngle - iFloorAngle; double dPosFrac = dPos - iFloorPos; - + T result = 0; - + if (iFloorAngle < -1 || iFloorPos < 0 || iFloorAngle > m_nAngle-1 || iFloorPos > m_nPos-1) result = 0; else if (iFloorAngle == -1 && iFloorPos == m_nPos-1) @@ -132,25 +130,25 @@ public: int iLowerPos = (m_nPos-1) - iFloorPos; int iUpperPos = (m_nPos-1) - (iFloorPos+1); result = static_cast - ((1-dAngleFrac) * (1-dPosFrac) * m_ppMatrix[iFloorAngle][iFloorPos] + - dAngleFrac * (1-dPosFrac) * m_ppMatrix[iUpperAngle][iLowerPos] + - dPosFrac * (1-dAngleFrac) * m_ppMatrix[iFloorAngle][iFloorPos+1] + - dAngleFrac * dPosFrac * m_ppMatrix[iUpperAngle][iUpperPos]); + ((1-dAngleFrac) * (1-dPosFrac) * m_ppMatrix[iFloorAngle][iFloorPos] + + dAngleFrac * (1-dPosFrac) * m_ppMatrix[iUpperAngle][iLowerPos] + + dPosFrac * (1-dAngleFrac) * m_ppMatrix[iFloorAngle][iFloorPos+1] + + dAngleFrac * dPosFrac * m_ppMatrix[iUpperAngle][iUpperPos]); } else if (iFloorAngle == -1) { int iLowerAngle = m_nAngle - 1; int iLowerPos = (m_nPos-1) - iFloorPos; int iUpperPos = (m_nPos-1) - (iFloorPos+1); result = static_cast - ((1-dAngleFrac) * (1-dPosFrac) * m_ppMatrix[iLowerAngle][iLowerPos] + - dAngleFrac * (1-dPosFrac) * m_ppMatrix[iFloorAngle+1][iFloorPos] + - dPosFrac * (1-dAngleFrac) * m_ppMatrix[iLowerAngle][iUpperPos] + - dAngleFrac * dPosFrac * m_ppMatrix[iFloorAngle+1][iFloorPos+1]); + ((1-dAngleFrac) * (1-dPosFrac) * m_ppMatrix[iLowerAngle][iLowerPos] + + dAngleFrac * (1-dPosFrac) * m_ppMatrix[iFloorAngle+1][iFloorPos] + + dPosFrac * (1-dAngleFrac) * m_ppMatrix[iLowerAngle][iUpperPos] + + dAngleFrac * dPosFrac * m_ppMatrix[iFloorAngle+1][iFloorPos+1]); } else result = static_cast - ((1-dAngleFrac) * (1-dPosFrac) * m_ppMatrix[iFloorAngle][iFloorPos] + - dAngleFrac * (1-dPosFrac) * m_ppMatrix[iFloorAngle+1][iFloorPos] + - dPosFrac * (1-dAngleFrac) * m_ppMatrix[iFloorAngle][iFloorPos+1] + - dAngleFrac * dPosFrac * m_ppMatrix[iFloorAngle+1][iFloorPos+1]); + ((1-dAngleFrac) * (1-dPosFrac) * m_ppMatrix[iFloorAngle][iFloorPos] + + dAngleFrac * (1-dPosFrac) * m_ppMatrix[iFloorAngle+1][iFloorPos] + + dPosFrac * (1-dAngleFrac) * m_ppMatrix[iFloorAngle][iFloorPos+1] + + dAngleFrac * dPosFrac * m_ppMatrix[iFloorAngle+1][iFloorPos+1]); } return result; } @@ -168,7 +166,7 @@ public: BicubicPolyInterpolator (T** ppMatrix, unsigned int nx, unsigned int ny) : m_ppMatrix(ppMatrix), m_nx(nx), m_ny(ny) {} - + T interpolate (double dXPos, double dYPos) { // int iFloorX = static_cast(floor (dXPos)); @@ -197,11 +195,11 @@ public: LinearInterpolator (T* pY, unsigned int n, bool bZeroOutside = true) : m_pX(0), m_pY(pY), m_n(n), m_bZeroOutsideRange(bZeroOutside) {} - + LinearInterpolator (T* pX, T* pY, unsigned int n, bool bZeroOutside = true) : m_pX(pX), m_pY(pY), m_n(n), m_bZeroOutsideRange(bZeroOutside) {} - + double interpolate (double dX, int* piLastFloor = NULL) { double result = 0;