** 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.16 2000/12/03 12:22:46 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
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;
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
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;
#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;
}
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, bool bStoreAtViewPosition, const int trace, SGP* pSGP = NULL)
{
m_trace = trace;
double start_angle = iStartView * proj.rotInc();
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);
}
m_pSGP->setPenWidth (1);
}
- if (m_trace >= Trace::TRACE_CONSOLE)
+ if (m_trace > Trace::TRACE_CONSOLE)
traceShowParam ("Current View:", "%d (%.0f%%)", PROJECTION_TRACE_ROW_CURR_VIEW, C_RED, iView + iStartView, (iView + iStartView) / static_cast<double>(m_nView) * 100.);
#endif
-
+ if (m_trace == Trace::TRACE_CONSOLE)
+ cout << "Current View: " << iView+iStartView << endl;
+
projectSingleView (phm, detArray, xd1, yd1, xd2, yd2, xs1, ys1, xs2, ys2, viewAngle + 3 * HALFPI);
detArray.setViewAngle (viewAngle);
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;
{
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);
}
{
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);
}
// 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");
+ }
}