Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Tools/Math/Interpol.h

Go to the documentation of this file.
00001 //------------------------------------------------------------------------------
00002 #ifndef INTERPOL_H_INCLUDED
00003 #define INTERPOL_H_INCLUDED
00004 //------------------------------------------------------------------------------
00005 #include <vector>
00006 #include <map>
00007 #include "Tools/Math/LA_Vector.h"
00008 #include "Tools/Streams/InOut.h"
00009 //------------------------------------------------------------------------------
00010 namespace interpol {
00011 //------------------------------------------------------------------------------
00012 class Point
00013 {
00014 public:
00015   Point();
00016   Point(double x, double y);
00017 
00018 public:
00019   double x;
00020   double y;
00021 };
00022 //------------------------------------------------------------------------------
00023 bool operator<(const Point& p1, const Point& p2);
00024 //------------------------------------------------------------------------------
00025 class Interpolation;
00026 class LinearInterpolation;
00027 class SplineInterpolation;
00028 //------------------------------------------------------------------------------
00029 class InterpolationFactory
00030 {
00031 public:
00032   enum Type
00033   {
00034     Linear,
00035     Spline
00036   };
00037 
00038 public:
00039   static Interpolation* Create(Type type);
00040   static Interpolation* Create(Type type, const Interpolation* pSource);
00041   static Interpolation* Transform(Type type, Interpolation* pSource);
00042   static void Destroy(Interpolation* pInterpolation);
00043 
00044   static void Write(Out& out, const Interpolation* pInterpolation);
00045   static Interpolation* Read(In& in);
00046 };
00047 //------------------------------------------------------------------------------
00048 class Interpolation
00049 {
00050 public:
00051   typedef std::map<int, Point>::const_iterator ConstPointIterator;
00052 
00053 protected:
00054   Interpolation();
00055   virtual ~Interpolation();
00056 
00057 private:
00058   Interpolation(const Interpolation& interpolation) {}
00059   Interpolation& operator=(const Interpolation& interpolation) { return *this; }
00060 
00061 public:
00062   virtual int AddPoint(const Point& p);
00063   virtual int AddPoint(double x, double y);
00064   virtual bool MovePoint(int index, const Point& p);
00065   virtual bool RemovePoint(int index);
00066 
00067   virtual double GetInterpolatedY(double x) const = 0;
00068 
00069   virtual ConstPointIterator GetPointBegin() const;
00070   virtual ConstPointIterator GetPointEnd() const;
00071 
00072   virtual InterpolationFactory::Type GetType() const = 0;
00073 
00074 
00075 protected:
00076   virtual void Assign(const Interpolation& interpolation);
00077   virtual void OnChange() {}
00078 
00079 private:
00080   virtual void BuildSortedPoints();
00081 
00082 protected:
00083   std::vector<Point> xSortedPoints;
00084 
00085 private:
00086   int nextIndex;
00087   std::map<int, Point> points;
00088 
00089   friend class InterpolationFactory;
00090   friend Out& operator<<(Out& stream, const Interpolation& interpolation);
00091   friend In& operator>>(In& stream, Interpolation& interpolation);
00092 };
00093 //------------------------------------------------------------------------------
00094 class LinearInterpolation : public Interpolation
00095 {
00096 protected:
00097   LinearInterpolation();
00098   virtual ~LinearInterpolation();
00099 
00100 public:
00101   virtual double GetInterpolatedY(double x) const;
00102   virtual InterpolationFactory::Type GetType() const;
00103 
00104   friend class InterpolationFactory;
00105 };
00106 //------------------------------------------------------------------------------
00107 class SplineInterpolation : public Interpolation
00108 {
00109 protected:
00110   SplineInterpolation();
00111   virtual ~SplineInterpolation();
00112 
00113 public:
00114   virtual double GetInterpolatedY(double x) const;
00115   virtual InterpolationFactory::Type GetType() const;
00116 
00117 protected:
00118   virtual void OnChange();
00119   
00120 private:
00121   virtual void CalcSplines();
00122 
00123 private:
00124   LA::Vector x;
00125   LA::Vector y;
00126   LA::Vector a;
00127   LA::Vector b;
00128   LA::Vector c;
00129   LA::Vector d;
00130 
00131   friend class InterpolationFactory;
00132 };
00133 //------------------------------------------------------------------------------
00134 Out& operator<<(Out& stream, const Point& p);
00135 In& operator>>(In& stream, Point& p);
00136 } // namespace interpol
00137 //------------------------------------------------------------------------------
00138 #endif
00139 //------------------------------------------------------------------------------

Generated on Mon Mar 20 22:00:06 2006 for GT2005 by doxygen 1.3.6