** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: phantom.h,v 1.2 2000/06/19 20:08:09 kevin Exp $
+** $Id: phantom.h,v 1.12 2000/07/31 14:48:35 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
#define PHANTOM_H
#include <slist>
+#include "ctsupport.h"
+
using namespace std;
typedef enum {
public:
PhantomElement (const char* const type, const double cx, const double cy, const double u, const double v, const double rot, const double atten);
- ~PhantomElement (void);
+ ~PhantomElement ();
- bool isPointInside (double x, double y, const CoordType coord_type);
+ 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(void) const {return m_nPoints;}
- double* rectLimits(void) {return m_rectLimits;}
+ const int nOutlinePoints() const {return m_nPoints;}
+ double* rectLimits() {return m_rectLimits;}
double* xOutline() {return m_xOutline;}
double* yOutline() {return m_yOutline;}
- const double atten(void) const {return m_atten;}
- const double diameter(void) const {return m_diameter;}
- const double xmin(void) const {return m_xmin;}
- const double xmax(void) const {return m_xmax;}
- const double ymin(void) const {return m_ymin;}
- const double ymax(void) const {return m_ymax;}
- const double rot(void) const {return m_rot;}
- const double cx(void) const {return m_cx;}
- const double cy(void) const {return m_cy;}
- const double u(void) const {return m_u;}
- const double v(void) const {return m_v;}
+ 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;}
+ const double ymax() const {return m_ymax;}
+ const double rot() const {return m_rot;}
+ 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;}
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 makeTransformMatrices ();
- void makeVectorOutline (void);
+ 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);
- int numCirclePoints (double theta) const;
+ static int numCirclePoints (double theta);
+ PhantomElement (const PhantomElement& rhs); // copy constructor
+ PhantomElement& operator= (const PhantomElement&); // assignment operator
};
P_FILTER // defined only by this type
} PhantomComposition;
-// Phantom class
+//////////////////////////////////////////////////////
+// Phantom Class Declaration
+//////////////////////////////////////////////////////
+
+class SGP;
+class ImageFile;
class Phantom
{
public:
- Phantom (void);
- ~Phantom (void);
+ static const int PHM_INVALID;
+ static const int PHM_HERMAN;
+ static const int PHM_BHERMAN;
+ static const int PHM_ROWLAND;
+ static const int PHM_BROWLAND;
+ static const int PHM_UNITPULSE;
+
+ Phantom ();
+ Phantom (const char* const phmName);
+
+ ~Phantom ();
void setComposition (PhantomComposition composition)
{ m_composition = composition; }
- const PhantomComposition getComposition (void) const
+ const PhantomComposition getComposition () const
{ return m_composition; }
- void create (const int phmid);
+ bool createFromPhantom (const char* const phmName);
+
+ bool createFromPhantom (const int phmid);
bool createFromFile (const char* const fname);
void convertToImagefile (ImageFile& im, const int in_nsample, const int trace) const;
+ bool fail() const {return m_fail;}
+ const string& failMessage() const {return m_failMessage;}
+ const string& name() const {return m_name;}
+ const int id() const {return m_id;}
+
#if HAVE_SGP
- void show (void) const;
- void draw (void) const;
+ void show () const;
+ void show (SGP& sgp) const;
+ void draw (SGP& sgp) const;
#endif
- void addStdHerman (void);
- void addStdRowland (void);
- void addStdRowlandBordered (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));}
-
- const double diameter(void) const {return m_diameter;}
- const double xmin(void) const {return m_xmin;}
- const double xmax(void) const {return m_xmax;}
- const double ymin(void) const {return m_ymin;}
- const double ymax(void) const {return m_ymax;}
- slist<PhantomElement*>& listPElem(void) {return m_listPElem;}
- const slist<PhantomElement*>& listPElem(void) const {return m_listPElem;}
- const int nPElem(void) const {return m_nPElem;}
+ void addStdHerman ();
+ void addStdHermanBordered ();
+ void addStdRowland ();
+ void addStdRowlandBordered ();
+
+ void print () const;
+
+ const double maxAxisLength () const {return (((m_xmax - m_xmin) > (m_ymax - m_ymin)) ? (m_xmax - m_xmin) : (m_ymax - m_ymin));}
+
+ 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;}
+ slist<PhantomElement*>& listPElem() {return m_listPElem;}
+ const slist<PhantomElement*>& listPElem() const {return m_listPElem;}
+ const int nPElem() const {return m_nPElem;}
+
+ static const int getPhantomCount() {return s_iPhantomCount;}
+ static const char** getPhantomNameArray() {return s_aszPhantomName;}
+ static const char** getPhantomTitleArray() {return s_aszPhantomTitle;}
+ static int convertNameToPhantomID (const char* const phmName);
+ static const char* convertPhantomIDToName (const int phmID);
+ static const char* convertPhantomIDToTitle (const int phmID);
private:
PhantomComposition m_composition;
double m_diameter; // diameter of object
mutable slist<PhantomElement*> m_listPElem; // pelem lists
string m_name;
+ int m_id;
+ bool m_fail;
+ string m_failMessage;
+
+ static const char* s_aszPhantomName[];
+ static const char* s_aszPhantomTitle[];
+ static const int s_iPhantomCount;
+
+ void init();
+
+ Phantom (const Phantom& rhs); // copy constructor
+ Phantom& operator= (const Phantom&); // assignment operator
};
typedef slist<PhantomElement*>::iterator PElemIterator;