Bernstein polynomials with no branching. (#591)
This commit is contained in:
parent
76b3efbd08
commit
7366a6c53d
@ -13,84 +13,31 @@
|
|||||||
// and convergence should be fast by now.
|
// and convergence should be fast by now.
|
||||||
#define RATPOLY_EPS (LENGTH_EPS/(1e2))
|
#define RATPOLY_EPS (LENGTH_EPS/(1e2))
|
||||||
|
|
||||||
double SolveSpace::Bernstein(int k, int deg, double t)
|
static double Bernstein(int k, int deg, double t)
|
||||||
{
|
{
|
||||||
if(k > deg || k < 0) return 0;
|
// indexed by [degree][k][exponent]
|
||||||
|
static const double bernstein_coeff[4][4][4] = {
|
||||||
|
{ { 1.0,0.0,0.0,0.0 }, { 1.0,0.0,0.0,0.0 }, { 1.0,0.0,0.0,0.0 }, { 1.0,0.0,0.0,0.0 } },
|
||||||
|
{ { 1.0,-1.0,0.0,0.0 }, { 0.0,1.0,0.0,0.0 }, { 0.0,0.0,0.0,0.0 }, { 0.0,0.0,0.0,0.0 } },
|
||||||
|
{ { 1.0,-2.0,1.0,0.0 }, { 0.0,2.0,-2.0,0.0 },{ 0.0,0.0,1.0,0.0 }, { 0.0,0.0,0.0,0.0 } },
|
||||||
|
{ { 1.0,-3.0,3.0,-1.0 },{ 0.0,3.0,-6.0,3.0 },{ 0.0,0.0,3.0,-3.0}, { 0.0,0.0,0.0,1.0 } } };
|
||||||
|
|
||||||
switch(deg) {
|
const double *c;
|
||||||
case 0:
|
c = bernstein_coeff[deg][k];
|
||||||
return 1;
|
return (((c[3]*t+c[2])*t)+c[1])*t+c[0];
|
||||||
|
|
||||||
case 1:
|
|
||||||
if(k == 0) {
|
|
||||||
return (1 - t);
|
|
||||||
} else if(k == 1) {
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
if(k == 0) {
|
|
||||||
return (1 - t)*(1 - t);
|
|
||||||
} else if(k == 1) {
|
|
||||||
return 2*(1 - t)*t;
|
|
||||||
} else if(k == 2) {
|
|
||||||
return t*t;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
if(k == 0) {
|
|
||||||
return (1 - t)*(1 - t)*(1 - t);
|
|
||||||
} else if(k == 1) {
|
|
||||||
return 3*(1 - t)*(1 - t)*t;
|
|
||||||
} else if(k == 2) {
|
|
||||||
return 3*(1 - t)*t*t;
|
|
||||||
} else if(k == 3) {
|
|
||||||
return t*t*t;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ssassert(false, "Unexpected degree of spline");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double SolveSpace::BernsteinDerivative(int k, int deg, double t)
|
static double BernsteinDerivative(int k, int deg, double t)
|
||||||
{
|
{
|
||||||
switch(deg) {
|
static const double bernstein_derivative_coeff[4][4][3] = {
|
||||||
case 0:
|
{ { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 } },
|
||||||
return 0;
|
{ { -1.0,0.0,0.0 }, { 1.0,0.0,0.0 }, { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 } },
|
||||||
|
{ { -2.0,2.0,0.0 }, { 2.0,-4.0,0.0 },{ 0.0,2.0,0.0 }, { 0.0,0.0,0.0 } },
|
||||||
|
{ { -3.0,6.0,-3.0 },{ 3.0,-12.0,9.0 },{ 0.0,6.0,-9.0}, { 0.0,0.0,3.0 } } };
|
||||||
|
|
||||||
case 1:
|
const double *c;
|
||||||
if(k == 0) {
|
c = bernstein_derivative_coeff[deg][k];
|
||||||
return -1;
|
return ((c[2]*t)+c[1])*t+c[0];
|
||||||
} else if(k == 1) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
if(k == 0) {
|
|
||||||
return -2 + 2*t;
|
|
||||||
} else if(k == 1) {
|
|
||||||
return 2 - 4*t;
|
|
||||||
} else if(k == 2) {
|
|
||||||
return 2*t;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
if(k == 0) {
|
|
||||||
return -3 + 6*t - 3*t*t;
|
|
||||||
} else if(k == 1) {
|
|
||||||
return 3 - 12*t + 9*t*t;
|
|
||||||
} else if(k == 2) {
|
|
||||||
return 6*t - 9*t*t;
|
|
||||||
} else if(k == 3) {
|
|
||||||
return 3*t*t;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ssassert(false, "Unexpected degree of spline");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector SBezier::PointAt(double t) const {
|
Vector SBezier::PointAt(double t) const {
|
||||||
|
@ -10,10 +10,6 @@
|
|||||||
#ifndef SOLVESPACE_SURFACE_H
|
#ifndef SOLVESPACE_SURFACE_H
|
||||||
#define SOLVESPACE_SURFACE_H
|
#define SOLVESPACE_SURFACE_H
|
||||||
|
|
||||||
// Utility functions, Bernstein polynomials of order 1-3 and their derivatives.
|
|
||||||
double Bernstein(int k, int deg, double t);
|
|
||||||
double BernsteinDerivative(int k, int deg, double t);
|
|
||||||
|
|
||||||
class SBezierList;
|
class SBezierList;
|
||||||
class SSurface;
|
class SSurface;
|
||||||
class SCurvePt;
|
class SCurvePt;
|
||||||
|
Loading…
Reference in New Issue
Block a user