X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=libctsim%2Fscanner.cpp;h=bb7a7d84cbb4d3bd96b2c1b6a4d3cd383d30c312;hb=43259365c0fa2788f15e1100491271dd910f5a6f;hp=ef72c5b4cc99a7672a9d3ba2a25eac03a8d26edf;hpb=a05f3cb550877e94aa118cc04b361c0c8fdb3dc3;p=ctsim.git diff --git a/libctsim/scanner.cpp b/libctsim/scanner.cpp index ef72c5b..bb7a7d8 100644 --- a/libctsim/scanner.cpp +++ b/libctsim/scanner.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: scanner.cpp,v 1.13 2000/08/31 08:38:58 kevin Exp $ +** $Id: scanner.cpp,v 1.15 2000/09/07 14:29:05 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 @@ -95,12 +95,13 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, return; } - if (nView < 1) - nView = 1; + if (nView < 1 || nDet < 1) { + m_fail = true; + m_failMessage = "nView & nDet must be greater than 0"; + return; + } if (nSample < 1) m_nSample = 1; - if (nDet < 1) - nDet = 1; m_nDet = nDet; m_nView = nView; @@ -117,16 +118,18 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, if (m_idGeometry == GEOMETRY_PARALLEL) { m_detLen = m_dFieldOfView; 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 dHalfDetLen = m_detLen / 2; - m_initPos.xs1 = m_dXCenter - m_dFocalLength; - m_initPos.ys1 = m_dYCenter + dHalfDetLen; - m_initPos.xs2 = m_dXCenter + m_dFocalLength; - m_initPos.ys2 = m_dYCenter + dHalfDetLen; - m_initPos.xd1 = m_dXCenter - m_dFocalLength; - m_initPos.yd1 = m_dYCenter - dHalfDetLen; - m_initPos.xd2 = m_dXCenter + m_dFocalLength; - m_initPos.yd2 = m_dYCenter - dHalfDetLen; + m_initPos.xs1 = m_dXCenter - dHalfDetLen; + m_initPos.ys1 = m_dYCenter + m_dFocalLength; + m_initPos.xs2 = m_dXCenter + dHalfDetLen; + 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.yd2 = m_dYCenter - m_dFocalLength; m_initPos.angle = 0.0; } else if (m_idGeometry == GEOMETRY_EQUILINEAR) { #if 0 @@ -145,6 +148,8 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, 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 m_initPos.angle = 0.0; m_initPos.xs1 = m_dXCenter; @@ -171,7 +176,8 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, #endif 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; m_initPos.dAngularDet = -m_dAngularDetLen / 2; @@ -317,8 +323,6 @@ Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iS phm.draw (*m_pSGP); m_dTextHeight = m_pSGP->getCharHeight (); - traceShowParam ("Projection Collector", "%s", PROJECTION_TRACE_ROW_TITLE, C_BLACK, " "); - traceShowParam ("________________", "%s", PROJECTION_TRACE_ROW_TITLE2, C_LTGRAY, " "); traceShowParam ("Phantom:", "%s", PROJECTION_TRACE_ROW_PHANT_ID, C_BLACK, phm.name().c_str()); traceShowParam ("Geometry:", "%s", PROJECTION_TRACE_ROW_GEOMETRY, C_BLUE, convertGeometryIDToName(m_idGeometry)); traceShowParam ("Focal Length Ratio:", "%.2f", PROJECTION_TRACE_ROW_FOCAL_LENGTH, C_BLUE, m_dFocalLengthRatio); @@ -468,10 +472,10 @@ Scanner::projectSingleView (const Phantom& phm, DetectorArray& detArray, const d sum += projectSingleLine (phm, xd, yd, xs, ys); #ifdef HAVE_SGP - if (m_trace >= Trace::TRACE_CLIPPING) { - traceShowParam ("Attenuation:", "%s", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, " "); - traceShowParam ("Attenuation:", "%.3f", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, sum); - } + // if (m_trace >= Trace::TRACE_CLIPPING) { + // traceShowParam ("Attenuation:", "%s", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, " "); + // traceShowParam ("Attenuation:", "%.3f", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, sum); + // } #endif if (m_idGeometry == GEOMETRY_EQUIANGULAR) dAngle += dAngleSampleInc; @@ -500,7 +504,11 @@ Scanner::traceShowParam (const char *szLabel, const char *fmt, int row, int colo { va_list arg; va_start(arg, color); +#ifdef HAVE_SGP traceShowParamRasterOp (RO_COPY, szLabel, fmt, row, color, arg); +#else + traceShowParamRasterOp (0, szLabel, fmt, row, color, arg); +#endif va_end(arg); } @@ -509,7 +517,11 @@ Scanner::traceShowParamXOR (const char *szLabel, const char *fmt, int row, int c { va_list arg; va_start(arg, color); +#ifdef HAVE_SGP traceShowParamRasterOp (RO_XOR, szLabel, fmt, row, color, arg); +#else + traceShowParamRasterOp (0, szLabel, fmt, row, color, arg); +#endif va_end(arg); } @@ -524,20 +536,23 @@ Scanner::traceShowParamRasterOp (int iRasterOp, const char *szLabel, const char // cio_set_text_clr (color - 8, 0); // cio_set_text_clr (color, 0); +#ifdef HAVE_SGP if (m_pSGP) { m_pSGP->setRasterOp (iRasterOp); double dYPos = m_dYMaxWin - (row * m_dTextHeight); m_pSGP->moveAbs (m_dXMinWin, dYPos); m_pSGP->setTextColor (color, -1); m_pSGP->drawText (szLabel); - double dValueOffset = (m_dXMaxWin - m_dXMinWin) / 5; + double dValueOffset = (m_dXMaxWin - m_dXMinWin) / 4; m_pSGP->moveAbs (m_dXMinWin + dValueOffset, dYPos); m_pSGP->drawText (szValue); - } else { - cio_put_str (szLabel); - cio_put_str (szValue); - cio_put_str ("\n"); - } + } else +#endif + { + cio_put_str (szLabel); + cio_put_str (szValue); + cio_put_str ("\n"); + } }