r240: *** empty log message ***
[ctsim.git] / libctsim / backprojectors.cpp
index 0bcd4077cd527281d11769b4084c3d29e07cce1d..152e026770059dcee869e6161d6d373639b85f5a 100644 (file)
@@ -8,7 +8,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: backprojectors.cpp,v 1.13 2000/08/31 08:38:58 kevin Exp $
+**  $Id: backprojectors.cpp,v 1.15 2000/12/03 15:16:18 kevin Exp $
 **
 **  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
@@ -261,8 +261,9 @@ Backproject::Backproject (const Projections& proj, ImageFile& im, const int inte
 {
   detInc = proj.detInc();
   nDet = proj.nDet();
-  iDetCenter = nDet / 2;       // index refering to L=0 projection 
-  rotInc = proj.rotInc();
+  iDetCenter = (nDet - 1) / 2; // index refering to L=0 projection 
+  rotScale = proj.rotInc();
+  rotScale /= (proj.nView() * proj.rotInc() / PI); // scale by number of PI rotations
 
   v = im.getArray();
   nx = im.nx();
@@ -288,7 +289,7 @@ Backproject::ScaleImageByRotIncrement ()
 {
   for (int ix = 0; ix < nx; ix++)
     for (int iy = 0; iy < ny; iy++)
-      v[ix][iy] *= rotInc;
+      v[ix][iy] *= rotScale;
 }
 
 void Backproject::errorIndexOutsideDetector (int ix, int iy, double theta, double r, double phi, double L, int iDetPos)
@@ -335,7 +336,7 @@ BackprojectTrig::BackprojectView (const double* const filteredProj, const double
        if (iDetPos < 0 || iDetPos >= nDet)     // check for impossible: index outside of raysum pos 
            errorIndexOutsideDetector (ix, iy, theta, r, phi, L, iDetPos);
        else
-         v[ix][iy] += rotInc * filteredProj[iDetPos];
+         v[ix][iy] += rotScale * filteredProj[iDetPos];
       } else if (interpType == Backprojector::INTERP_LINEAR) {
          double p = L / detInc;        // position along detector
          double pFloor = floor (p);
@@ -344,7 +345,7 @@ BackprojectTrig::BackprojectView (const double* const filteredProj, const double
          if (iDetPos < 0 || iDetPos >= nDet - 1)       // check for impossible: index outside of raysum pos 
            errorIndexOutsideDetector (ix, iy, theta, r, phi, L, iDetPos);
          else
-           v[ix][iy] += rotInc * ((1-frac) * filteredProj[iDetPos] + frac * filteredProj[iDetPos+1]);
+           v[ix][iy] += rotScale * ((1-frac) * filteredProj[iDetPos] + frac * filteredProj[iDetPos+1]);
       }
     }
   }
@@ -360,8 +361,8 @@ BackprojectTrig::BackprojectView (const double* const filteredProj, const double
 BackprojectTable::BackprojectTable (const Projections& proj, ImageFile& im, int interpType, const int interpFactor)
   : Backproject::Backproject (proj, im, interpType, interpFactor)
 {
-  arrayR.initSetSize (nx, ny);
-  arrayPhi.initSetSize (nx, ny);
+  arrayR.initSetSize (im.nx(), im.ny());
+  arrayPhi.initSetSize (im.nx(), im.ny());
   r = arrayR.getArray();
   phi = arrayPhi.getArray();
 
@@ -493,7 +494,7 @@ BackprojectDiff2::BackprojectView (const double* const filteredProj, const doubl
   double detPosColStart = start_r * cos (theta - start_phi) / detInc;
        
 #ifdef DEBUG
-  printf ("start_r=%8.5f, start_phi=%8.5f, rotInc=%8.5f\n", start_r, start_phi, rotInc);
+  printf ("start_r=%8.5f, start_phi=%8.5f, rotScale=%8.5f\n", start_r, start_phi, rotScale);
 #endif
   for (int ix = 0; ix < nx; ix++, detPosColStart += det_dx) {
     double curDetPos = detPosColStart;
@@ -665,7 +666,7 @@ BackprojectEquiangular::BackprojectView (const double* const filteredProj, const
        if (iDetPos < 0 || iDetPos >= nDet - 1) {
          ; //      errorIndexOutsideDetector (ix, iy, beta, r[ix][iy], phi[ix][iy], gamma, iDetPos);
        } else
-         pImCol[iy] += (((1-frac) * filteredProj[iDetPos] + frac * filteredProj[iDetPos+1])) / dL2;
+         pImCol[iy] += (filteredProj[iDetPos] + frac * (filteredProj[iDetPos+1] - filteredProj[iDetPos])) / dL2;
       }
     }  // end for y 
   }    // end for x 
@@ -705,7 +706,7 @@ BackprojectEquilinear::BackprojectView (const double* const filteredProj, const
        if (iDetPos < 0 || iDetPos >= nDet - 1)
          ; //      errorIndexOutsideDetector (ix, iy, beta, r[ix][iy], phi[ix][iy], dDetPos, iDetPos);
        else
-         pImCol[iy] += (((1-frac) * filteredProj[iDetPos] + frac * filteredProj[iDetPos+1])) / (dU * dU);
+         pImCol[iy] += (filteredProj[iDetPos] + frac * (filteredProj[iDetPos+1] - filteredProj[iDetPos])) / (dU * dU);
       }
     }  // end for y 
   }    // end for x