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

HxBSplineInterval.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 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;   // min of total path (for wrapping)
00093     double      _max;   // max of total path (for wrapping)
00094     int         _wrap;  // flag for closed interval
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 )      // special case?
00147         return (t >= _min && t < _max);
00148     if ( first > second )       // is wrapped?
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 

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