r244: *** empty log message ***
[ctsim.git] / include / phantom.h
1 /*****************************************************************************
2 ** FILE IDENTIFICATION
3 **
4 **   Name:          phantom.h
5 **   Purpose:       Header file for Phantom objects
6 **   Programmer:    Kevin Rosenberg
7 **   Date Started:  July 1, 1984
8 **
9 **  This is part of the CTSim program
10 **  Copyright (C) 1983-2000 Kevin Rosenberg
11 **
12 **  $Id: phantom.h,v 1.15 2000/12/04 05:36:57 kevin Exp $
13 **
14 **  This program is free software; you can redistribute it and/or modify
15 **  it under the terms of the GNU General Public License (version 2) as
16 **  published by the Free Software Foundation.
17 **
18 **  This program is distributed in the hope that it will be useful,
19 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 **  GNU General Public License for more details.
22 **
23 **  You should have received a copy of the GNU General Public License
24 **  along with this program; if not, write to the Free Software
25 **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 ******************************************************************************/
27
28 #ifndef PHANTOM_H
29 #define PHANTOM_H
30
31 #ifndef MSVC\r
32 #include <slist>
33 #endif\r
34 #include "ctsupport.h"
35
36 using namespace std;
37
38 typedef enum {
39     PELEM_INVALID,
40     PELEM_RECTANGLE,
41     PELEM_TRIANGLE,
42     PELEM_ELLIPSE,
43     PELEM_SECTOR,
44     PELEM_SEGMENT
45 } PhmElemType;
46
47 /* Codes for Coordinate Types      */
48 /* Defines coords for isPointInside() */
49
50 typedef enum {
51   PELEM_COORD,         /* Normalized PElem Coordinates */
52   PHM_COORD           /* World phantom Coordinates */
53 } CoordType;
54
55
56 class PhantomElement
57 {
58  public:
59     PhantomElement (const char* const type, const double cx, const double cy, const double u, const double v, const double rot, const double atten);
60
61     ~PhantomElement ();
62
63     bool isPointInside (double x, double y, const CoordType coord_type) const;
64
65     bool clipLineNormalizedCoords (double& x1, double& y1, double& x2, double& y2) const;
66  
67     bool clipLineWorldCoords (double& x1, double& y1, double& x2, double& y2) const;
68
69     const int nOutlinePoints() const {return m_nPoints;}
70     double* rectLimits() {return m_rectLimits;}
71     double* xOutline() {return m_xOutline;}
72     double* yOutline() {return m_yOutline;}
73     const double atten() const {return m_atten;}
74     const double diameter() const {return m_diameter;}
75     const double xmin() const {return m_xmin;}
76     const double xmax() const {return m_xmax;}
77     const double ymin() const {return m_ymin;}
78     const double ymax() const {return m_ymax;}
79     const double rot() const {return m_rot;}
80     const double cx() const {return m_cx;}
81     const double cy() const {return m_cy;}
82     const double u() const {return m_u;}
83     const double v() const {return m_v;}
84
85  private:
86     PhmElemType m_type;      // pelem type (box, ellipse, etc)
87     double m_cx, m_cy;       // center of pelem 
88     double m_u, m_v;                 // size of pelem 
89     double m_atten;          // X-ray attenuation coefficient
90     double m_rot;                    // pelem rotation angle (in radians) 
91     double *m_x, *m_y;       // ptr to array of points in obj world coord 
92     int m_nPoints;                   // number of points in outline arrays 
93     double m_xmin, m_xmax, m_ymin, m_ymax;  // pelem limits 
94     double m_diameter;       
95     GRFMTX_2D m_xformPhmToObj;        // map from phantom to normalized pelem coords
96     GRFMTX_2D m_xformObjToPhm;        // map from normalized pelem coords to phantom coords 
97     double* m_xOutline;
98     double* m_yOutline;
99     double  m_rectLimits[4];
100
101     static const int POINTS_PER_CIRCLE;
102     static const double SCALE_PELEM_EXTENT;  // increase pelem limits by 0.5% 
103
104     static PhmElemType PhantomElement::convertNameToType (const char* const typeName);
105
106     void makeTransformMatrices ();
107
108     void makeVectorOutline ();
109
110     void calcArcPoints (double x[], double y[], const int pts, const double xcent, const double ycent, const double r, const double start, const double stop);
111
112     void calcEllipsePoints (double x[], double y[], const int pts, const double u, const double v);
113
114     static int numCirclePoints (double theta);
115
116     PhantomElement (const PhantomElement& rhs);        // copy constructor
117     PhantomElement& operator= (const PhantomElement&); // assignment operator
118 };
119
120
121 typedef enum {
122     P_PELEMS,        // Phantom made of PElems
123     P_UNIT_PULSE,   // Special phantom, not made of pelems 
124     P_FILTER      // defined only by this type
125 } PhantomComposition;
126
127
128 //////////////////////////////////////////////////////
129 // Phantom Class Declaration
130 //////////////////////////////////////////////////////
131
132 class SGP;
133 class ImageFile;
134 class Phantom
135 {
136  public:
137     static const int PHM_INVALID;
138     static const int PHM_HERMAN;
139     static const int PHM_B_HERMAN;
140     static const int PHM_SHEPP_LOGAN;
141     static const int PHM_B_SHEPP_LOGAN;
142     static const int PHM_UNITPULSE;
143
144     Phantom ();
145     Phantom (const char* const phmName);
146
147     ~Phantom ();
148
149     void setComposition (PhantomComposition composition)
150         { m_composition = composition; }
151
152     const PhantomComposition getComposition () const
153         { return m_composition; }
154
155     bool createFromPhantom (const char* const phmName);
156
157     bool createFromPhantom (const int phmid);
158
159     bool createFromFile (const char* const fname);
160
161     void addPElem (const PhantomElement& pelem);
162
163     void addPElem (const char* const composition, const double cx, const double cy, const double u, const double v, const double rot, const double atten);
164
165     void convertToImagefile (ImageFile& im, const int in_nsample, const int trace, const int colStart, const int colCount, bool bStoreAtColumnPos) const;
166
167     void convertToImagefile (ImageFile& im, const int in_nsample, const int trace) const;
168
169     bool fail() const             {return m_fail;}
170     const string& failMessage() const {return m_failMessage;}
171     const string& name() const     {return m_name;}
172     const int id() const     {return m_id;}
173
174 #if HAVE_SGP
175     void show () const;
176     void show (SGP& sgp) const;
177     void draw (SGP& sgp) const;
178 #endif
179     
180     void addStdHerman ();
181     void addStdHermanBordered ();
182     void addStdSheppLogan ();
183     void addStdSheppLoganBordered ();
184
185     void print () const;
186
187     const double maxAxisLength () const {return (((m_xmax - m_xmin) > (m_ymax - m_ymin)) ? (m_xmax - m_xmin) : (m_ymax - m_ymin));}
188
189     const double diameter() const {return m_diameter;}
190     const double xmin() const {return m_xmin;}
191     const double xmax() const {return m_xmax;}
192     const double ymin() const {return m_ymin;}
193     const double ymax() const {return m_ymax;}
194     slist<PhantomElement*>& listPElem() {return m_listPElem;}
195     const slist<PhantomElement*>& listPElem() const {return m_listPElem;}
196     const int nPElem() const {return m_nPElem;}
197
198     static const int getPhantomCount() {return s_iPhantomCount;}
199     static const char** getPhantomNameArray() {return s_aszPhantomName;}
200     static const char** getPhantomTitleArray() {return s_aszPhantomTitle;}
201     static int convertNameToPhantomID (const char* const phmName);
202     static const char* convertPhantomIDToName (const int phmID);
203     static const char* convertPhantomIDToTitle (const int phmID);
204
205  private:
206     PhantomComposition m_composition;
207     int m_nPElem;                           // number of pelems in phantom 
208     double m_xmin, m_xmax, m_ymin, m_ymax;  // extent of pelems in pelem coordinates
209     double m_diameter;                        // diameter of object
210     mutable slist<PhantomElement*> m_listPElem;      // pelem lists
211     string m_name;
212     int m_id;
213     bool m_fail;
214     string m_failMessage;
215
216     static const char* s_aszPhantomName[];
217     static const char* s_aszPhantomTitle[];
218     static const int s_iPhantomCount;
219
220     void init();
221
222     Phantom (const Phantom& rhs);        // copy constructor
223     Phantom& operator= (const Phantom&); // assignment operator
224 };
225
226 typedef slist<PhantomElement*>::iterator PElemIterator;
227 typedef slist<PhantomElement*>::const_iterator PElemConstIterator;
228
229 #endif