42# define M_PI 3.14159265358979323846
51 return std::max(fabs(
bs.min()),fabs(
bs.max()));
57 for(
unsigned i = 0; i <
size(); i++) {
58 if(!(*
this)[i].isFinite())
72 std::vector<double> ret(n+1);
75 for(
unsigned i = 1; i < n+1; i++) {
89 const unsigned out_size = std::max(a.
size(), b.
size());
90 const unsigned min_size = std::min(a.
size(), b.
size());
93 for(
unsigned i = 0; i < min_size; i++) {
96 for(
unsigned i = min_size; i < a.
size(); i++)
98 for(
unsigned i = min_size; i < b.
size(); i++)
101 assert(
result.size() == out_size);
111 const unsigned out_size = std::max(a.
size(), b.
size());
112 const unsigned min_size = std::min(a.
size(), b.
size());
115 for(
unsigned i = 0; i < min_size; i++) {
118 for(
unsigned i = min_size; i < a.
size(); i++)
120 for(
unsigned i = min_size; i < b.
size(); i++)
123 assert(
result.size() == out_size);
133 const unsigned out_size = std::max(a.
size(), b.
size());
134 const unsigned min_size = std::min(a.
size(), b.
size());
137 for(
unsigned i = 0; i < min_size; i++)
139 for(
unsigned i = min_size; i < b.
size(); i++)
142 assert(a.
size() == out_size);
152 const unsigned out_size = std::max(a.
size(), b.
size());
153 const unsigned min_size = std::min(a.
size(), b.
size());
156 for(
unsigned i = 0; i < min_size; i++)
158 for(
unsigned i = min_size; i < b.
size(); i++)
161 assert(a.
size() == out_size);
172 for(
unsigned i = 0; i < a.
size(); i++)
199 size_t n = a.
size()+sh;
201 size_t m = std::max(0, sh);
203 for(
int i = 0; i < sh; i++)
205 for(
size_t i = m, j = std::max(0,-sh); i < n; i++, j++)
220 for(
int i = 0; i < sh; i++)
235 for(
unsigned j = 0; j < b.
size(); j++) {
236 for(
unsigned i = j; i < a.
size()+j; i++) {
237 double tri = b[j].tri()*a[i-j].tri();
241 for(
unsigned j = 0; j < b.
size(); j++) {
242 for(
unsigned i = j; i < a.
size()+j; i++) {
243 for(
unsigned dim = 0; dim < 2; dim++)
244 c[i][dim] += b[j][dim]*a[i-j][dim];
263 for(
unsigned j = 0; j < b.
size(); j++) {
264 for(
unsigned i = j; i < a.
size()+j; i++) {
265 double tri = b[j].tri()*a[i-j].tri();
269 for(
unsigned j = 0; j < b.
size(); j++) {
270 for(
unsigned i = j; i < a.
size()+j; i++) {
271 for(
unsigned dim = 0; dim < 2; dim++)
272 c[i][dim] += b[j][dim]*a[i-j][dim];
285SBasis
multiply(SBasis
const &a, SBasis
const &b) {
286 if(a.isZero() || b.isZero()) {
287 SBasis
c(1, Linear(0,0));
304 for(
unsigned k = 1; k <
c.size() + 1; k++) {
305 double ahat = -
c[k-1].tri()/(2*k);
306 a[k][0] = a[k][1] = ahat;
309 for(
int k =
c.size()-1; k >= 0; k--) {
310 aTri = (
c[k].hat() + (k+1)*aTri/2)/(2*k+1);
329 for(
unsigned k = 0; k < a.
size()-1; k++) {
330 double d = (2*k+1)*(a[k][1] - a[k][0]);
332 c[k][0] = d + (k+1)*a[k+1][0];
333 c[k][1] = d - (k+1)*a[k+1][1];
336 double d = (2*k+1)*(a[k][1] - a[k][0]);
337 if (d == 0 && k > 0) {
352 for(
unsigned k = 0; k <
size()-1; k++) {
353 double d = (2*k+1)*((*
this)[k][1] - (*this)[k][0]);
355 (*this)[k][0] =
d + (k+1)*(*
this)[k+1][0];
356 (*this)[k][1] =
d - (k+1)*(*
this)[k+1][1];
359 double d = (2*k+1)*((*
this)[k][1] - (*this)[k][0]);
360 if (
d == 0 && k > 0) {
380 c[0] =
Linear(std::sqrt(a[0][0]), std::sqrt(a[0][1]));
383 for(
unsigned i = 1; i <= (unsigned)k && i<r.
size(); i++) {
384 Linear ci(r[i][0]/(2*
c[0][0]), r[i][1]/(2*
c[0][1]));
406 double r_s0 = (a.
tri()*a.
tri())/(-a[0]*a[1]);
408 for(
unsigned i = 0; i < (unsigned)k; i++) {
409 c[i] =
Linear(r_s0k/a[0], r_s0k/a[1]);
430 for(
unsigned i = 0; i < (unsigned)k; i++) {
431 Linear ci(r[i][0]/b[0][0], r[i][1]/b[0][1]);
452 for(
int i = a.
size()-1; i >= 0; i--) {
468 for(
int i = a.
size()-1; i >= 0; i--) {
506 assert(a.
size() > 0);
518 if(a.
size() >= 2 && k == 2) {
520 Linear t1(1+a[1][0], 1-a[1][1]);
521 c[1] =
Linear(-a[1][0]/t1[0], -a[1][1]/t1[1]);
522 }
else if(a.
size() >= 2) {
524 Linear t1(1./(1+a[1][0]), 1./(1-a[1][1]));
530#ifdef DEBUG_INVERSION
531 std::cout <<
"a=" << a << std::endl;
532 std::cout <<
"1-a=" << one_minus_a << std::endl;
533 std::cout <<
"t1=" << t1 << std::endl;
538 for(
unsigned i = 0; i < (unsigned)k; i++) {
539#ifdef DEBUG_INVERSION
540 std::cout <<
"-------" << i <<
": ---------" <<std::endl;
541 std::cout <<
"r=" << r << std::endl
542 <<
"c=" <<
c << std::endl
543 <<
"ti=" << ti << std::endl
548 Linear ci(r[i][0]*t1i[0], r[i][1]*t1i[1]);
549#ifdef DEBUG_INVERSION
550 std::cout <<
"t1i=" << t1i << std::endl;
551 std::cout <<
"ci=" << ci << std::endl;
553 for(
int dim = 0; dim < 2; dim++)
557 SBasis civ = one_minus_a*ci[0] + a*ci[1];
567#ifdef DEBUG_INVERSION
568 std::cout <<
"##########################" << std::endl;
585 s[0] =
Linear(std::sin(b[0]), std::sin(b[1]));
586 double tr = s[0].tri();
588 s[1] =
Linear(std::cos(b[0])*t2 - tr, -std::cos(b[1])*t2 + tr);
591 for(
int i = 0; i < k; i++) {
592 Linear bo(4*(i+1)*s[i+1][0] - 2*s[i+1][1],
593 -2*s[i+1][0] + 4*(i+1)*s[i+1][1]);
594 bo -= s[i]*(t2/(i+1));
597 s[i+2] = bo/double(i+2);
638 for (
unsigned k=0; k<
order; k+=vs){
639 double p10 = Pk.
at(k)[0];
640 double p01 = Pk.
at(k)[1];
641 double q10 = Qk.at(k)[0];
642 double q01 = Qk.at(k)[1];
643 double r10 = r.
at(k)[0];
644 double r01 = r.
at(k)[1];
646 double det = p10*q01-p01*q10;
652 a=( q01*r10-q10*r01)/
det;
653 b=(-p01*r10+p10*r01)/
det;
Range of real numbers that is never empty.
Function that interpolates linearly between two values.
bool isZero(Coord eps=EPSILON) const
double tailError(unsigned tail) const
std::vector< double > valueAndDerivatives(double t, unsigned n) const
The size of the returned vector equals n+1.
Polynomial in symmetric power basis.
bool isZero(double eps=EPSILON) const
double tailError(unsigned tail) const
bound the error from term truncation
void derive()
Compute the derivative of this inplace (Exact)
double valueAt(double t) const
void truncate(unsigned k)
Low level math functions and compatibility wrappers.
Various utility functions.
SBasisN< n > cos(LinearN< n > bo, int k)
Geom::SBasisOf< double > SBasis
SBasisN< n > divide(SBasisN< n > const &a, SBasisN< n > const &b, int k)
SBasisN< n > compose_inverse(SBasisN< n > const &f, SBasisN< n > const &g, unsigned order=2, double tol=1e-3)
Geom::LinearOf< double > Linear
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< 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)
Bezier portion(const Bezier &a, double from, double to)
SBasisOf< T > multiply_add(SBasisOf< T > const &a, SBasisOf< T > const &b, SBasisOf< T > c)
Bezier integral(Bezier const &a)
Bezier derivative(Bezier const &a)
D2< T > operator+(D2< T > const &a, D2< T > const &b)
OptInterval bounds_fast(Bezier const &b)
static double det(Point a, Point b)
unsigned valuation(SBasisN< n > const &a, double tol=0)
Returns the degree of the first non zero coefficient.
SBasisN< n > sin(LinearN< n > bo, int k)
Polynomial in symmetric power basis (S-basis)