** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: phantom.h,v 1.1 2000/06/19 18:45:36 kevin Exp $
+** $Id: phantom.h,v 1.6 2000/07/15 08:36:13 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
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
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 PhmElemType PhantomElement::convertNameToType (const char* const typeName);
void makeTransformMatrices (void);
void calcEllipsePoints (double x[], double y[], const int pts, const double u, const double v);
- int numCirclePoints (double theta) const;
+ static int numCirclePoints (double theta);
+ PhantomElement (const PhantomElement& rhs); // copy constructor
+ PhantomElement& operator= (const PhantomElement&); // assignment operator
};
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;
+
+ 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";
+
Phantom (void);
+ Phantom (const char* const phmName);
+
~Phantom (void);
void setComposition (PhantomComposition composition)
const PhantomComposition getComposition (void) const
{ return m_composition; }
- void create (const int phmid);
+ bool createFromPhantom (const char* const phmName);
+
+ bool createFromPhantom (const PhantomID phmid);
bool createFromFile (const char* const fname);
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 print (void) const;
+ 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;
+
+ bool fail(void) const {return m_fail;}
+ const string& failMessage(void) const {return m_failMessage;}
+ const string& name(void) const {return m_name;}
+ const PhantomID id(void) const {return m_id;}
#if HAVE_SGP
void show (void) const;
void draw (void) const;
#endif
- void std_herman (void);
+ void addStdHerman (void);
+ void addStdHermanBordered (void);
+ void addStdRowland (void);
+ void addStdRowlandBordered (void);
- void std_rowland (void);
-
- void std_rowland_bordered (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));}
double m_diameter; // diameter of object
mutable slist<PhantomElement*> m_listPElem; // pelem lists
string m_name;
+ PhantomID m_id;
+ bool m_fail;
+ string m_failMessage;
+
+ // Standard phantomsa
+ static PhantomID convertNameToPhantomID (const char* const phmName);
+ static const char* convertPhantomIDToName (const PhantomID phmID);
+
+ void init(void);
+
+ Phantom (const Phantom& rhs); // copy constructor
+ Phantom& operator= (const Phantom&); // assignment operator
};
typedef slist<PhantomElement*>::iterator PElemIterator;