Changeset 2207:75a29ac69c19 in lemon-0.x for lemon/bits
- Timestamp:
- 09/07/06 15:27:16 (18 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@2933
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/bits/bezier.h
r2178 r2207 28 28 ///\author Alpar Juttner 29 29 30 #include<lemon/ xy.h>30 #include<lemon/dim2.h> 31 31 32 32 namespace lemon { 33 namespace dim2 { 33 34 34 35 class BezierBase { 35 36 public: 36 typedef xy<double> xy;37 typedef Point<double> Point; 37 38 protected: 38 static xy conv(xy x,xyy,double t) {return (1-t)*x+t*y;}39 static Point conv(Point x,Point y,double t) {return (1-t)*x+t*y;} 39 40 }; 40 41 … … 42 43 { 43 44 public: 44 xyp1,p2;45 Point p1,p2; 45 46 46 47 Bezier1() {} 47 Bezier1( xy _p1, xy_p2) :p1(_p1), p2(_p2) {}48 Bezier1(Point _p1, Point _p2) :p1(_p1), p2(_p2) {} 48 49 49 xyoperator()(double t) const50 Point operator()(double t) const 50 51 { 51 52 // return conv(conv(p1,p2,t),conv(p2,p3,t),t); … … 64 65 Bezier1 revert() const { return Bezier1(p2,p1);} 65 66 Bezier1 operator()(double a,double b) const { return before(b).after(a/b); } 66 xygrad() const { return p2-p1; }67 xynorm() const { return rot90(p2-p1); }68 xygrad(double) const { return grad(); }69 xynorm(double t) const { return rot90(grad(t)); }67 Point grad() const { return p2-p1; } 68 Point norm() const { return rot90(p2-p1); } 69 Point grad(double) const { return grad(); } 70 Point norm(double t) const { return rot90(grad(t)); } 70 71 }; 71 72 … … 73 74 { 74 75 public: 75 xyp1,p2,p3;76 Point p1,p2,p3; 76 77 77 78 Bezier2() {} 78 Bezier2( xy _p1, xy _p2, xy_p3) :p1(_p1), p2(_p2), p3(_p3) {}79 Bezier2(Point _p1, Point _p2, Point _p3) :p1(_p1), p2(_p2), p3(_p3) {} 79 80 Bezier2(const Bezier1 &b) : p1(b.p1), p2(conv(b.p1,b.p2,.5)), p3(b.p2) {} 80 xyoperator()(double t) const81 Point operator()(double t) const 81 82 { 82 83 // return conv(conv(p1,p2,t),conv(p2,p3,t),t); … … 85 86 Bezier2 before(double t) const 86 87 { 87 xyq(conv(p1,p2,t));88 xyr(conv(p2,p3,t));88 Point q(conv(p1,p2,t)); 89 Point r(conv(p2,p3,t)); 89 90 return Bezier2(p1,q,conv(q,r,t)); 90 91 } … … 92 93 Bezier2 after(double t) const 93 94 { 94 xyq(conv(p1,p2,t));95 xyr(conv(p2,p3,t));95 Point q(conv(p1,p2,t)); 96 Point r(conv(p2,p3,t)); 96 97 return Bezier2(conv(q,r,t),r,p3); 97 98 } … … 100 101 Bezier1 grad() const { return Bezier1(2.0*(p2-p1),2.0*(p3-p2)); } 101 102 Bezier1 norm() const { return Bezier1(2.0*rot90(p2-p1),2.0*rot90(p3-p2)); } 102 xygrad(double t) const { return grad()(t); }103 xynorm(double t) const { return rot90(grad(t)); }103 Point grad(double t) const { return grad()(t); } 104 Point norm(double t) const { return rot90(grad(t)); } 104 105 }; 105 106 … … 107 108 { 108 109 public: 109 xyp1,p2,p3,p4;110 Point p1,p2,p3,p4; 110 111 111 112 Bezier3() {} 112 Bezier3(xy _p1, xy _p2, xy _p3, xy _p4) :p1(_p1), p2(_p2), p3(_p3), p4(_p4) {} 113 Bezier3(Point _p1, Point _p2, Point _p3, Point _p4) 114 : p1(_p1), p2(_p2), p3(_p3), p4(_p4) {} 113 115 Bezier3(const Bezier1 &b) : p1(b.p1), p2(conv(b.p1,b.p2,1.0/3.0)), 114 116 p3(conv(b.p1,b.p2,2.0/3.0)), p4(b.p2) {} … … 116 118 p3(conv(b.p2,b.p3,1.0/3.0)), p4(b.p3) {} 117 119 118 xyoperator()(double t) const120 Point operator()(double t) const 119 121 { 120 122 // return Bezier2(conv(p1,p2,t),conv(p2,p3,t),conv(p3,p4,t))(t); … … 124 126 Bezier3 before(double t) const 125 127 { 126 xyp(conv(p1,p2,t));127 xyq(conv(p2,p3,t));128 xyr(conv(p3,p4,t));129 xya(conv(p,q,t));130 xyb(conv(q,r,t));131 xyc(conv(a,b,t));128 Point p(conv(p1,p2,t)); 129 Point q(conv(p2,p3,t)); 130 Point r(conv(p3,p4,t)); 131 Point a(conv(p,q,t)); 132 Point b(conv(q,r,t)); 133 Point c(conv(a,b,t)); 132 134 return Bezier3(p1,p,a,c); 133 135 } … … 135 137 Bezier3 after(double t) const 136 138 { 137 xyp(conv(p1,p2,t));138 xyq(conv(p2,p3,t));139 xyr(conv(p3,p4,t));140 xya(conv(p,q,t));141 xyb(conv(q,r,t));142 xyc(conv(a,b,t));139 Point p(conv(p1,p2,t)); 140 Point q(conv(p2,p3,t)); 141 Point r(conv(p3,p4,t)); 142 Point a(conv(p,q,t)); 143 Point b(conv(q,r,t)); 144 Point c(conv(a,b,t)); 143 145 return Bezier3(c,b,r,p4); 144 146 } … … 149 151 3.0*rot90(p3-p2), 150 152 3.0*rot90(p4-p3)); } 151 xygrad(double t) const { return grad()(t); }152 xynorm(double t) const { return rot90(grad(t)); }153 Point grad(double t) const { return grad()(t); } 154 Point norm(double t) const { return rot90(grad(t)); } 153 155 154 156 template<class R,class F,class S,class D> 155 157 R recSplit(F &_f,const S &_s,D _d) const 156 158 { 157 const xya=(p1+p2)/2;158 const xyb=(p2+p3)/2;159 const xyc=(p3+p4)/2;160 const xyd=(a+b)/2;161 const xye=(b+c)/2;162 const xyf=(d+e)/2;159 const Point a=(p1+p2)/2; 160 const Point b=(p2+p3)/2; 161 const Point c=(p3+p4)/2; 162 const Point d=(a+b)/2; 163 const Point e=(b+c)/2; 164 const Point f=(d+e)/2; 163 165 R f1=_f(Bezier3(p1,a,d,e),_d); 164 166 R f2=_f(Bezier3(e,d,c,p4),_d); … … 168 170 }; 169 171 170 } //END OF NAMESPACE LEMON 172 173 } //END OF NAMESPACE dim2 174 } //END OF NAMESPACE lemon 171 175 172 176 #endif // LEMON_BEZIER_H
Note: See TracChangeset
for help on using the changeset viewer.