r117: *** empty log message ***
[ctsim.git] / libctsim / phantom.cpp
index ec5d0dcf6e0525cc38af1f1365091dbb81889e4b..c0804932d1189f931b462b576fad3062357e298a 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: phantom.cpp,v 1.3 2000/06/19 20:08:09 kevin Exp $
+**  $Id: phantom.cpp,v 1.4 2000/06/22 10:17:28 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
 //
 
 Phantom::Phantom (void)
+{
+  init ();
+}
+
+
+Phantom::Phantom (const char* const phmName)
+{
+  init ();
+  createFromPhantom (phmName);
+}
+
+void 
+Phantom::init (void)
 {
   m_nPElem = 0;
   m_xmin = 1E30;
@@ -41,9 +54,10 @@ Phantom::Phantom (void)
   m_ymax = -1E30;
   m_diameter = 0;
   m_composition = P_PELEMS;
+  m_fail = false;
+  m_id = PHM_INVALID;
 }
 
-
 Phantom::~Phantom (void)
 {
   for (PElemIterator i = m_listPElem.begin(); i != m_listPElem.end(); i++) {
@@ -52,29 +66,89 @@ Phantom::~Phantom (void)
 }
 
 
-void
-Phantom::create (const int phmid)
+const char*
+Phantom::convertPhantomIDToName (const PhantomID phmID)
+{
+  const char *name = "";
+
+  if (phmID == PHM_HERMAN)
+    name = PHM_HERMAN_STR;
+  else if (phmID == PHM_BHERMAN)
+    name = PHM_BHERMAN_STR;
+  else if (phmID == PHM_ROWLAND)
+    name = PHM_ROWLAND_STR;
+  else if (phmID == PHM_BROWLAND)
+    name = PHM_BROWLAND_STR;
+  else if (phmID == PHM_UNITPULSE)
+    name = PHM_UNITPULSE_STR;
+
+  return (name);
+}
+      
+Phantom::PhantomID
+Phantom::convertNameToPhantomID (const char* const phmName) 
+{
+  PhantomID id;
+
+  if (strcasecmp (phmName, PHM_HERMAN_STR) == 0)
+    id = PHM_HERMAN;
+  else if (strcasecmp (phmName, PHM_BHERMAN_STR) == 0)
+    id = PHM_BHERMAN;
+  else if (strcasecmp (phmName, PHM_ROWLAND_STR) == 0)
+    id = PHM_ROWLAND;
+  else if (strcasecmp (phmName, PHM_BROWLAND_STR) == 0)
+    id = PHM_BROWLAND;
+  else if (strcasecmp (phmName, PHM_UNITPULSE_STR) == 0)
+    id = PHM_UNITPULSE;
+  else
+    id = PHM_INVALID;
+
+  return (id);
+}
+  
+
+bool
+Phantom::createFromPhantom (const char* const phmName)
+{
+  PhantomID phmid = convertNameToPhantomID (phmName);
+  m_name = phmName;
+
+  createFromPhantom (phmid);
+}
+
+bool
+Phantom::createFromPhantom (const PhantomID phmid)
 {
   switch (phmid) 
     {
-    case O_PHM_HERMAN:
+    case PHM_HERMAN:
       addStdHerman();
       break;
-    case O_PHM_ROWLAND:
+    case PHM_BHERMAN:
+      addStdHermanBordered();
+      break;
+    case PHM_ROWLAND:
       addStdRowland();
       break;
-    case O_PHM_BROWLAND:
+    case PHM_BROWLAND:
       addStdRowlandBordered ();
       break;
-    case O_PHM_UNITPULSE:
+    case PHM_UNITPULSE:
       m_composition = P_UNIT_PULSE;
       addPElem ("rectangle", 0., 0., 100., 100., 0., 0.);     // outline 
       addPElem ("ellipse", 0., 0., 1., 1., 0., 1.);          // pulse 
       break;
     default:
       sys_error (ERR_WARNING, "Illegal phantom id %d\n", phmid);
+      m_name += " -- INVALID";
+      m_fail = true;
+      return false;
       break;
     }
+
+  m_id = phmid;
+
+  return true;
 }
 
 
@@ -238,14 +312,14 @@ Phantom::show (void) const
  *   draw ()
  */
 
+#ifdef HAVE_SGP
 void 
 Phantom::draw (void) const
 {
-#ifdef HAVE_SGP
   for (PElemIterator i = m_listPElem.begin(); i != m_listPElem.end(); i++)
     sgp2_polyline_abs ((*i)->xOutline(), (*i)->yOutline(), (*i)->nOutlinePoints());
-#endif
 }
+#endif
 
 
 /* NAME
@@ -308,6 +382,12 @@ Phantom::addStdHerman (void)
   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.);
+}
+
 
 /* NAME
  *    convertToImagefile               Make image array from Phantom
@@ -408,20 +488,7 @@ PhantomElement::PhantomElement (const char *type, const double cx, const double
 {
   m_rot = convertDegreesToRadians (rot);   // convert angle to radians
 
-  if (strcasecmp (type, "rectangle") == 0)
-    m_type = PELEM_RECTANGLE;
-  else if (strcasecmp (type, "triangle") == 0)
-    m_type = PELEM_TRIANGLE;
-  else if (strcasecmp (type, "ellipse") == 0)
-    m_type = PELEM_ELLIPSE;
-  else if (strcasecmp (type, "sector") == 0)
-    m_type = PELEM_SECTOR;
-  else if (strcasecmp (type, "segment") == 0)
-    m_type = PELEM_SEGMENT;
-  else {
-    sys_error (ERR_WARNING, "Unknown PhantomElement type %s [PhantomElement::PhantomElement]", type);
-    m_type = PELEM_INVALID;
-  }
+  m_type = convertNameToType (type);
 
   makeTransformMatrices ();     // calc transform matrices between phantom and normalized phantomelement
   makeVectorOutline ();                // calculate vector outline of pelem 
@@ -446,6 +513,27 @@ PhantomElement::~PhantomElement (void)
     delete m_yOutline;
 }
 
+PhmElemType
+PhantomElement::convertNameToType (const char* const typeName)
+{
+    PhmElemType type = PELEM_INVALID;
+
+    if (strcasecmp (typeName, "rectangle") == 0)
+       type = PELEM_RECTANGLE;
+    else if (strcasecmp (typeName, "triangle") == 0)
+       type = PELEM_TRIANGLE;
+    else if (strcasecmp (typeName, "ellipse") == 0)
+       type = PELEM_ELLIPSE;
+    else if (strcasecmp (typeName, "sector") == 0)
+       type = PELEM_SECTOR;
+    else if (strcasecmp (typeName, "segment") == 0)
+      type = PELEM_SEGMENT;
+    else
+       sys_error (ERR_WARNING, "Unknown PhantomElement type %s [PhantomElement::PhantomElement]", type);
+
+    return (type);
+}
+
 void 
 PhantomElement::makeTransformMatrices (void)
 {
@@ -486,8 +574,6 @@ PhantomElement::makeTransformMatrices (void)
  *   Called by phm_add_pelem()
  */
 
-static const double SCALE_PELEM_EXTENT=0.005;          // increase pelem limits by 0.5% 
-
 void
 PhantomElement::makeVectorOutline (void)
 {
@@ -578,7 +664,6 @@ PhantomElement::makeVectorOutline (void)
 }
 
 
-
 /* NAME
  *   calc_arc                  Calculate outline of a arc of a circle
  *
@@ -642,10 +727,9 @@ PhantomElement::calcEllipsePoints (double x[], double y[], const int pts, const
  */
 
 int 
-PhantomElement::numCirclePoints (double theta) const
+PhantomElement::numCirclePoints (double theta)
 {
-    if (theta < 0.0 || theta > TWOPI)
-      sys_error(ERR_WARNING, "illegal values sent to circle_pts");
+    theta = clamp (theta, 0., TWOPI);
 
     return static_cast<int> (POINTS_PER_CIRCLE * theta / TWOPI + 1.5);
 }