However the edge cases are nightmares to deal with. Intersection (and similar operations) typically work by approximating via subdivision, so you'll never get an accurate answer, which is important when dealing with boolean operations. You'll wind up piling on hacks. One edge case I wound up being due to a floating point arithmetic error, which was fun because my computer science degree finally wound up coming in handy.
It makes me appreciate the work that the guys who made paper.js. They've done some outstanding work, and it's by far the most superior open source vector graphics framework out there.
These are everywhere whenever you do anything with vector graphics in the real world. Lots of interesting computational geometry papers end up useless in reality because floating point error kills you if you try to implement the algorithms. It's pretty sad…
The other issue that comes up again and again is self-intersecting paths. Most published algorithms you'll find don't bother to support them, which also makes them not very useful in reality because self-intersecting paths are everywhere.
I'm very skeptical of clever vector path algorithms these days. The amount of work needed to get them to work in the real world is rarely worth it. Better to spend the time reformulating the problem in such a way as to avoid needing them.
> From the beginning of the implementation of Triangle, and well into the development of Pyramid, floating-point roundoff problems plagued me. Each program would sometimes crash, sometimes find itself stuck in an endless loop, and sometimes produce garbled output. At first I believed that I would be able to fix the problems by understanding how the algorithms went wrong when roundoff error produced incorrect answers, and writing special-case code to handle each potential problem. Some of the robustness problems yielded to this approach, but others did not. Fortunately, Steven Fortune of AT&T Bell Laboratories convinced me, in a few brief but well-worded email messages (and in several longer and equally well-worded technical papers), to choose the alternative path to robustness, which led to the research described in this chapter. For reasons that will become apparent, exact arithmetic is the better approach to solving many, if not all, of the robustness worries associated with triangulation.
Of course, what can be done with polygons is often not feasible for more general kids of shapes like parametric cubics.
* * *
What is a “clever vector path algorithm”, and how do you avoid them?
Exactly this. This is the biggest challenge when doing useful stuff with curves in graphics design/3D.
Curve offsetting is a common tool to produce paths (2D), extrusions & bevels (3D) etc. Whenever the offset distance exceeds the local radius of curvature intersections occur.
When you have some clever algorithm to deal with those, e.g. clipping them out, you're then faced with offset curves that have different parameterization than the original. Try to create a patch mesh from those then.
This is a huge brain fuck and every time you think you got it worked out another edge case you didn't think about will creep up from out of nowhere.
Holy crap! Looks amazing!
● Computer-Aided Design - more applications and commercial stuff https://www.journals.elsevier.com/computer-aided-design
● Computer Aided Geometric Design - mainly geometric algorithms for curves and surfaces https://www.journals.elsevier.com/computer-aided-geometric-d...
Discussed a while ago: https://news.ycombinator.com/item?id=18738275
I know Beziers, NURBS, etc, but never had heard of Hobby. A visual would have been great.
Anyone know what "compatible" means as used here?
As an aside, I personally prefer NURBS, they feel much more "pure" if that makes any sense. Plus they can produce real circles, which is a pretty nice feature of a curve-system.
The polynomial cubic Béziers are defined by 4 control points. In 2D that's 4 x 2 = 8 degrees of freedom. In the terminology of HN raphlinus's PhD thesis, we fix the 2 endpoints, which removes 4 degrees of freedom, and they're referred to as a 4-parameter family.
In addition to the 2 endpoints, Hobby splines are defined by the start and end tangent angles Θ0 and Θ1, plus a tension parameter τ.
If we fix the 2 endpoints and the tension parameter τ, and allow Θ0 and Θ1 to vary, then we have a 2-parameter subspace of the 4-parameter space of polynomial cubic Béziers for 2 fixed endpoints.
If we allow the tension parameter τ to vary we have a 3-parameter subspace.
So we have lost 1 degree of freedom, but in terms of aesthetics we haven't lost so much because the majority of the splines that we've thrown away are likely uglier than the splines we retained.
One TL/DR from HN raphlinus's thesis: Euler spiral splines are about the best you can do for a 2-parameter family that cover all reasonable possibilities for Θ0 and Θ1 with good aesthetics.
I could see it useful as a way to interpret hand-drawn shapes such as graphs, or even letters.
The UI to toggle into Spiro mode is a little bit obtuse but once you're in it's pretty cool.