r1018: *** empty log message ***
[ctsim.git] / libctsim / scanner.cpp
index 0319912339cbee2c8755852cc0bcdbbca561aee5..a90ca4444129059c6a0b6a3809ae7157570ccbc6 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: scanner.cpp,v 1.38 2001/04/02 03:49:52 kevin Exp $
+**  $Id: scanner.cpp,v 1.39 2001/09/24 09:40:42 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
@@ -83,8 +83,10 @@ DetectorArray::~DetectorArray (void)
 */
 
 Scanner::Scanner (const Phantom& phm, const char* const geometryName, 
-                  int nDet, int nView, int nSample, const double rot_anglen, 
-                  const double dFocalLengthRatio, const double dCenterDetectorRatio,
+                  int nDet, int nView, int offsetView, 
+                                 int nSample, const double rot_anglen, 
+                  const double dFocalLengthRatio, 
+                                 const double dCenterDetectorRatio,
                   const double dViewRatio, const double dScanRatio)
 {
   m_fail = false;
@@ -106,6 +108,7 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
   
   m_nDet     = nDet;
   m_nView    = nView;
+  m_iOffsetView = offsetView;
   m_nSample  = nSample;
   m_dFocalLengthRatio = dFocalLengthRatio;
   m_dCenterDetectorRatio = dCenterDetectorRatio;
@@ -144,7 +147,7 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
     m_initPos.yd1 = m_dYCenter - m_dCenterDetectorLength;
     m_initPos.xd2 = m_dXCenter + dHalfDetLen + dDetectorArrayEndOffset;
     m_initPos.yd2 = m_dYCenter - m_dCenterDetectorLength;
-    m_initPos.angle = 0.0;
+    m_initPos.angle = m_iOffsetView * m_rotInc;
     m_detLen += dDetectorArrayEndOffset;
   } else if (m_idGeometry == GEOMETRY_EQUILINEAR) {
   if (m_dScanDiameter / 2 >= m_dFocalLength) {
@@ -167,7 +170,6 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
     }
   
     m_dFanBeamAngle = dAngle * 2;
-    m_initPos.angle = 0.0;
     m_initPos.xs1 = m_dXCenter;
     m_initPos.ys1 = m_dYCenter + m_dFocalLength;
     m_initPos.xs2 = m_dXCenter;
@@ -176,7 +178,7 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
     m_initPos.yd1 = m_dYCenter - m_dCenterDetectorLength;
     m_initPos.xd2 = m_dXCenter + dHalfDetLen + dDetectorArrayEndOffset;
     m_initPos.yd2 = m_dYCenter - m_dCenterDetectorLength;
-    m_initPos.angle = 0.0;
+    m_initPos.angle = m_iOffsetView * m_rotInc;
   } else if (m_idGeometry == GEOMETRY_EQUIANGULAR) {
     if (m_dScanDiameter / 2 > m_dFocalLength) {
       m_fail = true;
@@ -202,7 +204,7 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
     m_initPos.dAngularDet = -m_dAngularDetLen / 2;
     
     m_dFanBeamAngle = dAngle * 2;
-    m_initPos.angle = 0;
+    m_initPos.angle = m_iOffsetView * m_rotInc;
     m_initPos.xs1 = m_dXCenter;
     m_initPos.ys1 = m_dYCenter + m_dFocalLength;;
     m_initPos.xs2 = m_dXCenter;
@@ -277,23 +279,22 @@ Scanner::convertGeometryNameToID (const char* const geomName)
 void
 Scanner::collectProjections (Projections& proj, const Phantom& phm, const int trace, SGP* pSGP)
 {
-  collectProjections (proj, phm, 0, proj.nView(), true, trace, pSGP);
+  collectProjections (proj, phm, m_startView, proj.nView(), m_iOffsetView, true, trace, pSGP);
 }
 
 void
-Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iStartView, const int iNumViews, 
-                             bool bStoreAtViewPosition, const int trace, SGP* pSGP)
+Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iStartView, const int iNumViews, const int iOffsetView,  bool bStoreAtViewPosition, const int trace, SGP* pSGP)
 {
   int iStorageOffset = (bStoreAtViewPosition ? iStartView : 0);
-  collectProjections (proj, phm, iStartView, iNumViews, iStorageOffset, trace, pSGP);
+  collectProjections (proj, phm, iStartView, iNumViews, iOffsetView, iStorageOffset, trace, pSGP);
 }
 
 void
-Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iStartView, const int iNumViews, 
-                             int iStorageOffset, const int trace, SGP* pSGP)
+Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iStartView, const int iNumViews, const int iOffsetView, 
+      int iStorageOffset, const int trace, SGP* pSGP)
 {
   m_trace = trace;
-  double start_angle = iStartView * proj.rotInc();
+  double start_angle = (iStartView + iOffsetView) * proj.rotInc();
   
   // Calculate initial rotation matrix 
   GRFMTX_2D rotmtx_initial, temp;