The fix is to move to a tuple/pair<bool convex, Arc>.
The logic for using one or the other becomes:
if (convex ^ extrusion < 0) return convex_visitor(); else return concave_iterator(); // does not work with edges, though '-'
(Exists no longer makes sense.)
The only other change that needs to happen is the corner constructor and Shape's Arc generation, which will probably be far more tangled than I expect.
There's also some weirdness with non-closed Shapes.
One possible (albeit convoluted) solution:
The fix is to move to a tuple/pair<bool convex, Arc>.
The logic for using one or the other becomes:
if (convex ^ extrusion < 0) return convex_visitor(); else return concave_iterator();
// does not work with edges, though '-'(Exists no longer makes sense.)
The only other change that needs to happen is the corner constructor and Shape's Arc generation, which will probably be far more tangled than I expect.
There's also some weirdness with non-closed Shapes.