r348: fix linefeed problem
[ctsim.git] / include / phantom.h
index b3765c687970562ce7a44e365f9ebf5ceb0707b1..286f3ed0e94e68603d37051a989cac8f6803a415 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: phantom.h,v 1.3 2000/06/22 10:17:28 kevin Exp $
+**  $Id: phantom.h,v 1.20 2001/01/02 16:02:12 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
@@ -28,8 +28,8 @@
 #ifndef PHANTOM_H
 #define PHANTOM_H
 
-#include <slist>
-using namespace std;
+#include <list>
+#include "ctsupport.h"
 
 typedef enum {
     PELEM_INVALID,
@@ -54,35 +54,40 @@ class PhantomElement
  public:
     PhantomElement (const char* const type, const double cx, const double cy, const double u, const double v, const double rot, const double atten);
 
-    ~PhantomElement (void);
+    ~PhantomElement ();
 
-    bool isPointInside (double x, double y, const CoordType coord_type);
+    bool isPointInside (double x, double y, const CoordType coord_type) const;
 
     bool clipLineNormalizedCoords (double& x1, double& y1, double& x2, double& y2) const;
  
     bool clipLineWorldCoords (double& x1, double& y1, double& x2, double& y2) const;
 
-    const int nOutlinePoints(void) const {return m_nPoints;}
-    double* rectLimits(void) {return m_rectLimits;}
+    const int nOutlinePoints() const {return m_nPoints;}
+    double* rectLimits() {return m_rectLimits;}
     double* xOutline() {return m_xOutline;}
     double* yOutline() {return m_yOutline;}
-    const double atten(void) const {return m_atten;}
-    const double diameter(void) const {return m_diameter;}
-    const double xmin(void) const {return m_xmin;}
-    const double xmax(void) const {return m_xmax;}
-    const double ymin(void) const {return m_ymin;}
-    const double ymax(void) const {return m_ymax;}
-    const double rot(void) const {return m_rot;}
-    const double cx(void) const {return m_cx;}
-    const double cy(void) const {return m_cy;}
-    const double u(void) const {return m_u;}
-    const double v(void) const {return m_v;}
+    double* const xOutline() const {return m_xOutline;}
+    double* const yOutline() const {return m_yOutline;}
+    const double atten() const {return m_atten;}
+    const double diameter() const {return m_diameter;}
+    const double xmin() const {return m_xmin;}
+    const double xmax() const {return m_xmax;}
+    const double ymin() const {return m_ymin;}
+    const double ymax() const {return m_ymax;}
+    const double rot() const {return m_rot;}
+    const double cx() const {return m_cx;}
+    const double cy() const {return m_cy;}
+    const double u() const {return m_u;}
+    const double v() const {return m_v;}
+
+    void printDefinition (std::ostream& os) const;
+    void printDefinition (std::ostringstream& os) const;
 
  private:
     PhmElemType m_type;             // pelem type (box, ellipse, etc)
-    double m_atten;         // X-ray attenuation coefficient
     double m_cx, m_cy;      // center of pelem 
     double m_u, m_v;                // size of pelem 
+    double m_atten;         // X-ray attenuation coefficient
     double m_rot;                   // pelem rotation angle (in radians) 
     double *m_x, *m_y;      // ptr to array of points in obj world coord 
     int m_nPoints;                  // number of points in outline arrays 
@@ -94,14 +99,15 @@ class PhantomElement
     double* m_yOutline;
     double  m_rectLimits[4];
 
-    static const int POINTS_PER_CIRCLE = 360;
-    static const double SCALE_PELEM_EXTENT=0.005;  // increase pelem limits by 0.5% 
+    static const int POINTS_PER_CIRCLE;
+    static const double SCALE_PELEM_EXTENT;  // increase pelem limits by 0.5% 
 
-    static PhmElemType PhantomElement::convertNameToType (const char* const typeName);
+    static PhmElemType convertNameToType (const char* const typeName);
+    static const char* const convertTypeToName (PhmElemType iType);
 
-    void makeTransformMatrices (void);
+    void makeTransformMatrices ();
 
-    void makeVectorOutline (void);
+    void makeVectorOutline ();
 
     void calcArcPoints (double x[], double y[], const int pts, const double xcent, const double ycent, const double r, const double start, const double stop);
 
@@ -109,6 +115,8 @@ class PhantomElement
 
     static int numCirclePoints (double theta);
 
+    PhantomElement (const PhantomElement& rhs);        // copy constructor
+    PhantomElement& operator= (const PhantomElement&); // assignment operator
 };
 
 
@@ -118,101 +126,112 @@ typedef enum {
     P_FILTER     // defined only by this type
 } PhantomComposition;
 
-// Phantom class 
 
