13#define SGN(a) (((a)<0) ? -1 : 1)
43 switch (max_crossings) {
69 std::vector<Geom::Point> Left(
degree+1 ), Right(
degree+1);
88 unsigned n_crossings = 0;
90 int old_sign = SGN(V[0][
Geom::Y]);
91 for (
unsigned i = 1; i <=
degree; i++) {
121 const double abSquared = (a * a) + (b * b);
125 for (
unsigned i = 1; i <
degree; i++) {
129 dist = d*d / abSquared;
136 double max_distance_above = 0.0;
137 double max_distance_below = 0.0;
138 for (
unsigned i = 0; i <
degree-1; i++) {
141 max_distance_below = std::min(max_distance_below, d);
143 max_distance_above = std::max(max_distance_above, d);
146 const double intercept_1 = (
c + max_distance_above) / -a;
147 const double intercept_2 = (
c + max_distance_below) / -a;
150 const double left_intercept = std::min(intercept_1, intercept_2);
151 const double right_intercept = std::max(intercept_1, intercept_2);
153 const double error = 0.5 * (right_intercept - left_intercept);
Cartesian point / 2D vector and related operations.
Bernstein-Bezier polynomial.
Two-dimensional point that doubles as a vector.
Various utility functions.
static double compute_x_intercept(Geom::Point const *V, unsigned degree)
T casteljau_subdivision(double t, T const *v, T *left, T *right, unsigned order)
Perform Casteljau subdivision of a Bezier polynomial.
void find_parametric_bezier_roots(Geom::Point const *w, unsigned degree, std::vector< double > &solutions, unsigned depth)
Angle distance(Angle const &a, Angle const &b)
static float sign(double number)
Returns +1 for positive numbers, -1 for negative numbers, and 0 otherwise.
static unsigned control_poly_flat_enough(Geom::Point const *V, unsigned degree)
unsigned crossing_count(Geom::Point const *V, unsigned degree)
std::vector< double > & solutions
Finding roots of Bernstein-Bezier polynomials.