X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=libctsim%2Fscanner.cpp;h=6e2e57ad48bf962af80a9219c9638947f21bc713;hb=1f72f3289ee6be64ec607ea93b4fcfe8b5dff3eb;hp=465523a1e3bc5e8fef7fa19b679f8aaaf436ae17;hpb=c8ec665dde5df59539daf63e0a6a44f27550258b;p=ctsim.git diff --git a/libctsim/scanner.cpp b/libctsim/scanner.cpp index 465523a..6e2e57a 100644 --- a/libctsim/scanner.cpp +++ b/libctsim/scanner.cpp @@ -7,9 +7,9 @@ ** Date Started: 1984 ** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg +** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: scanner.cpp,v 1.24 2001/01/17 06:38:06 kevin Exp $ +** $Id: scanner.cpp,v 1.29 2001/02/04 21:28:19 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 @@ -133,8 +133,7 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, m_initPos.angle = 0.0; } else if (m_idGeometry == GEOMETRY_EQUILINEAR) { #if 0 - double dAngle = (m_dFieldOfView / 2) / cos (asin (m_dFieldOfView / 2 / m_dFocalLength)); -#else + double dAngle1 = atan ((m_dFieldOfView / 2) / m_dFocalLength); double dHalfSquare = m_dFieldOfView / SQRT2 / 2; double dFocalPastPhm = m_dFocalLength - dHalfSquare; if (dFocalPastPhm <= 0.) { @@ -142,8 +141,18 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, m_failMessage = "Focal Point inside of phantom"; return; } - double dAngle = atan( dHalfSquare / dFocalPastPhm ); -#endif + double dAngle2 = atan( dHalfSquare / dFocalPastPhm ); + double dAngle = maxValue (dAngle1, dAngle2); + //double dAngle = (m_dFieldOfView / 2) / cos (asin (m_dFieldOfView / 2 / m_dFocalLength)); +#else + if (m_dFieldOfView/2 >= m_dFocalLength) { + m_fail = true; + m_failMessage = "Invalid geometry: Focal length must be larger than field of view"; + return; + } + double dAngle = asin ((m_dFieldOfView/2) / m_dFocalLength); +#endif + double dHalfDetLen = 2 * m_dFocalLength * tan (dAngle); m_detLen = dHalfDetLen * 2; @@ -162,18 +171,13 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, m_initPos.yd2 = m_dYCenter - m_dFocalLength; m_initPos.angle = 0.0; } else if (m_idGeometry == GEOMETRY_EQUIANGULAR) { -#if 0 - double dAngle = atan ((m_dFieldOfView / 2) / m_dFocalLength); -#else - double dHalfSquare = m_dFieldOfView / SQRT2 / 2; - double dFocalPastPhm = m_dFocalLength - dHalfSquare; - if (dFocalPastPhm <= 0.) { + if (m_dFieldOfView/2 > m_dFocalLength) { m_fail = true; - m_failMessage = "Focal Point inside of phantom"; + m_failMessage = "Invalid geometry: Focal length must be larger than field of view"; return; } - double dAngle = atan ( dHalfSquare / dFocalPastPhm ); -#endif + double dAngle = asin ((m_dFieldOfView/2) / m_dFocalLength); + m_detLen = 2 * dAngle; m_detInc = m_detLen / m_nDet; if (m_nDet % 2 == 0) // Adjust for Even number of detectors @@ -318,6 +322,7 @@ Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iS m_pSGP->moveAbs (0., 0.); m_pSGP->drawCircle (m_dFocalLength); m_pSGP->setColor (C_BLUE); + m_pSGP->setTextPointSize (9); phm.draw (*m_pSGP); m_dTextHeight = m_pSGP->getCharHeight (); @@ -535,13 +540,24 @@ Scanner::traceShowParamRasterOp (int iRasterOp, const char *szLabel, const char #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) / 4; - m_pSGP->moveAbs (m_dXMinWin + dValueOffset, dYPos); -// m_pSGP->drawText (szValue); + if (row < 4) { + double dYPos = m_dYMaxWin - (row * m_dTextHeight); + double dXPos = m_dXMinWin; + m_pSGP->moveAbs (dXPos, dYPos); + m_pSGP->drawText (szLabel); + m_pSGP->moveAbs (dXPos + dValueOffset, dYPos); + m_pSGP->drawText (szValue); + } else { + row -= 4; + double dYPos = m_dYMaxWin - (row * m_dTextHeight); + double dXPos = m_dXMinWin + (m_dXMaxWin - m_dXMinWin) * 0.5; + m_pSGP->moveAbs (dXPos, dYPos); + m_pSGP->drawText (szLabel); + m_pSGP->moveAbs (dXPos + dValueOffset, dYPos); + m_pSGP->drawText (szValue); + } } else #endif {