r640: no message
[ctsim.git] / libctsim / scanner.cpp
index 2314595219d76c45801d1a8dbf8a57f91de10f05..88f99f00a87eaad8b19fafbaeccfc9c9b76e7d97 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: scanner.cpp,v 1.33 2001/03/01 07:30:49 kevin Exp $
+**  $Id: scanner.cpp,v 1.37 2001/03/18 18:08:25 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
@@ -125,11 +125,12 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
   if (m_idGeometry == GEOMETRY_PARALLEL) {
     m_dFanBeamAngle = 0;
     m_detLen   = m_dScanDiameter;
+    m_detStart = -m_detLen / 2;
     m_detInc  = m_detLen / m_nDet;
     double dDetectorArrayEndOffset = 0;
     // For even number of detectors, make detInc slightly larger so that center lies
     // at nDet/2. Also, extend detector array by one detInc so that all of the phantom is scanned
-    if (m_nDet % 2 == 0) { // Adjust for Even number of detectors
+    if (isEven (m_nDet)) { // Adjust for Even number of detectors
       m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)
       dDetectorArrayEndOffset = m_detInc;
     }
@@ -144,6 +145,7 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
     m_initPos.xd2 = m_dXCenter + dHalfDetLen + dDetectorArrayEndOffset;
     m_initPos.yd2 = m_dYCenter - m_dCenterDetectorLength;
     m_initPos.angle = 0.0;
+    m_detLen += dDetectorArrayEndOffset;
   } else if (m_idGeometry == GEOMETRY_EQUILINEAR) {
   if (m_dScanDiameter / 2 >= m_dFocalLength) {
       m_fail = true;
@@ -155,11 +157,13 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
     const double dHalfDetLen = m_dSourceDetectorLength * tan (dAngle);
     
     m_detLen = dHalfDetLen * 2;
+    m_detStart = -dHalfDetLen;
     m_detInc  = m_detLen / m_nDet;
     double dDetectorArrayEndOffset = 0;
-    if (m_nDet % 2 == 0) { // Adjust for Even number of detectors
+    if (isEven (m_nDet)) { // Adjust for Even number of detectors
       m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)
       dDetectorArrayEndOffset = m_detInc;
+      m_detLen += dDetectorArrayEndOffset;
     }
   
     m_dFanBeamAngle = dAngle * 2;
@@ -182,14 +186,17 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
     const double dAngle = asin ((m_dScanDiameter / 2) / m_dFocalLength);
 
     m_detLen = 2 * dAngle;
+    m_detStart = -dAngle;
     m_detInc = m_detLen / m_nDet;
     double dDetectorArrayEndOffset = 0;
-    if (m_nDet % 2 == 0) { // Adjust for Even number of detectors
+    if (isEven (m_nDet)) { // Adjust for Even number of detectors
       m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)
       dDetectorArrayEndOffset = m_detInc;
     }
+    // adjust for center-detector length
     double dA1 = acos ((m_dScanDiameter / 2) / m_dCenterDetectorLength);
     double dAngularScale = 2 * (HALFPI + dAngle - dA1) / m_detLen;
+
     m_dAngularDetLen = dAngularScale * (m_detLen + dDetectorArrayEndOffset);
     m_dAngularDetIncrement = dAngularScale * m_detInc;
     m_initPos.dAngularDet = -m_dAngularDetLen / 2;
@@ -200,6 +207,7 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName,
     m_initPos.ys1 = m_dYCenter + m_dFocalLength;;
     m_initPos.xs2 = m_dXCenter;
     m_initPos.ys2 = m_dYCenter + m_dFocalLength;
+    m_detLen += dDetectorArrayEndOffset;
   }
   
   // Calculate incrementatal rotation matrix 
@@ -352,7 +360,7 @@ Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iS
       traceShowParam ("Num Views:", "%d", PROJECTION_TRACE_ROW_NVIEW, C_BLUE, proj.nView());
       traceShowParam ("Samples / Ray:", "%d", PROJECTION_TRACE_ROW_SAMPLES, C_BLUE, m_nSample);
       
-      m_pSGP->setMarker (SGP::MARK_BDIAMOND, C_LTGREEN);
+      m_pSGP->setMarker (SGP::MARKER_BDIAMOND);
     }
 #endif
     
@@ -461,7 +469,7 @@ Scanner::projectSingleView (const Phantom& phm, DetectorArray& detArray, const d
   
   if (phm.getComposition() == P_UNIT_PULSE) {  // put unit pulse in center of view
     for (int d = 0; d < detArray.nDet(); d++)
-      if (detArray.nDet() / 2 == d && (d % 2) == 1)
+      if (detArray.nDet() / 2 == d && isOdd (d))
         detval[d] = 1;
       else
         detval[d] = 0;