+//////////////////////////////////////////////////////
+// Phantom Class Declaration
+//////////////////////////////////////////////////////
+
+class SGP;
+class ImageFile;
 class Phantom
 {
  public:
-    typedef enum {
-      PHM_INVALID,
-      PHM_HERMAN,               /* Herman head phantom */
-      PHM_BHERMAN,              /* Bordered Herman head phantom */
-      PHM_ROWLAND,              /* Rowland head phantom */
-      PHM_BROWLAND,             /* Bordered Rowland head phantom */
-      PHM_UNITPULSE             /* Unit pulse phantom */
-    } PhantomID;
-
-
-    Phantom (void);
+    static const int PHM_INVALID;
+    static const int PHM_HERMAN;
+    static const int PHM_B_HERMAN;
+    static const int PHM_SHEPP_LOGAN;
+    static const int PHM_B_SHEPP_LOGAN;
+    static const int PHM_UNITPULSE;
+
+    Phantom ();
     Phantom (const char* const phmName);
 
-    ~Phantom (void);
+    ~Phantom ();
 
     void setComposition (PhantomComposition composition)
        { m_composition = composition; }
 
-    const PhantomComposition getComposition (void) const
+    const PhantomComposition getComposition () const
        { return m_composition; }
 
     bool createFromPhantom (const char* const phmName);
 
-    bool createFromPhantom (const PhantomID phmid);
+    bool createFromPhantom (const int phmid);
 
     bool createFromFile (const char* const fname);
 
+    bool fileWrite (const char* const fname);
+
     void addPElem (const PhantomElement& pelem);
 
     void addPElem (const char* const composition, const double cx, const double cy, const double u, const double v, const double rot, const double atten);
 
-    void convertToImagefile (ImageFile& im, const int in_nsample, const int trace, const int colStart, const int colCount) const;
+    void convertToImagefile (ImageFile& im, const int in_nsample, const int trace, const int colStart, const int colCount, bool bStoreAtColumnPos) const;
 
     void convertToImagefile (ImageFile& im, const int in_nsample, const int trace) const;
 
-    bool fail(void) const 
-      {return m_fail;}
+    void printDefinitions (std::ostream& os) const;
+    void printDefinitions (std::ostringstream& os) const;
 
-    const string& name(void) const
-      {return m_name;}
-
-    const PhantomID id(void) const
-      {return m_id;}
+    bool fail() const             {return m_fail;}
+    const std::string& failMessage() const {return m_failMessage;}
+    const std::string& name() const     {return m_name;}
+    const int id() const     {return m_id;}
 
 #if HAVE_SGP
-    void show (void) const;
-    void draw (void) const;
+    void show () const;
+    void show (SGP& sgp) const;
+    void draw (SGP& sgp) const;
 #endif
     
-    void addStdHerman (void);
-    void addStdHermanBordered (void);
-    void addStdRowland (void);
-    void addStdRowlandBordered (void);
-
-    void print (void) const;
-
-    const double maxAxisLength (void) const {return (((m_xmax - m_xmin) > (m_ymax - m_ymin)) ? (m_xmax - m_xmin) : (m_ymax - m_ymin));}
-
-    const double diameter(void) const {return m_diameter;}
-    const double xmin(void) const {return m_xmin;}
-    const double xmax(void) const {return m_xmax;}
-    const double ymin(void) const {return m_ymin;}
-    const double ymax(void) const {return m_ymax;}
-    slist<PhantomElement*>& listPElem(void) {return m_listPElem;}
-    const slist<PhantomElement*>& listPElem(void) const {return m_listPElem;}
-    const int nPElem(void) const {return m_nPElem;}
+    void addStdHerman ();
+    void addStdHermanBordered ();
+    void addStdSheppLogan ();
+    void addStdSheppLoganBordered ();
+
+    void print (std::ostream& os) const;
+    void print (std::ostringstream& os) const;
+
+    const double maxAxisLength () const {return (((m_xmax - m_xmin) > (m_ymax - m_ymin)) ? (m_xmax - m_xmin) : (m_ymax - m_ymin));}
+
+    const double diameter() const {return m_diameter;}
+    const double xmin() const {return m_xmin;}
+    const double xmax() const {return m_xmax;}
+    const double ymin() const {return m_ymin;}
+    const double ymax() const {return m_ymax;}
+         std::list<PhantomElement*>& listPElem() {return m_listPElem;}
+    const std::list<PhantomElement*>& listPElem() const {return m_listPElem;}
+    const int nPElem() const {return m_nPElem;}
+
+    static const int getPhantomCount() {return s_iPhantomCount;}
+    static const char** getPhantomNameArray() {return s_aszPhantomName;}
+    static const char** getPhantomTitleArray() {return s_aszPhantomTitle;}
+    static int convertNameToPhantomID (const char* const phmName);
+    static const char* convertPhantomIDToName (const int phmID);
+    static const char* convertPhantomIDToTitle (const int phmID);
 
  private:
     PhantomComposition m_composition;
     int m_nPElem;                          // number of pelems in phantom 
     double m_xmin, m_xmax, m_ymin, m_ymax;  // extent of pelems in pelem coordinates
     double m_diameter;                        // diameter of object
-    mutable slist<PhantomElement*> m_listPElem;      // pelem lists
-    string m_name;
-    PhantomID m_id;
+    mutable std::list<PhantomElement*> m_listPElem;      // pelem lists
+    std::string m_name;
+    int m_id;
     bool m_fail;
+    std::string m_failMessage;
+
+    static const char* s_aszPhantomName[];
+    static const char* s_aszPhantomTitle[];
+    static const int s_iPhantomCount;
 
-    // Standard phantomsa
-    static const char PHM_HERMAN_STR[]=    "herman";
-    static const char PHM_BHERMAN_STR[]=   "bherman";
-    static const char PHM_ROWLAND_STR[]=   "rowland";
-    static const char PHM_BROWLAND_STR[]=  "browland";
-    static const char PHM_UNITPULSE_STR[]= "unitpulse";
-    static PhantomID convertNameToPhantomID (const char* const phmName);
-    static const char* convertPhantomIDToName (const PhantomID phmID);
+    void init();
 
-    void init(void);
+    Phantom (const Phantom& rhs);        // copy constructor
+    Phantom& operator= (const Phantom&); // assignment operator
 };
 
-typedef slist<PhantomElement*>::iterator PElemIterator;
-typedef slist<PhantomElement*>::const_iterator PElemConstIterator;
+typedef std::list<PhantomElement*>::iterator PElemIterator;
+typedef std::list<PhantomElement*>::const_iterator PElemConstIterator;
 
 #endif