Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's quick Index  

HxSampledBSplineInterval.h

00001 /*
00002  *  Copyright (c) 1998, University of Amsterdam, The Netherlands.
00003  *  All rights reserved.
00004  *
00005  *
00006  *  Author(s):
00007  *  Silvia D. Olabarriaga  (silvia@wins.uva.nl)
00008  *  Dennis Koelma (koelma@wins.uva.nl)
00009  */
00010 
00011 #ifndef HxSampledBSplineInterval_h
00012 #define HxSampledBSplineInterval_h
00013 
00014 
00015 #include "HxStd.h"
00016 #include <utility>
00017 using std::pair;
00018 #include "HxBSplineType.h"
00019 
00027 class HxSampledBSplineInterval : pair<int,int> {
00028 public:
00030                     HxSampledBSplineInterval();
00031 
00033                     HxSampledBSplineInterval(int b, int e, int max, 
00034                         HxBSplineType type);
00035 
00037                     ~HxSampledBSplineInterval();
00038 
00040     int             begin() const;
00041 
00043     int             end() const;
00044 
00046     int             next(int i) const;
00047 
00051     int             contains(int i) const;
00052 
00054     int             middle() const;
00055 
00059     int             ratio(double r) const;
00060 
00062     int             size() const;
00063 
00064 private:
00065     int             _max;
00066     int             _wrap;
00067 };
00068 
00069 
00070 inline 
00071 HxSampledBSplineInterval::HxSampledBSplineInterval() : pair<int,int>()
00072 {
00073     _max = 0;
00074     _wrap = 0;
00075 }
00076 
00077 inline 
00078 HxSampledBSplineInterval::HxSampledBSplineInterval(int b, int e, 
00079     int max, HxBSplineType type) : pair<int,int>(b,e)
00080 {
00081     _max = max;
00082     _wrap = (type == closed);
00083 }
00084 
00085 inline 
00086 HxSampledBSplineInterval::~HxSampledBSplineInterval()
00087 {
00088 }
00089 
00090 inline 
00091 int HxSampledBSplineInterval::begin() const 
00092 {
00093     return first;
00094 }
00095 
00096 inline 
00097 int HxSampledBSplineInterval::end() const 
00098 {
00099     return second;
00100 }
00101 
00102 inline int
00103 HxSampledBSplineInterval::next(int i) const
00104 {
00105     if ( _wrap ) {
00106         if ( i >= _max )    // is wrapped?
00107             return _max-i;
00108         else    return i+1;
00109     } else  if ( i >= _max )
00110             return _max-1;
00111         else    return i+1;
00112 }
00113 
00114 inline int
00115 HxSampledBSplineInterval::contains(int i) const
00116 {
00117     if ( first == second ) // special case?
00118         return (i >= 0 && i < _max);
00119     if ( first > second )   // is wrapped?
00120         return (i >= first && i < _max) || (i >= 0 && i <= second);
00121     else    return (i >= first && i <= second);
00122 }
00123 
00124 inline int
00125 HxSampledBSplineInterval::middle() const
00126 {
00127     return ratio(0.5);
00128 }
00129 
00130 inline int
00131 HxSampledBSplineInterval::ratio(double r) const
00132 {
00133     int index = size() * r + first;
00134     if ( index >= _max )
00135         index -= _max;
00136     return index;
00137 }
00138 
00139 
00140 inline int
00141 HxSampledBSplineInterval::size() const
00142 {
00143     if ( first <= second ) {
00144         return second - first + 1;
00145     } else  {
00146         int count = 0;
00147         for ( int i=first; i != second; i = next(i) )
00148             count++;
00149         return count+1;
00150     }
00151 }
00152 
00153 
00154 #endif 

Generated on Tue Feb 3 14:18:42 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001