19 enum class Type { Anchor, QuadraticControl, CubicControl1, CubicControl2 };
41 std::vector<bezier_point>::const_iterator
const begin,
42 std::vector<bezier_point>::const_iterator
const end)
noexcept
48 auto prev_it = end - 1;
49 auto prev_prev_it = end - 2;
50 for (
auto it = begin; it != end; it++) {
52 case bezier_point::Type::Anchor:
53 hi_axiom(prev_it->type != bezier_point::Type::CubicControl1);
57 case bezier_point::Type::QuadraticControl:
58 if (it->type == bezier_point::Type::QuadraticControl) {
59 r.
emplace_back(midpoint(prev_it->p, it->p), bezier_point::Type::Anchor);
62 hi_axiom(prev_it->type == bezier_point::Type::Anchor);
67 case bezier_point::Type::CubicControl1: r.
push_back(*it);
break;
69 case bezier_point::Type::CubicControl2:
70 if (prev_it->type == bezier_point::Type::Anchor) {
71 hi_axiom(prev_prev_it->type == bezier_point::Type::CubicControl2);
73 r.
emplace_back(reflect(prev_prev_it->p, prev_it->p), bezier_point::Type::CubicControl1);
75 hi_axiom(prev_it->type == bezier_point::Type::CubicControl1);
83 prev_prev_it = prev_it;
87 for (ssize_t i = 0; i < ssize(r); i++) {
88 if (r[i].type == bezier_point::Type::Anchor) {