00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef _GOCROSSTANOFFDIST_
00034 #define _GOCROSSTANOFFDIST_
00035
00036 #include "EvalCurve.h"
00037 #include "SplineCurve.h"
00038 #include <vector>
00039 #include <boost/smart_ptr.hpp>
00040
00041
00042 namespace Go
00043 {
00046
00047
00051 class CrossTanOffDist : public EvalCurve
00052 {
00053 public:
00054
00070 CrossTanOffDist(boost::shared_ptr<SplineCurve>& poscurve,
00071 boost::shared_ptr<SplineCurve>& tangcv1,
00072 boost::shared_ptr<SplineCurve>& tangcv2,
00073 boost::shared_ptr<SplineCurve>& blend1,
00074 boost::shared_ptr<SplineCurve>& blend2,
00075 boost::shared_ptr<SplineCurve>& opposite1,
00076 boost::shared_ptr<SplineCurve>& opposite2,
00077 double factor);
00078
00079
00081 virtual ~CrossTanOffDist();
00082
00086 virtual Point eval( double t) const;
00087
00100 virtual void eval( double t, int n, Point der[]) const;
00101
00104 virtual double start() const;
00105
00108 virtual double end() const;
00109
00112 virtual int dim() const;
00113
00124 virtual bool approximationOK(double par, Point approxpos,
00125 double tol1, double tol2) const;
00126
00127 private:
00128 const boost::shared_ptr<SplineCurve> poscurve_;
00129 std::vector<boost::shared_ptr<SplineCurve> > tangcurves_;
00130 std::vector<boost::shared_ptr<SplineCurve> > blends_;
00131 boost::shared_ptr<SplineCurve> oppositepos_;
00132 boost::shared_ptr<SplineCurve> lengthfac_;
00133 boost::shared_ptr<SplineCurve> avcross_;
00134 const double epstol_;
00135
00143 void evalcrtan(double t, Point& blend, Point& projdiff) const ;
00144
00154 void evalcrtan(double t, int n, Point derblend[], Point derproj[]) const;
00155
00160 Point evalblend(double t) const;
00161
00165 Point evaldiff(double t) const ;
00166
00173 void evaldiff(double t, int n, Point der[]) const ;
00174 };
00175
00176
00178 }
00179
00180 #endif
00181