36#ifndef LIB2GEOM_SEEN_SBASIS_2D_H
37#define LIB2GEOM_SEEN_SBASIS_2D_H
64 Linear2d(
double a00,
double a01,
double a10,
double a11)
82 double apply(
double u,
double v) {
83 return (
a[0]*(1-u)*(1-v) +
119 for(
unsigned i = 0; i < 4; i++)
124 for(
unsigned i = 0; i < 4; i++)
129 for(
unsigned i = 0; i < 4; i++)
135 for(
unsigned i = 0; i < 4; i++)
141 for(
unsigned i = 0; i < 4; i++)
166 return (*
this)[ui + vi*
us];
174 return (*
this)[ui + vi*
us];
177 double apply(
double u,
double v)
const {
183 for(
unsigned vi = 0; vi <
vs; vi++) {
185 for(
unsigned ui = 0; ui <
us; ui++) {
186 p += (sk*tk)*
index(ui, vi);
209 for(
unsigned i = 0; i < p.size(); i++) {
222 for(
unsigned vi = 0; vi <
result.vs; vi++) {
223 for(
unsigned ui = 0; ui <
result.us; ui++) {
225 if(ui < a.
us && vi < a.
vs)
226 bo += a.
index(ui, vi);
227 if(ui < b.
us && vi < b.
vs)
228 bo += b.
index(ui, vi);
229 result.index(ui, vi) = bo;
242 for(
unsigned vi = 0; vi <
result.vs; vi++) {
243 for(
unsigned ui = 0; ui <
result.us; ui++) {
245 if(ui < a.
us && vi < a.
vs)
246 bo += a.
index(ui, vi);
247 if(ui < b.
us && vi < b.
vs)
248 bo -= b.
index(ui, vi);
249 result.index(ui, vi) = bo;
276 for(
unsigned i = 0; i < 4; i++)
292 for(
unsigned i = 0; i < a.size(); i++)
298 for(
unsigned i = 0; i < a.size(); i++)
340inline std::ostream &operator<< (std::ostream &out_file,
const Linear2d &bo) {
341 out_file <<
"{" << bo[0] <<
", " << bo[1] <<
"}, ";
342 out_file <<
"{" << bo[2] <<
", " << bo[3] <<
"}";
346inline std::ostream &operator<< (std::ostream &out_file,
const SBasis2d & p) {
347 for(
unsigned i = 0; i < p.size(); i++) {
348 out_file << p[i] <<
"s^" << i <<
" + ";
Adaptor that creates 2D functions from 1D ones.
Linear2d(double a00, double a01, double a10, double a11)
double & operator[](const int i)
double operator[](const int i) const
double apply(double u, double v)
Function that interpolates linearly between two values.
Two-dimensional point that doubles as a vector.
SBasis2d(Linear2d const &bo)
Linear2d index(unsigned ui, unsigned vi) const
Linear2d & index(unsigned ui, unsigned vi)
double tail_error(unsigned tail) const
double apply(double u, double v) const
void truncate(unsigned k)
SBasis2d(SBasis2d const &a)
Polynomial in symmetric power basis.
Lifts one dimensional objects into 2D.
Various utility functions.
SBasisN< n > divide(SBasisN< n > const &a, SBasisN< n > const &b, int k)
Linear extract_v(Linear2d const &a, double v)
SBasisN< n > inverse(SBasisN< n > a, int k)
Bezier multiply(Bezier const &f, Bezier const &g)
SBasisN< n > reciprocal(LinearN< n > const &a, int k)
D2< T > operator+=(D2< T > &a, D2< T > const &b)
D2< SBasis > sb2d_cubic_solve(SBasis2d const &f, Geom::Point const &A, Geom::Point const &B)
Finds a path which traces the 0 contour of f, traversing from A to B as a single cubic d2<sbasis>.
D2< T > operator-(D2< T > const &a, D2< T > const &b)
D2< T > operator*=(D2< T > &a, Point const &b)
SBasisN< n > sqrt(SBasisN< n > const &a, int k)
SBasisOf< T > shift(SBasisOf< T > const &a, int sh)
Bezier operator*(Bezier const &f, Bezier const &g)
D2< T > operator-=(D2< T > &a, D2< T > const &b)
D2< T > compose(D2< T > const &a, T const &b)
SBasis2d partial_derivative(SBasis2d const &a, int dim)
Linear extract_u(Linear2d const &a, double u)
D2< SBasis > sb2dsolve(SBasis2d const &f, Geom::Point const &A, Geom::Point const &B, unsigned degmax=2)
Finds a path which traces the 0 contour of f, traversing from A to B as a single d2<sbasis>.
Bezier integral(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)
D2< SBasis > truncate(D2< SBasis > const &a, unsigned terms)
bool operator==(D2< T > const &a, D2< T > const &b)
bool operator!=(D2< T > const &a, D2< T > const &b)
D2< T > operator/=(D2< T > &a, Point const &b)
Polynomial in symmetric power basis (S-basis)