X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=libctsim%2Fscanner.cpp;h=120ddb515dc44080148cb054984befe2d0f543e0;hb=f692b2d39f56ffbafc04283f32233c098aa2978b;hp=e10446ff8c6a90a7712b3369544e41eece65ede8;hpb=23f5654dacb1952c15bda92c2606fae3a55e48ad;p=ctsim.git diff --git a/libctsim/scanner.cpp b/libctsim/scanner.cpp index e10446f..120ddb5 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.23 2001/01/04 21:28:41 kevin Exp $ +** $Id: scanner.cpp,v 1.28 2001/02/02 00:46:38 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 @@ -132,9 +132,8 @@ 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_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,12 @@ 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); +#if 0 + double dAngle = (m_dFieldOfView / 2) / cos (asin (m_dFieldOfView / 2 / m_dFocalLength)); +#endif + double dHalfDetLen = 2 * m_dFocalLength * tan (dAngle); m_detLen = dHalfDetLen * 2; @@ -162,9 +165,8 @@ 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 dAngle1 = atan ((m_dFieldOfView / 2) / m_dFocalLength); + double dHalfSquare = m_dFieldOfView / SQRT2 / 2; double dFocalPastPhm = m_dFocalLength - dHalfSquare; if (dFocalPastPhm <= 0.) { @@ -172,8 +174,9 @@ 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); + m_detLen = 2 * dAngle; m_detInc = m_detLen / m_nDet; if (m_nDet % 2 == 0) // Adjust for Even number of detectors @@ -318,6 +321,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 +539,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 {