+ fftw_complex* pcIn = new fftw_complex [iNumInterpDetWithZeros];
+ std::complex<double>** ppcDetValue = new std::complex<double>* [m_nView];
+ double dInterpScale = (m_nDet-1) / static_cast<double>(iInterpDet-1) / SQRT2;
+
+ double dFFTScale = 1. / static_cast<double>(iInterpDet * iInterpDet);
+ int iMidPoint = iInterpDet / 2;
+ double dMidPoint = static_cast<double>(iInterpDet) / 2.;
+ int iZerosAdded = iNumInterpDetWithZeros - iInterpDet;
+ for (unsigned int iView = 0; iView < m_nView; iView++) {
+ DetectorValue* detval = getDetectorArray(iView).detValues();
+ LinearInterpolator<DetectorValue> projInterp (detval, m_nDet);
+ for (unsigned int iDet = 0; iDet < iInterpDet; iDet++) {
+ double dInterpPos = (m_nDet / 2.) + (iDet - dMidPoint) * dInterpScale;
+ pcIn[iDet].re = projInterp.interpolate (dInterpPos) * dInterpScale;
+ pcIn[iDet].im = 0;
+ }
+ Fourier::shuffleFourierToNaturalOrder (pcIn, iInterpDet);
+ if (iZerosAdded > 0) {
+ for (unsigned int iDet1 = iMidPoint; iDet1 < iInterpDet; iDet1++)
+ pcIn[iDet1+iZerosAdded] = pcIn[iDet1];
+ for (unsigned int iDet2 = iMidPoint; iDet2 < iMidPoint + iZerosAdded; iDet2++)
+ pcIn[iDet2].re = pcIn[iDet2].im = 0;
+ }
+
+ fftw_one (plan, pcIn, NULL);
+
+ ppcDetValue[iView] = new std::complex<double> [iNumInterpDetWithZeros];
+ for (unsigned int iD = 0; iD < iNumInterpDetWithZeros; iD++) {
+ ppcDetValue[iView][iD] = std::complex<double> (pcIn[iD].re * dFFTScale, pcIn[iD].im * dFFTScale);
+ }
+
+ Fourier::shuffleFourierToNaturalOrder (ppcDetValue[iView], iNumInterpDetWithZeros);
+ }
+ delete [] pcIn;
+
+ fftw_destroy_plan (plan);
+
+ Array2d<double> adView (nx, ny);
+ Array2d<double> adDet (nx, ny);
+ double** ppdView = adView.getArray();
+ double** ppdDet = adDet.getArray();
+ calcArrayPolarCoordinates (nx, ny, ppdView, ppdDet, iNumInterpDetWithZeros, dZeropadRatio,
+ m_detInc * dInterpScale);
+
+ interpolatePolar (v, vImag, nx, ny, ppcDetValue, ppdView, ppdDet, m_nView, m_nDet, iNumInterpDetWithZeros,
+ iInterpolationID);
+
+ for (int i = 0; i < m_nView; i++)
+ delete [] ppcDetValue[i];
+ delete [] ppcDetValue;
+
+ return true;
+#endif
+}
+
+
+void
+Projections::calcArrayPolarCoordinates (unsigned int nx, unsigned int ny, double** ppdView, double** ppdDet,
+ int iNumDetWithZeros, double dZeropadRatio, double dDetInc)
+{
+// double dLength = viewDiameter();
+ double dLength = phmLen();
+ double xMin = -dLength / 2;
+ double xMax = xMin + dLength;
+ double yMin = -dLength / 2;
+ double yMax = yMin + dLength;
+ double xCent = (xMin + xMax) / 2;
+ double yCent = (yMin + yMax) / 2;
+
+ xMin = (xMin - xCent) * dZeropadRatio + xCent;
+ xMax = (xMax - xCent) * dZeropadRatio + xCent;
+ yMin = (yMin - yCent) * dZeropadRatio + yCent;
+ yMax = (yMax - yCent) * dZeropadRatio + yCent;
+
+ double xInc = (xMax - xMin) / nx; // size of cells
+ double yInc = (yMax - yMin) / ny;
+
+ // +1 is correct for frequency data, ndet-1 is correct for projections
+ int iDetCenter = (iNumDetWithZeros - 1) / 2; // index refering to L=0 projection
+ if (isEven (iNumDetWithZeros))
+ iDetCenter = (iNumDetWithZeros + 1) / 2;
+
+ // Calculates polar coordinates (view#, det#) for each point on phantom grid
+ double x = xMin + xInc / 2; // Rectang coords of center of pixel
+ for (unsigned int ix = 0; ix < nx; x += xInc, ix++) {
+ double y = yMin + yInc / 2;
+ for (unsigned int iy = 0; iy < ny; y += yInc, iy++) {
+ double r = ::sqrt (x * x + y * y);
+ double phi = atan2 (y, x);
+
+ if (phi < 0)
+ phi += TWOPI;
+ if (phi >= PI) {
+ phi -= PI;
+ r = -r;
+ }