r150: *** empty log message ***
[ctsim.git] / libctsim / phantom.cpp
index dba6576c8cf2b78761c38a47fca530bab4b8ffec..d07b6a32eae0035242d8c467b5838a55e066655f 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: phantom.cpp,v 1.6 2000/07/13 07:03:21 kevin Exp $
+**  $Id: phantom.cpp,v 1.8 2000/07/18 03:14:35 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
@@ -294,17 +294,15 @@ Phantom::show (void) const
   ymax = ymin + wsize; 
   
   printf("Drawing Phantom:\n\n");
-  printf("    data limits: %9.3g, %9.3g, %9.3g, %9.3g\n",
-        m_xmin, m_ymin, m_xmax, m_ymax);
-  printf("    window size: %9.3g, %9.3g, %9.3g, %9.3g\n",
-        xmin, ymin, xmax, ymax);
+  printf("    data limits: %9.3g, %9.3g, %9.3g, %9.3g\n", m_xmin, m_ymin, m_xmax, m_ymax);
+  printf("    window size: %9.3g, %9.3g, %9.3g, %9.3g\n", xmin, ymin, xmax, ymax);
 
-  gid = sgp2_init(0, 0, "Phantom Show");
+  gid = sgp2_init (0, 0, "Phantom Show");
   sgp2_window (xmin, ymin, xmax, ymax);
 
   draw();
 
-  termgrf2();
+  sgp2_close (gid);
 }
 #endif
 
@@ -338,17 +336,17 @@ Phantom::draw (void) const
 void 
 Phantom::addStdRowland (void)
 {
-  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);
-  addPElem("ellipse",  0.2200,  0.0000, 0.1100,  0.3100, -18.0, -0.02);
-  addPElem("ellipse", -0.2200,  0.0000, 0.1600,  0.4100,  18.0, -0.02);
-  addPElem("ellipse",  0.0000,  0.3500, 0.2100,  0.2500,   0.0,  0.01);
-  addPElem("ellipse",  0.0000,  0.1000, 0.0460,  0.0460,   0.0,  0.01);
-  addPElem("ellipse",  0.0000, -0.1000, 0.0460,  0.0460,   0.0,  0.01);
-  addPElem("ellipse", -0.0800, -0.6050, 0.0460,  0.0230,   0.0,  0.01);
-  addPElem("ellipse",  0.0000, -0.6050, 0.0230,  0.0230,   0.0,  0.01);
-  addPElem("ellipse",  0.0600, -0.6050, 0.0230,  0.0230,   0.0,  0.01);
-  addPElem("ellipse",  0.5538, -0.3858, 0.0330,  0.2060, -18.0,  0.03);
+  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);
+  addPElem ("ellipse",  0.2200,  0.0000, 0.1100,  0.3100, -18.0, -0.02);
+  addPElem ("ellipse", -0.2200,  0.0000, 0.1600,  0.4100,  18.0, -0.02);
+  addPElem ("ellipse",  0.0000,  0.3500, 0.2100,  0.2500,   0.0,  0.01);
+  addPElem ("ellipse",  0.0000,  0.1000, 0.0460,  0.0460,   0.0,  0.01);
+  addPElem ("ellipse",  0.0000, -0.1000, 0.0460,  0.0460,   0.0,  0.01);
+  addPElem ("ellipse", -0.0800, -0.6050, 0.0460,  0.0230,   0.0,  0.01);
+  addPElem ("ellipse",  0.0000, -0.6050, 0.0230,  0.0230,   0.0,  0.01);
+  addPElem ("ellipse",  0.0600, -0.6050, 0.0230,  0.0230,   0.0,  0.01);
+  addPElem ("ellipse",  0.5538, -0.3858, 0.0330,  0.2060, -18.0,  0.03);
 }
 
 void 
