00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HxBSplineInterval_h
00012 #define HxBSplineInterval_h
00013
00014 #include <utility>
00015 using std::pair;
00016
00017 #include "HxStd.h"
00018 #include "HxUtilityMath.h"
00019 #include "HxBSplineType.h"
00020
00021
00029 class HxBSplineInterval : pair<double,double> {
00030 public:
00032 HxBSplineInterval();
00033
00037 HxBSplineInterval(double b, double e,
00038 double min, double max,
00039 HxBSplineType type );
00040
00044 HxBSplineInterval(double b, double e,
00045 double min, double max,
00046 int closed );
00047
00049 ~HxBSplineInterval();
00050
00051
00053 double begin() const;
00054
00056 double end() const;
00057
00062 int contains(double t) const;
00063
00065 double next(double t, double delta) const;
00066
00068 double prev(double t, double delta) const;
00069
00071 double length() const;
00072
00074 double middle() const;
00075
00077 double ratio(double r) const;
00078
00080 int isClosed() const;
00081
00083 HxBSplineInterval cropBegin(double t) const;
00084
00086 HxBSplineInterval cropEnd(double t) const;
00087
00089 HxBSplineInterval part(double t1, double t2) const;
00090
00091 private:
00092 double _min;
00093 double _max;
00094 int _wrap;
00095 };
00096
00097
00098 inline
00099 HxBSplineInterval::HxBSplineInterval() : pair<double,double>()
00100 {
00101 _min = 0;
00102 _max = 0;
00103 _wrap = 0;
00104 }
00105
00106 inline
00107 HxBSplineInterval::HxBSplineInterval(double b, double e,
00108 double min, double max, HxBSplineType type)
00109 : pair<double,double>(b,e)
00110 {
00111 _min = min;
00112 _max = max;
00113 _wrap = (type == closed);
00114 }
00115
00116 inline
00117 HxBSplineInterval::HxBSplineInterval(double b, double e,
00118 double min, double max, int wrap)
00119 : pair<double,double>(b,e)
00120 {
00121 _min = min;
00122 _max = max;
00123 _wrap = wrap;
00124 }
00125
00126 inline
00127 HxBSplineInterval::~HxBSplineInterval()
00128 {
00129 }
00130
00131 inline double
00132 HxBSplineInterval::begin() const
00133 {
00134 return first;
00135 }
00136
00137 inline double
00138 HxBSplineInterval::end() const
00139 {
00140 return second;
00141 }
00142
00143 inline int
00144 HxBSplineInterval::contains(double t) const
00145 {
00146 if ( first == second )
00147 return (t >= _min && t < _max);
00148 if ( first > second )
00149 return (t >= first && t < _max) || (t >= _min && t < second);
00150 else return (t >= first && t < second);
00151 }
00152
00153 inline double
00154 HxBSplineInterval::next(double t, double delta ) const
00155 {
00156 t += delta;
00157 if ( t >= _max && _wrap )
00158 t = _min + (t - _max);
00159 return t;
00160 }
00161
00162 inline double
00163 HxBSplineInterval::prev(double t, double delta ) const
00164 {
00165 t -= delta;
00166 if ( t < _min && _wrap )
00167 t = _max - (_min - t);
00168 return t;
00169 }
00170
00171 inline double
00172 HxBSplineInterval::length() const
00173 {
00174 double tmp = second - first;
00175 if ( tmp < 0 && _wrap )
00176 return (_max - EPS - first) + (second - _min);
00177 else if ( tmp < EPS )
00178 return EPS;
00179 else return tmp - EPS;
00180 }
00181
00182 inline double
00183 HxBSplineInterval::middle() const
00184 {
00185 return ratio(0.5);
00186 }
00187
00188 inline double
00189 HxBSplineInterval::ratio(double r) const
00190 {
00191 double t = length() * r + first;
00192 if ( t >= _max )
00193 t = _min + (t - _max);
00194 return t;
00195 }
00196
00197 inline int
00198 HxBSplineInterval::isClosed() const
00199 {
00200 return _wrap;
00201 }
00202
00203 inline HxBSplineInterval
00204 HxBSplineInterval::cropBegin(double t) const
00205 {
00206 HxBSplineInterval tmp(t, second, _min, _max, _wrap);
00207 return tmp;
00208 }
00209
00210 inline HxBSplineInterval
00211 HxBSplineInterval::cropEnd(double t) const
00212 {
00213 HxBSplineInterval tmp(first, t, _min, _max, _wrap);
00214 return tmp;
00215 }
00216
00217 inline HxBSplineInterval
00218 HxBSplineInterval::part(double t1, double t2) const
00219 {
00220 HxBSplineInterval tmp(t1, t2, _min, _max, closed);
00221 tmp._wrap = _wrap;
00222 return tmp;
00223 }
00224
00225 #endif