X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fphantom.h;h=b1cb50fe9c7132584299c34bd896d1e802940946;hp=ad8b0f8c8bc81dcff9c5128dc0f5d7c16e56afc3;hb=747a2ec9e0f3c49723b36da0cc77270fbecc9dfe;hpb=e4c1f7f8eb87558c3abf3bf1d20732361f425351 diff --git a/include/phantom.h b/include/phantom.h index ad8b0f8..b1cb50f 100644 --- a/include/phantom.h +++ b/include/phantom.h @@ -7,9 +7,7 @@ ** Date Started: July 1, 1984 ** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg -** -** $Id: phantom.h,v 1.6 2000/07/15 08:36:13 kevin Exp $ +** Copyright (c) 1983-2009 Kevin Rosenberg ** ** 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 @@ -28,8 +26,8 @@ #ifndef PHANTOM_H #define PHANTOM_H -#include -using namespace std; +#include +#include "ctsupport.h" typedef enum { PELEM_INVALID, @@ -54,57 +52,59 @@ class PhantomElement 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 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;} + + static PhmElemType convertNameToType (const char* const typeName); + + void printDefinition (std::ostream& os) const; + void printDefinition (std::ostringstream& os) const; private: - PhmElemType m_type; // pelem type (box, ellipse, etc) - 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_xmin, m_xmax, m_ymin, m_ymax; // pelem limits - double m_diameter; + PhmElemType m_type; // pelem type (box, ellipse, etc) + 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_xmin, m_xmax, m_ymin, m_ymax; // pelem limits GRFMTX_2D m_xformPhmToObj; // map from phantom to normalized pelem coords - GRFMTX_2D m_xformObjToPhm; // map from normalized pelem coords to phantom coords + GRFMTX_2D m_xformObjToPhm; // map from normalized pelem coords to phantom coords double* m_xOutline; 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 PhmElemType PhantomElement::convertNameToType (const char* const typeName); - - void makeTransformMatrices (void); + static const int POINTS_PER_CIRCLE; + static const double SCALE_PELEM_EXTENT; // increase pelem limits by 0.5% - void makeVectorOutline (void); + static const char* const convertTypeToName (PhmElemType iType); + void makeTransformMatrices (); + 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); static int numCirclePoints (double theta); @@ -116,105 +116,115 @@ class PhantomElement typedef enum { P_PELEMS, // Phantom made of PElems - P_UNIT_PULSE, // Special phantom, not made of pelems - P_FILTER // defined only by this type + P_UNIT_PULSE, // Special phantom, not made of pelems + 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_SHEPP_LOGAN; + static const int PHM_UNITPULSE; + + Phantom (); Phantom (const char* const phmName); - ~Phantom (void); + ~Phantom (); void setComposition (PhantomComposition composition) - { m_composition = composition; } + { m_composition = composition; } - const PhantomComposition getComposition (void) const - { return m_composition; } + const PhantomComposition getComposition () const + { return m_composition; } bool createFromPhantom (const char* const phmName); - - bool createFromPhantom (const PhantomID phmid); - - bool createFromFile (const char* const fname); + bool createFromPhantom (const int phmid); + bool createFromPhmFile (const char* const fname); + bool createFromImageFile (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, double dViewRatio, const int in_nsample, const int trace) const; + void convertToImagefile (ImageFile& im, double dViewRatio, const int in_nsample, const int trace, + const int colStart, const int colCount, bool bStoreAtColumnPos) const; + void convertToImagefile (ImageFile& im, int iNX, double dViewRatio, const int in_nsample, const int trace, + const int colStart, const int colCount, int iStorageOffset) const; - void convertToImagefile (ImageFile& im, const int in_nsample, const int trace) const; + void printDefinitions (std::ostream& os) const; + void printDefinitions (std::ostringstream& os) 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;} + 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; +#ifdef HAVE_SGP + 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; + void addStdHerman (); + void addStdSheppLogan (); + + void print (std::ostream& os) const; + void print (std::ostringstream& os) const; - const double maxAxisLength (void) const {return (((m_xmax - m_xmin) > (m_ymax - m_ymin)) ? (m_xmax - m_xmin) : (m_ymax - m_ymin));} + double maxAxisLength () const + { return maxValue (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& listPElem(void) {return m_listPElem;} - const slist& listPElem(void) const {return m_listPElem;} - const int nPElem(void) const {return m_nPElem;} + double getDiameterBoundaryCircle() const + { return SQRT2 * maxAxisLength(); } + + 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& listPElem() {return m_listPElem;} + const std::list& listPElem() const {return m_listPElem;} + const int nPElem() const {return m_nPElem;} + const bool isImagefile(void) const { return m_im != NULL; } + const ImageFile* getImagefile() const { return m_im; } + + 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 + 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 m_listPElem; // pelem lists - string m_name; - PhantomID m_id; + mutable std::list m_listPElem; // pelem lists + std::string m_name; + int m_id; bool m_fail; - string m_failMessage; - - // Standard phantomsa - static PhantomID convertNameToPhantomID (const char* const phmName); - static const char* convertPhantomIDToName (const PhantomID phmID); + std::string m_failMessage; + static const char* s_aszPhantomName[]; + static const char* s_aszPhantomTitle[]; + static const int s_iPhantomCount; + ImageFile* m_im; // If defining a phantom from an ImageFile - void init(void); + void init(); Phantom (const Phantom& rhs); // copy constructor Phantom& operator= (const Phantom&); // assignment operator }; -typedef slist::iterator PElemIterator; -typedef slist::const_iterator PElemConstIterator; +typedef std::list::iterator PElemIterator; +typedef std::list::const_iterator PElemConstIterator; #endif