Interim work on creating projections from an imagefile
[ctsim.git] / include / phantom.h
index f8187c2f3d0d303cb40ac24625ad7ef875932682..b1cb50fe9c7132584299c34bd896d1e802940946 100644 (file)
@@ -7,9 +7,7 @@
 **   Date Started:  July 1, 1984
 **
 **  This is part of the CTSim program
-**  Copyright (C) 1983-2000 Kevin Rosenberg
-**
-**  $Id: phantom.h,v 1.19 2001/01/02 07:47:36 kevin Exp $
+**  Copyright (c) 1983-2009 Kevin Rosenberg
 **
 **  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
@@ -59,17 +57,16 @@ class PhantomElement
     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() const {return m_nPoints;}
     double* rectLimits() {return m_rectLimits;}
-    double* xOutline() {return m_xOutline;}\r
-    double* yOutline() {return m_yOutline;}\r
-    double* const xOutline() const {return m_xOutline;}\r
-    double* const yOutline() const {return m_yOutline;}\r
+    double* xOutline() {return m_xOutline;}
+    double* yOutline() {return m_yOutline;}
+    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;}
@@ -78,39 +75,36 @@ class PhantomElement
     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;}\r
-\r
+    const double v() const {return m_v;}
+
+    static PhmElemType convertNameToType (const char* const typeName);
+
     void printDefinition (std::ostream& os) const;
     void printDefinition (std::ostringstream& os) const;
 
  private:
-    PhmElemType m_type;             // pelem type (box, ellipse, etc)
-    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 
-    double m_xmin, m_xmax, m_ymin, m_ymax;  // pelem limits 
-    double m_diameter;      
+    PhmElemType m_type;      // pelem type (box, ellipse, etc)
+    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
+    double m_xmin, m_xmax, m_ymin, m_ymax;  // pelem limits
     GRFMTX_2D m_xformPhmToObj;        // map from phantom to normalized pelem coords
-    GRFMTX_2D m_xformObjToPhm;        // map from normalized pelem coords to phantom coords 
+    GRFMTX_2D m_xformObjToPhm;        // map from normalized pelem coords to phantom coords
     double* m_xOutline;
     double* m_yOutline;
     double  m_rectLimits[4];
 
     static const int POINTS_PER_CIRCLE;
-    static const double SCALE_PELEM_EXTENT;  // increase pelem limits by 0.5% 
+    static const double SCALE_PELEM_EXTENT;  // increase pelem limits by 0.5%
 
-    static PhmElemType convertNameToType (const char* const typeName);
-    static const char* const convertTypeToName (PhmElemType iType);\r
+    static const char* const convertTypeToName (PhmElemType iType);
 
     void makeTransformMatrices ();
-
     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);
-
     void calcEllipsePoints (double x[], double y[], const int pts, const double u, const double v);
 
     static int numCirclePoints (double theta);
@@ -122,8 +116,8 @@ class PhantomElement
 
 typedef enum {
     P_PELEMS,        // Phantom made of PElems
-    P_UNIT_PULSE,   // Special phantom, not made of pelems 
-    P_FILTER     // defined only by this type
+    P_UNIT_PULSE,   // Special phantom, not made of pelems
+    P_FILTER      // defined only by this type
 } PhantomComposition;
 
 
@@ -138,9 +132,7 @@ class Phantom
  public:
     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 ();
@@ -149,59 +141,61 @@ class Phantom
     ~Phantom ();
 
     void setComposition (PhantomComposition composition)
-       { m_composition = composition; }
+        { m_composition = composition; }
 
     const PhantomComposition getComposition () const
-       { return m_composition; }
+        { return m_composition; }
 
     bool createFromPhantom (const char* const phmName);
-
     bool createFromPhantom (const int phmid);
-
-    bool createFromFile (const char* const fname);
-\r
-    bool fileWrite (const char* const fname);\r
+    bool createFromPhmFile (const char* const fname);
+    bool createFromImageFile (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, bool bStoreAtColumnPos) const;
+    void convertToImagefile (ImageFile& im, double dViewRatio, const int in_nsample, const int trace) const;
+    void convertToImagefile (ImageFile& im, double dViewRatio, const int in_nsample, const int trace,
+      const int colStart, const int colCount, bool bStoreAtColumnPos) const;
+    void convertToImagefile (ImageFile& im, int iNX, double dViewRatio, const int in_nsample, const int trace,
+      const int colStart, const int colCount, int iStorageOffset) const;
 
-    void convertToImagefile (ImageFile& im, const int in_nsample, const int trace) const;
-\r
-    void printDefinitions (std::ostream& os) const;\r
-    void printDefinitions (std::ostringstream& os) const;\r
+    void printDefinitions (std::ostream& os) const;
+    void printDefinitions (std::ostringstream& os) const;
 
     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
+#ifdef HAVE_SGP
     void show () const;
     void show (SGP& sgp) const;
     void draw (SGP& sgp) const;
 #endif
-    
+
     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));}
+    double maxAxisLength () const
+    {  return maxValue<double> (m_xmax - m_xmin, m_ymax - m_ymin); }
+
+    double getDiameterBoundaryCircle() const
+    { return SQRT2 * maxAxisLength(); }
 
-    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;}
+          std::list<PhantomElement*>& listPElem() {return m_listPElem;}
     const std::list<PhantomElement*>& listPElem() const {return m_listPElem;}
     const int nPElem() const {return m_nPElem;}
+    const bool isImagefile(void) const { return m_im != NULL; }
+    const ImageFile* getImagefile() const { return m_im; }
 
     static const int getPhantomCount() {return s_iPhantomCount;}
     static const char** getPhantomNameArray() {return s_aszPhantomName;}
@@ -212,18 +206,17 @@ class Phantom
 
  private:
     PhantomComposition m_composition;
-    int m_nPElem;                          // number of pelems in phantom 
+    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 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;
+    ImageFile* m_im;                  // If defining a phantom from an ImageFile
 
     void init();