X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fscanner.cpp;h=6dbfec8371a71f15c9953a8cbf77150ea783b66d;hp=7081903f71b7984b17723c905a29c2b810826efc;hb=11ea72090da18aa290e2c3ab217f1d27736bca50;hpb=ca7c001fce978b680543f8338a404b8c0701a935 diff --git a/libctsim/scanner.cpp b/libctsim/scanner.cpp index 7081903..6dbfec8 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.30 2001/02/08 06:25:07 kevin Exp $ +** $Id: scanner.cpp,v 1.31 2001/02/20 17:44:14 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 @@ -119,20 +119,25 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, m_rotLen = rot_anglen; m_rotInc = m_rotLen / m_nView; if (m_idGeometry == GEOMETRY_PARALLEL) { + m_dFanBeamAngle = 0; m_detLen = m_dScanDiameter; m_detInc = m_detLen / m_nDet; - if (m_nDet % 2 == 0) // Adjust for Even number of detectors - m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)-1 - - m_dFanBeamAngle = 0; + 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 + m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2) + dDetectorArrayEndOffset = m_detInc; + } + double dHalfDetLen = m_detLen / 2; m_initPos.xs1 = m_dXCenter - dHalfDetLen; m_initPos.ys1 = m_dYCenter + m_dFocalLength; - m_initPos.xs2 = m_dXCenter + dHalfDetLen; + m_initPos.xs2 = m_dXCenter + dHalfDetLen + dDetectorArrayEndOffset; m_initPos.ys2 = m_dYCenter + m_dFocalLength; m_initPos.xd1 = m_dXCenter - dHalfDetLen; m_initPos.yd1 = m_dYCenter - m_dFocalLength; - m_initPos.xd2 = m_dXCenter + dHalfDetLen; + m_initPos.xd2 = m_dXCenter + dHalfDetLen + dDetectorArrayEndOffset; m_initPos.yd2 = m_dYCenter - m_dFocalLength; m_initPos.angle = 0.0; } else if (m_idGeometry == GEOMETRY_EQUILINEAR) { @@ -146,8 +151,11 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, m_detLen = dHalfDetLen * 2; m_detInc = m_detLen / m_nDet; - if (m_nDet % 2 == 0) // Adjust for Even number of detectors - m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)-1 + double dDetectorArrayEndOffset = 0; + if (m_nDet % 2 == 0) { // Adjust for Even number of detectors + m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2) + dDetectorArrayEndOffset = m_detInc; + } m_dFanBeamAngle = dAngle * 2; m_initPos.angle = 0.0; @@ -157,7 +165,7 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, m_initPos.ys2 = m_dYCenter + m_dFocalLength; m_initPos.xd1 = m_dXCenter - dHalfDetLen; m_initPos.yd1 = m_dYCenter - m_dFocalLength; - m_initPos.xd2 = m_dXCenter + dHalfDetLen; + m_initPos.xd2 = m_dXCenter + dHalfDetLen + dDetectorArrayEndOffset; m_initPos.yd2 = m_dYCenter - m_dFocalLength; m_initPos.angle = 0.0; } else if (m_idGeometry == GEOMETRY_EQUIANGULAR) { @@ -170,10 +178,13 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, m_detLen = 2 * dAngle; m_detInc = m_detLen / m_nDet; - if (m_nDet % 2 == 0) // Adjust for Even number of detectors - m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)-1 - m_dAngularDetIncrement = m_detInc * 2; // Angular Position 2x gamma angle - m_dAngularDetLen = m_detLen * 2; + double dDetectorArrayEndOffset = 0; + if (m_nDet % 2 == 0) { // Adjust for Even number of detectors + m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2) + dDetectorArrayEndOffset = m_detInc; + } + m_dAngularDetIncrement = 2 * m_detInc; // Angular Position 2x gamma angle + m_dAngularDetLen = 2 * m_detLen + 2 * dDetectorArrayEndOffset; m_initPos.dAngularDet = -m_dAngularDetLen / 2; m_dFanBeamAngle = dAngle * 2;