r184: *** empty log message ***
[ctsim.git] / libctsim / phantom.cpp
index d16bf5bb42e8d2e7d35a93cec3fc925f081c1aaa..c74c37a19252a0406df097b5f969d632a1e41ac0 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: phantom.cpp,v 1.12 2000/07/28 10:51:31 kevin Exp $
+**  $Id: phantom.cpp,v 1.16 2000/08/25 15:59:13 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
 
 const int Phantom::PHM_INVALID = -1;
 const int Phantom::PHM_HERMAN = 0;
-const int Phantom::PHM_BHERMAN = 1;
-const int Phantom::PHM_ROWLAND = 2;
-const int Phantom::PHM_BROWLAND = 3;
+const int Phantom::PHM_B_HERMAN = 1;
+const int Phantom::PHM_SHEPP_LOGAN = 2;
+const int Phantom::PHM_B_SHEPP_LOGAN = 3;
 const int Phantom::PHM_UNITPULSE = 4;
 
 const char* Phantom::s_aszPhantomName[] = 
 {
   {"herman"},
-  {"bherman"},
-  {"rowland"},
-  {"browland"},
+  {"herman-b"},
+  {"shepp-logan"},
+  {"shepp-logan-b"},
   {"unitpulse"},
 };
 
 const char* Phantom::s_aszPhantomTitle[] = 
 {
   {"Herman Head"},
-  {"Herman Head Bordered"},
-  {"Rowland Head"},
-  {"Rowland Head Bordered"},
+  {"Herman Head (Bordered)"},
+  {"Shepp-Logan"},
+  {"Shepp-Logan (Bordered)"},
   {"Unit Pulse"},
 };
 
@@ -155,14 +155,14 @@ Phantom::createFromPhantom (const int phmid)
     case PHM_HERMAN:
       addStdHerman();
       break;
-    case PHM_BHERMAN:
+    case PHM_B_HERMAN:
       addStdHermanBordered();
       break;
-    case PHM_ROWLAND:
-      addStdRowland();
+    case PHM_SHEPP_LOGAN:
+      addStdSheppLogan();
       break;
-    case PHM_BROWLAND:
-      addStdRowlandBordered ();
+    case PHM_B_SHEPP_LOGAN:
+      addStdSheppLoganBordered();
       break;
     case PHM_UNITPULSE:
       m_composition = P_UNIT_PULSE;
@@ -204,19 +204,25 @@ Phantom::createFromFile (const char* const fname)
     return (false);
 
   do {
-    double cx, cy, u, v, rot, dens;
-    char pelemtype[80];
-    int n = fscanf (fp, "%79s %lf %lf %lf %lf %lf %lf",
-               pelemtype, &cx, &cy, &u, &v, &rot, &dens);
+    if (! feof(fp)) {
+      double cx, cy, u, v, rot, dens;
+      char pelemtype[80];
+      char str[1024];
+      fgets (str, sizeof(str), fp);
+      int n = sscanf (str, "%79s %lf %lf %lf %lf %lf %lf", pelemtype, &cx, &cy, &u, &v, &rot, &dens);
     
-    if (n == EOF || n == 0) {  /* end of file */
-      stoploop = true;
-      retval = false;
-    } else if (n != 7) {
-      stoploop = true;
-      retval = false;
+      if (n == EOF || n == 0) {        /* end of file */
+       stoploop = true;
+       retval = false;
+      } else if (n != 7) {
+       stoploop = true;
+       retval = false;
+      } else {
+       addPElem (pelemtype, cx, cy, u, v, rot, dens);
+       retval = true;
+      }
     } else {
-      addPElem (pelemtype, cx, cy, u, v, rot, dens);
+      stoploop = true;
       retval = true;
     }
   } while (stoploop == false);
@@ -308,11 +314,29 @@ Phantom::show () const
 {
   SGPDriver driverSGP ("Phantom Show");
   SGP sgp (driverSGP);
-  draw (sgp);
+
+  show (sgp);
 
   cout << "Press return to continue";
   cio_kb_getc();
 }
+
+void 
+Phantom::show (SGP& sgp) const
+{
+  double wsize = m_xmax - m_xmin;
+  if ((m_ymax - m_ymin) > wsize) 
+      wsize = m_ymax - m_ymin;
+  wsize *= 1.01;
+  double halfWindow = wsize / 2;
+
+  double xcent = m_xmin + (m_xmax - m_xmin) / 2;
+  double ycent = m_ymin + (m_ymax - m_ymin) / 2;
+
+  sgp.setWindow (xcent - halfWindow, ycent - halfWindow, xcent + halfWindow, ycent + halfWindow);
+
+  draw (sgp);
+}
 #endif
 
 
@@ -327,18 +351,6 @@ Phantom::show () const
 void 
 Phantom::draw (SGP& sgp) const
 {
-  double wsize = m_xmax - m_xmin;
-  double xmin = m_xmin;
-  double ymin = m_ymin;
-
-  if ((m_ymax - m_ymin) > wsize) 
-      wsize = m_ymax - m_ymin;
-  wsize *= 1.01;
-
-  double xmax = xmin + wsize;
-  double ymax = ymin + wsize; 
-
-  sgp.setWindow (xmin, ymin, xmax, ymax);
   for (PElemIterator i = m_listPElem.begin(); i != m_listPElem.end(); i++)
     sgp.polylineAbs ((*i)->xOutline(), (*i)->yOutline(), (*i)->nOutlinePoints());
 }
@@ -346,7 +358,7 @@ Phantom::draw (SGP& sgp) const
 
 
 /* NAME
- *   addStdRowland             Make head phantom of S.W. Rowland
+ *   addStdSheppLogan  Make head phantom of Shepp-Logan
  *
  * REFERENCES
  *   S. W. Rowland, "Computer Implementation of Image Reconstruction
@@ -355,7 +367,7 @@ Phantom::draw (SGP& sgp) const
  */
 
 void 
-Phantom::addStdRowland ()
+Phantom::addStdSheppLogan ()
 {
   addPElem ("ellipse",  0.0000,  0.0000, 0.6900,  0.9200,   0.0,  1.00);
   addPElem ("ellipse",  0.0000, -0.0184, 0.6624,  0.8740,   0.0, -0.98);
@@ -371,9 +383,9 @@ Phantom::addStdRowland ()
 }
 
 void 
-Phantom::addStdRowlandBordered ()
+Phantom::addStdSheppLoganBordered ()
 {
-  addStdRowland ();
+  addStdSheppLogan ();
   addPElem ("rectangle", 0.000, 0.0000, 0.7500, 1.000, 0.0, 0.00);
 }
 
@@ -409,7 +421,7 @@ void
 Phantom::addStdHermanBordered ()
 {
   addStdHerman();
-  addPElem ("rectangle",  0.000, 0.000, 8.650, 8.650,  0.00, 0.000);
+  addPElem ("rectangle",  0.000, 0.00, 9.000, 6.800,  0.00, 0.000);
 }