1.1 --- a/src/lemon/bezier.h Sat May 21 21:04:57 2005 +0000
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,147 +0,0 @@
1.4 -/* -*- C++ -*-
1.5 - * src/lemon/bezier.h - Part of LEMON, a generic C++ optimization library
1.6 - *
1.7 - * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
1.8 - * (Egervary Research Group on Combinatorial Optimization, EGRES).
1.9 - *
1.10 - * Permission to use, modify and distribute this software is granted
1.11 - * provided that this copyright notice appears in all copies. For
1.12 - * precise terms see the accompanying LICENSE file.
1.13 - *
1.14 - * This software is provided "AS IS" with no warranty of any kind,
1.15 - * express or implied, and with no claim as to its suitability for any
1.16 - * purpose.
1.17 - *
1.18 - */
1.19 -
1.20 -#ifndef LEMON_BEZIER_H
1.21 -#define LEMON_BEZIER_H
1.22 -
1.23 -///\ingroup misc
1.24 -///\file
1.25 -///\brief Classes to compute with Bezier curves.
1.26 -///
1.27 -///Up to now this file is used internally by \ref graph_to_eps.h
1.28 -///
1.29 -///\author Alpar Juttner
1.30 -
1.31 -#include<lemon/xy.h>
1.32 -
1.33 -namespace lemon {
1.34 -
1.35 -class BezierBase {
1.36 -public:
1.37 - typedef xy<double> xy;
1.38 -protected:
1.39 - static xy conv(xy x,xy y,double t) {return (1-t)*x+t*y;}
1.40 -};
1.41 -
1.42 -class Bezier1 : public BezierBase
1.43 -{
1.44 -public:
1.45 - xy p1,p2;
1.46 -
1.47 - Bezier1() {}
1.48 - Bezier1(xy _p1, xy _p2) :p1(_p1), p2(_p2) {}
1.49 -
1.50 - xy operator()(double t) const
1.51 - {
1.52 - // return conv(conv(p1,p2,t),conv(p2,p3,t),t);
1.53 - return conv(p1,p2,t);
1.54 - }
1.55 - Bezier1 before(double t) const
1.56 - {
1.57 - return Bezier1(p1,conv(p1,p2,t));
1.58 - }
1.59 -
1.60 - Bezier1 after(double t) const
1.61 - {
1.62 - return Bezier1(conv(p1,p2,t),p2);
1.63 - }
1.64 - Bezier1 revert() { return Bezier1(p2,p1);}
1.65 - Bezier1 operator()(double a,double b) { return before(b).after(a/b); }
1.66 - xy grad() { return p2-p1; }
1.67 - xy grad(double t) { return grad(); }
1.68 -
1.69 -};
1.70 -
1.71 -class Bezier2 : public BezierBase
1.72 -{
1.73 -public:
1.74 - xy p1,p2,p3;
1.75 -
1.76 - Bezier2() {}
1.77 - Bezier2(xy _p1, xy _p2, xy _p3) :p1(_p1), p2(_p2), p3(_p3) {}
1.78 - Bezier2(const Bezier1 &b) : p1(b.p1), p2(conv(b.p1,b.p2,.5)), p3(b.p2) {}
1.79 - xy operator()(double t) const
1.80 - {
1.81 - // return conv(conv(p1,p2,t),conv(p2,p3,t),t);
1.82 - return ((1-t)*(1-t))*p1+(2*(1-t)*t)*p2+(t*t)*p3;
1.83 - }
1.84 - Bezier2 before(double t) const
1.85 - {
1.86 - xy q(conv(p1,p2,t));
1.87 - xy r(conv(p2,p3,t));
1.88 - return Bezier2(p1,q,conv(q,r,t));
1.89 - }
1.90 -
1.91 - Bezier2 after(double t) const
1.92 - {
1.93 - xy q(conv(p1,p2,t));
1.94 - xy r(conv(p2,p3,t));
1.95 - return Bezier2(conv(q,r,t),r,p3);
1.96 - }
1.97 - Bezier2 revert() { return Bezier2(p3,p2,p1);}
1.98 - Bezier2 operator()(double a,double b) { return before(b).after(a/b); }
1.99 - Bezier1 grad() { return Bezier1(2.0*(p2-p1),2.0*(p3-p2)); }
1.100 - xy grad(double t) { return grad()(t); }
1.101 -};
1.102 -
1.103 -class Bezier3 : public BezierBase
1.104 -{
1.105 -public:
1.106 - xy p1,p2,p3,p4;
1.107 -
1.108 - Bezier3() {}
1.109 - Bezier3(xy _p1, xy _p2, xy _p3, xy _p4) :p1(_p1), p2(_p2), p3(_p3), p4(_p4) {}
1.110 - Bezier3(const Bezier1 &b) : p1(b.p1), p2(conv(b.p1,b.p2,1.0/3.0)),
1.111 - p3(conv(b.p1,b.p2,2.0/3.0)), p4(b.p2) {}
1.112 - Bezier3(const Bezier2 &b) : p1(b.p1), p2(conv(b.p1,b.p2,2.0/3.0)),
1.113 - p3(conv(b.p2,b.p3,1.0/3.0)), p4(b.p3) {}
1.114 -
1.115 - xy operator()(double t) const
1.116 - {
1.117 - // return Bezier2(conv(p1,p2,t),conv(p2,p3,t),conv(p3,p4,t))(t);
1.118 - return ((1-t)*(1-t)*(1-t))*p1+(3*t*(1-t)*(1-t))*p2+
1.119 - (3*t*t*(1-t))*p3+(t*t*t)*p4;
1.120 - }
1.121 - Bezier3 before(double t) const
1.122 - {
1.123 - xy p(conv(p1,p2,t));
1.124 - xy q(conv(p2,p3,t));
1.125 - xy r(conv(p3,p4,t));
1.126 - xy a(conv(p,q,t));
1.127 - xy b(conv(q,r,t));
1.128 - xy c(conv(a,b,t));
1.129 - return Bezier3(p1,p,a,c);
1.130 - }
1.131 -
1.132 - Bezier3 after(double t) const
1.133 - {
1.134 - xy p(conv(p1,p2,t));
1.135 - xy q(conv(p2,p3,t));
1.136 - xy r(conv(p3,p4,t));
1.137 - xy a(conv(p,q,t));
1.138 - xy b(conv(q,r,t));
1.139 - xy c(conv(a,b,t));
1.140 - return Bezier3(c,b,r,p4);
1.141 - }
1.142 - Bezier3 revert() { return Bezier3(p4,p3,p2,p1);}
1.143 - Bezier3 operator()(double a,double b) { return before(b).after(a/b); }
1.144 - Bezier2 grad() { return Bezier2(3.0*(p2-p1),3.0*(p3-p2),3.0*(p4-p3)); }
1.145 - xy grad(double t) { return grad()(t); }
1.146 -};
1.147 -
1.148 -} //END OF NAMESPACE LEMON
1.149 -
1.150 -#endif // LEMON_BEZIER_H