36#ifndef LIB2GEOM_SEEN_D2_H
37#define LIB2GEOM_SEEN_D2_H
40#include <boost/concept/assert.hpp>
41#include <boost/iterator/transform_iterator.hpp>
66 f[
X] = T(a[
X]);
f[
Y] = T(a[
Y]);
69 D2(T
const &a, T
const &b) {
74 template <
typename Iter>
75 D2(Iter first, Iter last) {
76 typedef typename std::iterator_traits<Iter>::value_type V;
77 typedef typename boost::transform_iterator<GetAxis<X,V>, Iter> XIter;
78 typedef typename boost::transform_iterator<GetAxis<Y,V>, Iter> YIter;
81 f[
X] = T(xfirst, xlast);
83 f[
Y] = T(yfirst, ylast);
86 D2(std::vector<Point>
const &vec) {
88 typedef std::vector<Point>::const_iterator Iter;
89 typedef boost::transform_iterator<GetAxis<X,V>, Iter> XIter;
90 typedef boost::transform_iterator<GetAxis<Y,V>, Iter> YIter;
93 f[
X] = T(xfirst, xlast);
95 f[
Y] = T(yfirst, ylast);
111 return f[
X].isZero(eps) &&
f[
Y].isZero(eps);
115 return f[
X].isConstant(eps) &&
f[
Y].isConstant(eps);
119 return f[
X].isFinite() &&
f[
Y].isFinite();
140 std::vector<Coord> x =
f[
X].valueAndDerivatives(t, n),
141 y =
f[
Y].valueAndDerivatives(t, n);
142 std::vector<Point> res(n+1);
143 for(
unsigned i = 0; i <= n; i++) {
144 res[i] =
Point(x[i], y[i]);
179 return a[0]==b[0] && a[1]==b[1];
185 return a[0]!=b[0] || a[1]!=b[1];
203 for(
unsigned i = 0; i < 2; i++)
213 for(
unsigned i = 0; i < 2; i++)
222 for(
unsigned i = 0; i < 2; i++)
231 for(
unsigned i = 0; i < 2; i++)
242 for(
unsigned i = 0; i < 2; i++)
252 for(
unsigned i = 0; i < 2; i++)
262 for(
unsigned i = 0; i < 2; i++)
271 for(
unsigned i = 0; i < 2; i++)
280 for(
unsigned i = 0; i < 2; i++)
299 for(
unsigned i = 0; i < 2; i++)
300 ret[i] = v[
X] * m[i] + v[
Y] * m[i + 2] + m[i + 4];
310 for(
unsigned i = 0; i < 2; i++)
323 for(
unsigned i = 0; i < 2; i++)
332 for(
unsigned i = 0; i < 2; i++)
340 for(
unsigned i = 0; i < 2; i++)
348 for(
unsigned i = 0; i < 2; i++)
360 for(
unsigned i = 0; i < 2; i++)
375 for(
unsigned i = 0; i < 2; i++) {
390 return a[1] * b[0] - a[0] * b[1];
407 for(
unsigned i = 0; i < 2; i++)
416 for(
unsigned i = 0; i < 2; i++)
425 for(
unsigned i = 0; i < 2; i++)
435 for(
unsigned i = 0; i < 2; i++)
436 p[i] = (*
this)[i](t);
445 for(
unsigned i = 0; i < 2; i++)
446 p[i] = (*
this)[i](x, y);
463inline std::ostream &operator<< (std::ostream &out_file,
const Geom::D2<T> &in_d2) {
464 out_file <<
"X: " << in_d2[
X] <<
" Y: " << in_d2[
Y];
493SBasis
L2(D2<SBasis>
const & a,
unsigned k);
498D2<SBasis>
multiply(SBasis
const & a, D2<SBasis>
const & b);
500D2<SBasis>
truncate(D2<SBasis>
const & a,
unsigned terms);
503double tail_error(D2<SBasis>
const & a,
unsigned tail);
507Piecewise<D2<SBasis> >
sectionize(D2<Piecewise<SBasis> >
const &a);
509Piecewise<D2<SBasis> >
rot90(Piecewise<D2<SBasis> >
const &a);
531 retval =
Rect(*xint, *yint);
541 retval =
Rect(*xint, *yint);
546std::vector<Interval>
level_set( D2<SBasis>
const &f, Rect region);
547std::vector<Interval>
level_set( D2<SBasis>
const &f,
Point p,
double tol);
548std::vector<std::vector<Interval> >
level_sets( D2<SBasis>
const &f, std::vector<Rect> regions);
549std::vector<std::vector<Interval> >
level_sets( D2<SBasis>
const &f, std::vector<Point> pts,
double tol);
Cartesian point / 2D vector and related operations.
pair< double, double > Point
3x3 affine transformation matrix.
3x3 matrix representing an affine transformation.
Adaptor that creates 2D functions from 1D ones.
Point operator()(double t) const
T & operator[](unsigned i)
D2< SBasis > toSBasis() const
T const & D1ConstReference
Point operator()(double x, double y) const
bool isZero(double eps=EPSILON) const
Point point(unsigned i) const
T const & operator[](unsigned i) const
D2(T const &a, T const &b)
T cross(D2< T > const &a, D2< T > const &b)
Calculates the 'cross product' or 'outer product' of a and b.
D2(Iter first, Iter last)
Point pointAt(double t) const
bool isConstant(double eps=EPSILON) const
Point valueAt(double t) const
D2(std::vector< Point > const &vec)
std::vector< Point > valueAndDerivatives(double t, unsigned n) const
T dot(D2< T > const &a, Point const &b)
Calculates the 'dot product' or 'inner product' of a and b.
Range of real numbers that is never empty.
Function that interpolates linearly between two values.
Range of real numbers that can be empty.
Axis-aligned rectangle that can be empty.
Function defined as discrete pieces.
Two-dimensional point that doubles as a vector.
Axis aligned, non-empty rectangle.
Polynomial in symmetric power basis.
Template concepts used by 2Geom.
double Coord
Floating point type used to store coordinates.
constexpr Coord EPSILON
Default "acceptably small" value.
Simple closed interval class.
Various utility functions.
std::vector< std::vector< Interval > > level_sets(D2< SBasis > const &f, std::vector< Rect > regions)
D2< Piecewise< SBasis > > make_cuts_independent(Piecewise< D2< SBasis > > const &a)
OptInterval bounds_exact(Bezier const &b)
Bezier reverse(const Bezier &a)
OptInterval bounds_local(Bezier const &b, OptInterval const &i)
Bezier multiply(Bezier const &f, Bezier const &g)
D2< T > operator+=(D2< T > &a, D2< T > const &b)
std::vector< Geom::Piecewise< Geom::D2< Geom::SBasis > > > split_at_discontinuities(Geom::Piecewise< Geom::D2< Geom::SBasis > > const &pwsbin, double tol=.0001)
D2< T > operator/(D2< T > const &a, Point const &b)
unsigned sbasis_size(D2< SBasis > const &a)
Piecewise< D2< SBasis > > sectionize(D2< Piecewise< SBasis > > const &a)
D2< T > operator-(D2< T > const &a, D2< T > const &b)
std::vector< Piecewise< D2< SBasis > > > fuse_nearby_ends(std::vector< Piecewise< D2< SBasis > > > const &f, double tol=0)
D2< T > operator*=(D2< T > &a, Point const &b)
Bezier operator*(Bezier const &f, Bezier const &g)
D2< T > operator-=(D2< T > &a, D2< T > const &b)
double tail_error(D2< SBasis > const &a, unsigned tail)
D2< T > compose(D2< T > const &a, T const &b)
Bezier portion(const Bezier &a, double from, double to)
Bezier integral(Bezier const &a)
Bezier derivative(Bezier const &a)
D2< T > operator+(D2< T > const &a, D2< T > const &b)
D2< T > compose_each(D2< T > const &a, D2< T > const &b)
Piecewise< SBasis > cross(Piecewise< D2< SBasis > > const &a, Piecewise< D2< SBasis > > const &b)
SBasis L2(D2< SBasis > const &a, unsigned k)
Point unitTangentAt(D2< SBasis > const &a, Coord t, unsigned n=3)
D2< SBasis > truncate(D2< SBasis > const &a, unsigned terms)
T dot(D2< T > const &a, D2< T > const &b)
OptInterval bounds_fast(Bezier const &b)
Piecewise< D2< SBasis > > force_continuity(Piecewise< D2< SBasis > > const &f, double tol=0, bool closed=false)
bool are_near(Affine const &a1, Affine const &a2, Coord eps=EPSILON)
bool operator==(D2< T > const &a, D2< T > const &b)
bool operator!=(D2< T > const &a, D2< T > const &b)
D2< T > rot90(D2< T > const &a)
std::vector< Interval > level_set(D2< SBasis > const &f, Rect region)
D2< T > operator/=(D2< T > &a, Point const &b)