r486: no message
[ctsim.git] / libctsim / scanner.cpp
index 453e913f99feff3a30c17a635880512e89b1bdbc..6e2e57ad48bf962af80a9219c9638947f21bc713 100644 (file)
@@ -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.25 2001/01/17 11:00:18 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<double> (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
   {