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.4 2000/06/25 17:32:24 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 ******************************************************************************/
43 /* Codes for Coordinate Types */
44 /* Defines coords for isPointInside() */
47 PELEM_COORD, /* Normalized PElem Coordinates */
48 PHM_COORD /* World phantom Coordinates */
55 PhantomElement (const char* const type, const double cx, const double cy, const double u, const double v, const double rot, const double atten);
57 ~PhantomElement (void);
59 bool isPointInside (double x, double y, const CoordType coord_type);
61 bool clipLineNormalizedCoords (double& x1, double& y1, double& x2, double& y2) const;
63 bool clipLineWorldCoords (double& x1, double& y1, double& x2, double& y2) const;
65 const int nOutlinePoints(void) const {return m_nPoints;}
66 double* rectLimits(void) {return m_rectLimits;}
67 double* xOutline() {return m_xOutline;}
68 double* yOutline() {return m_yOutline;}
69 const double atten(void) const {return m_atten;}
70 const double diameter(void) const {return m_diameter;}
71 const double xmin(void) const {return m_xmin;}
72 const double xmax(void) const {return m_xmax;}
73 const double ymin(void) const {return m_ymin;}
74 const double ymax(void) const {return m_ymax;}
75 const double rot(void) const {return m_rot;}
76 const double cx(void) const {return m_cx;}
77 const double cy(void) const {return m_cy;}
78 const double u(void) const {return m_u;}
79 const double v(void) const {return m_v;}
82 PhmElemType m_type; // pelem type (box, ellipse, etc)
83 double m_atten; // X-ray attenuation coefficient
84 double m_cx, m_cy; // center of pelem
85 double m_u, m_v; // size of pelem
86 double m_rot; // pelem rotation angle (in radians)
87 double *m_x, *m_y; // ptr to array of points in obj world coord
88 int m_nPoints; // number of points in outline arrays
89 double m_xmin, m_xmax, m_ymin, m_ymax; // pelem limits
91 GRFMTX_2D m_xformPhmToObj; // map from phantom to normalized pelem coords
92 GRFMTX_2D m_xformObjToPhm; // map from normalized pelem coords to phantom coords
95 double m_rectLimits[4];
97 static const int POINTS_PER_CIRCLE = 360;
98 static const double SCALE_PELEM_EXTENT=0.005; // increase pelem limits by 0.5%
100 static PhmElemType PhantomElement::convertNameToType (const char* const typeName);
102 void makeTransformMatrices (void);
104 void makeVectorOutline (void);
106 void calcArcPoints (double x[], double y[], const int pts, const double xcent, const double ycent, const double r, const double start, const double stop);
108 void calcEllipsePoints (double x[], double y[], const int pts, const double u, const double v);
110 static int numCirclePoints (double theta);
116 P_PELEMS, // Phantom made of PElems
117 P_UNIT_PULSE, // Special phantom, not made of pelems
118 P_FILTER // defined only by this type
119 } PhantomComposition;
128 PHM_HERMAN, /* Herman head phantom */
129 PHM_BHERMAN, /* Bordered Herman head phantom */
130 PHM_ROWLAND, /* Rowland head phantom */
131 PHM_BROWLAND, /* Bordered Rowland head phantom */
132 PHM_UNITPULSE /* Unit pulse phantom */
135 static const char PHM_HERMAN_STR[]= "herman";
136 static const char PHM_BHERMAN_STR[]= "bherman";
137 static const char PHM_ROWLAND_STR[]= "rowland";
138 static const char PHM_BROWLAND_STR[]= "browland";
139 static const char PHM_UNITPULSE_STR[]= "unitpulse";
142 Phantom (const char* const phmName);
146 void setComposition (PhantomComposition composition)
147 { m_composition = composition; }
149 const PhantomComposition getComposition (void) const
150 { return m_composition; }
152 bool createFromPhantom (const char* const phmName);
154 bool createFromPhantom (const PhantomID phmid);
156 bool createFromFile (const char* const fname);
158 void addPElem (const PhantomElement& pelem);
160 void addPElem (const char* const composition, const double cx, const double cy, const double u, const double v, const double rot, const double atten);
162 void convertToImagefile (ImageFile& im, const int in_nsample, const int trace, const int colStart, const int colCount) const;
164 void convertToImagefile (ImageFile& im, const int in_nsample, const int trace) const;
166 bool fail(void) const {return m_fail;}
167 const string& failMessage(void) const {return m_failMessage;}
168 const string& name(void) const {return m_name;}
169 const PhantomID id(void) const {return m_id;}
172 void show (void) const;
173 void draw (void) const;
176 void addStdHerman (void);
177 void addStdHermanBordered (void);
178 void addStdRowland (void);
179 void addStdRowlandBordered (void);
181 void print (void) const;
183 const double maxAxisLength (void) const {return (((m_xmax - m_xmin) > (m_ymax - m_ymin)) ? (m_xmax - m_xmin) : (m_ymax - m_ymin));}
185 const double diameter(void) const {return m_diameter;}
186 const double xmin(void) const {return m_xmin;}
187 const double xmax(void) const {return m_xmax;}
188 const double ymin(void) const {return m_ymin;}
189 const double ymax(void) const {return m_ymax;}
190 slist<PhantomElement*>& listPElem(void) {return m_listPElem;}
191 const slist<PhantomElement*>& listPElem(void) const {return m_listPElem;}
192 const int nPElem(void) const {return m_nPElem;}
195 PhantomComposition m_composition;
196 int m_nPElem; // number of pelems in phantom
197 double m_xmin, m_xmax, m_ymin, m_ymax; // extent of pelems in pelem coordinates
198 double m_diameter; // diameter of object
199 mutable slist<PhantomElement*> m_listPElem; // pelem lists
203 string m_failMessage;
205 // Standard phantomsa
206 static PhantomID convertNameToPhantomID (const char* const phmName);
207 static const char* convertPhantomIDToName (const PhantomID phmID);
212 typedef slist<PhantomElement*>::iterator PElemIterator;
213 typedef slist<PhantomElement*>::const_iterator PElemConstIterator;