00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _CurveData_h_
00011 #define _CurveData_h_
00012
00013 #include "SeVec3d.h"
00014 #include <vector>
00015
00016 #include <cfloat>
00017 #include <cassert>
00018
00019 namespace SeExpr{
00020
00022
00031 template <class T>
00032 class SeCurve
00033 {
00034 mutable int cacheCV;
00035 public:
00037 enum InterpType { kNone=0, kLinear, kSmooth, kSpline, kMonotoneSpline };
00038 struct CV{
00039 CV(double pos,const T& val,InterpType type)
00040 :_pos(pos),_val(val),_interp(type)
00041 {}
00042
00043 double _pos;
00044 T _val,_deriv;
00045 InterpType _interp;
00046 };
00047 private:
00048 std::vector<CV> _cvData;
00049 bool prepared;
00050 public:
00051 SeCurve();
00052
00054 void addPoint(double position,const T& val,InterpType type);
00055
00057 void preparePoints();
00058
00060 T getValue(const double param) const;
00061
00064 double getChannelValue(const double param,int channel) const;
00065
00068 CV getLowerBoundCV(const double param) const;
00069
00071 static bool interpTypeValid(InterpType interp);
00072
00074 static bool cvLessThan(const CV &cv1, const CV &cv2);
00075 private:
00077 void clampCurveSegment(const T& delta,T& d1,T& d2);
00078
00080 static double comp(const T& val,const int i);
00081 };
00082
00083 }
00084 #endif