X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fscanner.cpp;h=88f99f00a87eaad8b19fafbaeccfc9c9b76e7d97;hp=ff3cd9af366833c74a3e7e3e52641aeeaaa43a2b;hb=d16eb37cbc73f67fc29a60645e0b1ac7fe32767e;hpb=b361677a2f7d5b443641faec70b057f2a84dc77e diff --git a/libctsim/scanner.cpp b/libctsim/scanner.cpp index ff3cd9a..88f99f0 100644 --- a/libctsim/scanner.cpp +++ b/libctsim/scanner.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: scanner.cpp,v 1.34 2001/03/10 23:14:16 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,9 +186,10 @@ 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; } @@ -202,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 @@ -354,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 @@ -463,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;