1 /*****************************************************************************
5 ** Purpose: Header file for Phantom objects
6 ** Programmer: Kevin Rosenberg
7 ** Date Started: July 1, 1984
9 ** This is part of the CTSim program
10 ** Copyright (C) 1983-2000 Kevin Rosenberg
12 ** $Id: phantom.h,v 1.10 2000/07/22 15:45:33 kevin Exp $
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.
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.
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 ******************************************************************************/
32 #include "ctsupport.h"
33 #include "backprojectors.h"
47 /* Codes for Coordinate Types */
48 /* Defines coords for isPointInside() */
51 PELEM_COORD, /* Normalized PElem Coordinates */
52 PHM_COORD /* World phantom Coordinates */
59 PhantomElement (const char* const type, const double cx, const double cy, const double u, const double v, const double rot, const double atten);
63 bool isPointInside (double x, double y, const CoordType coord_type) const;
65 bool clipLineNormalizedCoords (double& x1, double& y1, double& x2, double& y2) const;
67 bool clipLineWorldCoords (double& x1, double& y1, double& x2, double& y2) const;
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;}
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
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
99 double m_rectLimits[4];
101 static const int POINTS_PER_CIRCLE = 360;
102 static const double SCALE_PELEM_EXTENT=0.005; // increase pelem limits by 0.5%
104 static PhmElemType PhantomElement::convertNameToType (const char* const typeName);
106 void makeTransformMatrices ();
108 void makeVectorOutline ();
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);
112 void calcEllipsePoints (double x[], double y[], const int pts, const double u, const double v);
114 static int numCirclePoints (double theta);
116 PhantomElement (const PhantomElement& rhs); // copy constructor
117 PhantomElement& operator= (const PhantomElement&); // assignment operator
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;
128 //////////////////////////////////////////////////////
129 // Phantom Class Declaration
130 //////////////////////////////////////////////////////
135 static const int PHM_INVALID;
136 static const int PHM_HERMAN;
137 static const int PHM_BHERMAN;
138 static const int PHM_ROWLAND;
139 static const int PHM_BROWLAND;
140 static const int PHM_UNITPULSE;
143 Phantom (const char* const phmName);
147 void setComposition (PhantomComposition composition)
148 { m_composition = composition; }
150 const PhantomComposition getComposition () const
151 { return m_composition; }
153 bool createFromPhantom (const char* const phmName);
155 bool createFromPhantom (const int phmid);
157 bool createFromFile (const char* const fname);
159 void addPElem (const PhantomElement& pelem);
161 void addPElem (const char* const composition, const double cx, const double cy, const double u, const double v, const double rot, const double atten);
163 void convertToImagefile (ImageFile& im, const int in_nsample, const int trace, const int colStart, const int colCount) const;
165 void convertToImagefile (ImageFile& im, const int in_nsample, const int trace) const;
167 bool fail() const {return m_fail;}
168 const string& failMessage() const {return m_failMessage;}
169 const string& name() const {return m_name;}
170 const int id() const {return m_id;}
177 void addStdHerman ();
178 void addStdHermanBordered ();
179 void addStdRowland ();
180 void addStdRowlandBordered ();
184 const double maxAxisLength () const {return (((m_xmax - m_xmin) > (m_ymax - m_ymin)) ? (m_xmax - m_xmin) : (m_ymax - m_ymin));}
186 const double diameter() const {return m_diameter;}
187 const double xmin() const {return m_xmin;}
188 const double xmax() const {return m_xmax;}
189 const double ymin() const {return m_ymin;}
190 const double ymax() const {return m_ymax;}
191 slist<PhantomElement*>& listPElem() {return m_listPElem;}
192 const slist<PhantomElement*>& listPElem() const {return m_listPElem;}
193 const int nPElem() const {return m_nPElem;}
195 static const int getPhantomCount() {return s_iPhantomCount;}
196 static const char** getPhantomNameArray() {return s_aszPhantomName;}
197 static const char** getPhantomTitleArray() {return s_aszPhantomTitle;}
198 static int convertNameToPhantomID (const char* const phmName);
199 static const char* convertPhantomIDToName (const int phmID);
200 static const char* convertPhantomIDToTitle (const int phmID);
203 PhantomComposition m_composition;
204 int m_nPElem; // number of pelems in phantom
205 double m_xmin, m_xmax, m_ymin, m_ymax; // extent of pelems in pelem coordinates
206 double m_diameter; // diameter of object
207 mutable slist<PhantomElement*> m_listPElem; // pelem lists
211 string m_failMessage;
213 static const char* s_aszPhantomName[];
214 static const char* s_aszPhantomTitle[];
215 static const int s_iPhantomCount;
219 Phantom (const Phantom& rhs); // copy constructor
220 Phantom& operator= (const Phantom&); // assignment operator
223 typedef slist<PhantomElement*>::iterator PElemIterator;
224 typedef slist<PhantomElement*>::const_iterator PElemConstIterator;