X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fprojections.h;h=c88fca709552c694e375ced81711486e91732df6;hp=39cb09a7a67446a3723a7cb06a6921bc6ddc68a7;hb=4433641931aa27fd6a2b5ecd0102e6c5bbbccc46;hpb=b361677a2f7d5b443641faec70b057f2a84dc77e diff --git a/include/projections.h b/include/projections.h index 39cb09a..c88fca7 100644 --- a/include/projections.h +++ b/include/projections.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: projections.h,v 1.28 2001/03/10 23:14:15 kevin Exp $ +** $Id: projections.h,v 1.33 2001/03/13 08:24:41 kevin Exp $ ** ** ** This program is free software; you can redistribute it and/or modify @@ -37,33 +37,58 @@ class fnetorderstream; #include "array2dfile.h" #include "imagefile.h" #include +#include + //used for rebinning divergent beam projections to parallel class ParallelRaysumCoordinate { public: double m_dT; // Distance from center of origin double m_dTheta; // perpendicular angle to origin - int m_iViewNum; // View number for this raysum - int m_iDetNum; // Detector number for this raysum + double m_dRaysum; + + static bool compareByTheta (ParallelRaysumCoordinate* a, ParallelRaysumCoordinate* b) + { return a->m_dTheta == b->m_dTheta ? b->m_dT > a->m_dT : b->m_dTheta > a->m_dTheta; } + + // sort first by T, then Theta + static bool compareByT (ParallelRaysumCoordinate* a, ParallelRaysumCoordinate* b) + { return a->m_dT == b->m_dT ? b->m_dTheta > a->m_dTheta : b->m_dT > a->m_dT; } - bool lessThanT (ParallelRaysumCoordinate& rCompare) - {return m_dT < rCompare.m_dT; } - bool lessThanTheta (ParallelRaysumCoordinate& rCompare) - {return m_dTheta < rCompare.m_dTheta; } }; class ParallelRaysums { -private: - ParallelRaysumCoordinate** m_ppCoordinates; - int m_iNumCoordinates; - public: - ParallelRaysums (Projections* pProjections); + + enum { + THETA_RANGE_UNCONSTRAINED = 0, + THETA_RANGE_NORMALIZE_TO_TWOPI, + THETA_RANGE_FOLD_TO_PI, + }; + + ParallelRaysums (const Projections* pProjections, int iThetaRange); ~ParallelRaysums (); - ParallelRaysumCoordinate** getCoordinates() {return m_ppCoordinates;} + typedef std::vector CoordinateContainer; + typedef CoordinateContainer::iterator CoordinateIterator; + + CoordinateContainer& getCoordinates() {return m_vecpCoordinates;} int getNumCoordinates() const {return m_iNumCoordinates;} void getLimits (double* dMinT, double* dMaxT, double* dMinTheta, double* dMaxTheta) const; + CoordinateContainer& getSortedByT(); + CoordinateContainer& getSortedByTheta(); + double interpolate (double* pdX, double* pdY, int n, double dXValue, int* iLastFloor = NULL); + void getThetaAndRaysumsForT (int iT, double* pdTheta, double* pdRaysum); + void getDetPositions (double* pdDetPos); + +private: + CoordinateContainer m_vecpCoordinates; + CoordinateContainer m_vecpSortedByT; + CoordinateContainer m_vecpSortedByTheta; + ParallelRaysumCoordinate* m_pCoordinates; + int m_iNumCoordinates; + int m_iNumView; + int m_iNumDet; + int m_iThetaRange; }; @@ -104,7 +129,7 @@ class Projections bool detarrayRead (fnetorderstream& fs, DetectorArray& darray, const int view_num); bool detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, const int view_num); - bool interpolateToParallel(); + Projections* interpolateToParallel() const; bool convertPolar (ImageFile& rIF, int iInterpolation); bool convertFFTPolar (ImageFile& rIF, int iInterpolation, int iZeropad); @@ -133,7 +158,7 @@ class Projections int geometry() const {return m_geometry;} double focalLength() const {return m_dFocalLength;} double sourceDetectorLength() const { return m_dSourceDetectorLength;} - + double viewDiameter() const {return m_dViewDiameter; } double phmLen() const { return m_dViewDiameter / SQRT2; } void setPhmLen(double phmLen) { m_dViewDiameter = phmLen * SQRT2; }