@@ -369,27 +367,28 @@ Phantom::addStdRowlandBordered (void)
 void 
 Phantom::addStdHerman (void)
 {
-  addPElem("ellipse",  0.000,  1.50,  0.375, 0.3000,  90.00, -0.003);
-  addPElem("ellipse",  0.675, -0.75,  0.225, 0.1500, 140.00,  0.010);
-  addPElem("ellipse",  0.750,  1.50,  0.375, 0.2250,  50.00,  0.003);
-  addPElem("segment",  1.375, -7.50,  1.100, 0.6250,  19.20, -0.204);
-  addPElem("segment",  1.375, -7.50,  1.100, 4.3200,  19.21,  0.204);
-  addPElem("segment",  0.000, -2.25,  1.125, 0.3750,   0.00, -0.003);
-  addPElem("segment",  0.000, -2.25,  1.125, 3.0000,   0.00,  0.003);
-  addPElem("segment", -1.000,  3.75,  1.000, 0.5000, 135.00, -0.003);
-  addPElem("segment", -1.000,  3.75,  1.000, 3.0000, 135.00,  0.003);
-  addPElem("segment",  1.000,  3.75,  1.000, 0.5000, 225.00, -0.003);
-  addPElem("segment",  1.000,  3.75,  1.000, 3.0000, 225.00,  0.003);
-  addPElem("triangle", 5.025,  3.75,  1.125, 0.5000, 110.75,  0.206);
-  addPElem("triangle",-5.025,  3.75,  1.125, 0.9000,-110.75,  0.206);
-  addPElem("ellipse",  0.000,  0.00,  8.625, 6.4687,  90.00,  0.416);
-  addPElem("ellipse",  0.000,  0.00,  7.875, 5.7187,  90.00, -0.206);
+  addPElem ("ellipse",  0.000,  1.50,  0.375, 0.3000,  90.00, -0.003);
+  addPElem ("ellipse",  0.675, -0.75,  0.225, 0.1500, 140.00,  0.010);
+  addPElem ("ellipse",  0.750,  1.50,  0.375, 0.2250,  50.00,  0.003);
+  addPElem ("segment",  1.375, -7.50,  1.100, 0.6250,  19.20, -0.204);
+  addPElem ("segment",  1.375, -7.50,  1.100, 4.3200,  19.21,  0.204);
+  addPElem ("segment",  0.000, -2.25,  1.125, 0.3750,   0.00, -0.003);
+  addPElem ("segment",  0.000, -2.25,  1.125, 3.0000,   0.00,  0.003);
+  addPElem ("segment", -1.000,  3.75,  1.000, 0.5000, 135.00, -0.003);
+  addPElem ("segment", -1.000,  3.75,  1.000, 3.0000, 135.00,  0.003);
+  addPElem ("segment",  1.000,  3.75,  1.000, 0.5000, 225.00, -0.003);
+  addPElem ("segment",  1.000,  3.75,  1.000, 3.0000, 225.00,  0.003);
+  addPElem ("triangle", 5.025,  3.75,  1.125, 0.5000, 110.75,  0.206);
+  addPElem ("triangle",-5.025,  3.75,  1.125, 0.9000,-110.75,  0.206);
+  addPElem ("ellipse",  0.000,  0.00,  8.625, 6.4687,  90.00,  0.416);
+  addPElem ("ellipse",  0.000,  0.00,  7.875, 5.7187,  90.00, -0.206);
 }
 
 void
 Phantom::addStdHermanBordered (void)
 {
-  addPElem("ellipse", 0., 0., 6.6, 5.9, 90., 0.);
+  addStdHerman();
+  addPElem ("ellipse",  0.000, 0.000, 8.650, 8.650,  0.00, 0.000);
 }
 
 
@@ -452,19 +451,24 @@ Phantom::convertToImagefile (ImageFile& im, const int in_nsample, const int trac
 
   ImageFileArray v = im.getArray();
 
+  for (int ix = 0; ix < colCount; ix++)
+      for (int iy = 0; iy < ny; iy++)
+         v[ix][iy] = 0;
+
   double x_start = xmin + (colStart * xinc);
   for (PElemConstIterator pelem = m_listPElem.begin(); pelem != m_listPElem.end(); pelem++) {
-    double x, y, xi, yi;
-    int ix, iy, kx, ky;
-    for (ix = 0, x = x_start; ix < colCount; ix++, x += xinc) {
-      for (iy = 0, y = ymin; iy < ny; iy++, y += yinc) {
-       for (kx = 0, xi = x + kxofs; kx < nsample; kx++, xi += kxinc) {
-         for (ky = 0, yi = y + kyofs; ky < nsample; ky++, yi += kyinc)
-           if ((*pelem)->isPointInside (xi, yi, PHM_COORD) == TRUE)
-             v[ix][iy] += (*pelem)->atten();
-       } // for kx
-      } /* for iy */
-    }  /* for ix */
+      const PhantomElement& rPElem = **pelem;
+      double x, y, xi, yi;
+      int ix, iy, kx, ky;
+      for (ix = 0, x = x_start; ix < colCount; ix++, x += xinc) {
+         for (iy = 0, y = ymin; iy < ny; iy++, y += yinc) {
+             for (kx = 0, xi = x + kxofs; kx < nsample; kx++, xi += kxinc) {
+                 for (ky = 0, yi = y + kyofs; ky < nsample; ky++, yi += kyinc)
+                     if (rPElem.isPointInside (xi, yi, PHM_COORD) == TRUE)
+                         v[ix][iy] += rPElem.atten();
+             } // for kx
+         } /* for iy */
+      }  /* for ix */
   }  /* for pelem */
   
 
@@ -823,7 +827,7 @@ PhantomElement::clipLineNormalizedCoords (double& x1, double& y1, double& x2, do
 //    false if point lies outside of pelem
 
 bool
-PhantomElement::isPointInside (double x, double y, const CoordType coord_type)
+PhantomElement::isPointInside (double x, double y, const CoordType coord_type) const
 {
   if (coord_type == PHM_COORD) {
     xform_mtx2 (m_xformPhmToObj, x, y);