** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: phantom.h,v 1.5 2000/07/13 07:03:21 kevin Exp $
+** $Id: phantom.h,v 1.20 2001/01/02 16:02:12 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
#ifndef PHANTOM_H
#define PHANTOM_H
-#include <slist>
-using namespace std;
+#include <list>
+#include "ctsupport.h"
typedef enum {
PELEM_INVALID,
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;}
+ double* const xOutline() const {return m_xOutline;}
+ double* const yOutline() const {return m_yOutline;}
+ 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;}
+
+ void printDefinition (std::ostream& os) const;
+ void printDefinition (std::ostringstream& os) const;
private:
PhmElemType m_type; // pelem type (box, ellipse, etc)
double* m_yOutline;
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 const int POINTS_PER_CIRCLE;
+ static const double SCALE_PELEM_EXTENT; // increase pelem limits by 0.5%
- static PhmElemType PhantomElement::convertNameToType (const char* const typeName);
+ static PhmElemType convertNameToType (const char* const typeName);
+ static const char* const convertTypeToName (PhmElemType iType);
- 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);
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:
- 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);
+ static const int PHM_INVALID;
+ static const int PHM_HERMAN;
+ static const int PHM_B_HERMAN;
+ static const int PHM_SHEPP_LOGAN;
+ static const int PHM_B_SHEPP_LOGAN;
+ static const int PHM_UNITPULSE;
+
+ Phantom ();
Phantom (const char* const phmName);
- ~Phantom (void);
+ ~Phantom ();
void setComposition (PhantomComposition composition)
{ m_composition = composition; }
- const PhantomComposition getComposition (void) const
+ const PhantomComposition getComposition () const
{ return m_composition; }
bool createFromPhantom (const char* const phmName);
- bool createFromPhantom (const PhantomID phmid);
+ bool createFromPhantom (const int phmid);
bool createFromFile (const char* const fname);
+ bool fileWrite (const char* const fname);
+
void addPElem (const PhantomElement& pelem);
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 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 int colStart, const int colCount, bool bStoreAtColumnPos) 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;}
+ void printDefinitions (std::ostream& os) const;
+ void printDefinitions (std::ostringstream& os) const;
+
+ bool fail() const {return m_fail;}
+ const std::string& failMessage() const {return m_failMessage;}
+ const std::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 addStdHermanBordered (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 addStdSheppLogan ();
+ void addStdSheppLoganBordered ();
+
+ void print (std::ostream& os) const;
+ void print (std::ostringstream& os) 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;}
+ std::list<PhantomElement*>& listPElem() {return m_listPElem;}
+ const std::list<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;
int m_nPElem; // number of pelems in phantom
double m_xmin, m_xmax, m_ymin, m_ymax; // extent of pelems in pelem coordinates
double m_diameter; // diameter of object
- mutable slist<PhantomElement*> m_listPElem; // pelem lists
- string m_name;
- PhantomID m_id;
+ mutable std::list<PhantomElement*> m_listPElem; // pelem lists
+ std::string m_name;
+ int m_id;
bool m_fail;
- string m_failMessage;
+ std::string m_failMessage;
+
+ static const char* s_aszPhantomName[];
+ static const char* s_aszPhantomTitle[];
+ static const int s_iPhantomCount;
- // Standard phantomsa
- static PhantomID convertNameToPhantomID (const char* const phmName);
- static const char* convertPhantomIDToName (const PhantomID phmID);
+ void init();
- void init(void);
+ Phantom (const Phantom& rhs); // copy constructor
+ Phantom& operator= (const Phantom&); // assignment operator
};
-typedef slist<PhantomElement*>::iterator PElemIterator;
-typedef slist<PhantomElement*>::const_iterator PElemConstIterator;
+typedef std::list<PhantomElement*>::iterator PElemIterator;
+typedef std::list<PhantomElement*>::const_iterator PElemConstIterator;
#endif