00001
00002
00003
00004
00005
00006
00007
00008
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 )
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 )
00118 return (i >= 0 && i < _max);
00119 if ( first > second )
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