17 enum class Type { Anchor, QuadraticControl, CubicControl1, CubicControl2 };
39 std::vector<bezier_point>::const_iterator
const begin,
40 std::vector<bezier_point>::const_iterator
const end)
noexcept
46 auto prev_it = end - 1;
47 auto prev_prev_it = end - 2;
48 for (
auto it = begin; it != end; it++) {
50 case bezier_point::Type::Anchor:
51 hi_axiom(prev_it->type != bezier_point::Type::CubicControl1);
55 case bezier_point::Type::QuadraticControl:
56 if (it->type == bezier_point::Type::QuadraticControl) {
57 r.
emplace_back(midpoint(prev_it->p, it->p), bezier_point::Type::Anchor);
60 hi_axiom(prev_it->type == bezier_point::Type::Anchor);
65 case bezier_point::Type::CubicControl1: r.
push_back(*it);
break;
67 case bezier_point::Type::CubicControl2:
68 if (prev_it->type == bezier_point::Type::Anchor) {
69 hi_axiom(prev_prev_it->type == bezier_point::Type::CubicControl2);
71 r.
emplace_back(reflect(prev_prev_it->p, prev_it->p), bezier_point::Type::CubicControl1);
73 hi_axiom(prev_it->type == bezier_point::Type::CubicControl1);
81 prev_prev_it = prev_it;
85 for (ssize_t i = 0; i < ssize(r); i++) {
86 if (r[i].type == bezier_point::Type::Anchor) {