00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 # ifndef PARAMETRICCURVE_H
00014 # define PARAMETRICCURVE_H
00015
00016 # include <realroot/Seq.hpp>
00017 # include <shape/vertex.hpp>
00018 # include <shape/edge.hpp>
00019 # include <shape/curve.hpp>
00020 # include <shape/curve_pl.hpp>
00021
00022 # undef SELF
00023 # define TMPL template<class C, class V>
00024 # define SELF parametric_curve<C,V>
00025 # define REF REF_OF(V)
00026 # define PLCurve curve_pl<C,REF>
00027
00028 namespace mmx {
00029 namespace shape {
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 TMPL
00044 class parametric_curve : public curve<V> {
00045 public:
00046 typedef C Scalar;
00047 typedef typename use<point_def,C,V>::Point Point;
00048 typedef curve<REF> Curve;
00049 typedef bounding_box<C,REF> BoundingBox;
00050 typedef typename point_set<C,3,REF>::PointIterator PointIterator;
00051
00052 parametric_curve(void) {} ;
00053 parametric_curve(const BoundingBox box) : Curve(box) {}
00054 virtual ~parametric_curve(void){} ;
00055
00056 virtual double tmin(void) const = 0 ;
00057 virtual double tmax(void) const = 0 ;
00058 virtual void set_range(double tmin, double tmax) = 0;
00059
00060 virtual Point* eval (const double& t) const = 0 ;
00061 virtual Point* operator() (double t) const { return this->eval(t); }
00062
00063 virtual void eval (Point&, Scalar) const = 0 ;
00064 virtual void sample (PointIterator, int) const;
00065 virtual void sample (Point*, const Scalar*, int) const;
00066
00067 virtual void subdivide(SELF*& a, SELF*& b, double t ) const = 0;
00068
00069 virtual Seq<Point *> critical_points(void) = 0 ;
00070 virtual Seq<Point *> extremal_points(void) = 0 ;
00071 virtual Seq<Point *> singular_points(void) = 0 ;
00072
00073 } ;
00074
00075 TMPL void
00076 SELF::sample(PointIterator p, int n) const {
00077 assert(n>1);
00078 Scalar h=(this->tmax() - this->tmin())/(n-1), t=tmin();
00079 for (int i=0; i<n; i++, p++) {
00080 this->eval(*p, t);
00081 t+=h;
00082 }
00083 }
00084
00085 TMPL void
00086 SELF::sample(Point* res, const Scalar* t, int n) const {
00087 for ( Point * o = res; o != res + n; o++, t++ )
00088 this->eval(*o,*t);
00089 }
00090
00091
00092 TMPL PLCurve*
00093 mesh(SELF* pc ) {
00094 typedef typename PLCurve::Edge Edge;
00095 int n = 500;
00096 PLCurve* res = new PLCurve;
00097 pc->sample(res->begin(), n);
00098 for ( int i = 0; i < n-1; i ++ ) {
00099 res->push_edge(new Edge(&res->vertex(i),&res->vertex(i+1)));
00100 }
00101 return res;
00102 }
00103
00104 }
00105 }
00106 # undef TMPL
00107 # undef TMPL_DEF
00108 # undef REF
00109 # undef PLCurve
00110 # undef SELF
00111 # endif // PARAMETRICCURVE_H