back
42 comments
I love bezier curves. In community-college, it was the first time I ever encountered a subject that made me want to go do more research on my own. One of my core memories is toiling away for multiple nights when the rest of the house was asleep on my 2015 Macbook Pro, writing janky p5.js code and pressing refresh on the browser page over and over until suddenly, I started see real, beautiful curves blossom from my control points.

I just went back to dig up some old sources[0], and I can't believe this post is almost a decade old now. This guy's explainers and animations were leagues beyond any other resource I could find through Google searc at the time.

[0] https://jamie-wong.com/post/bezier-curves/

This is fucking fantastic. I wish the whole of the internet was like this. People enthusiastically sharing their own enthusiasm about learning something cool, and other enthusiasts finding it and going down their own rabbitholes. The internet is multimedia. It should be nothing _but_ people sharing knowledge. Thanks for writing this up.
Pretty much sums up why this site is my last bastion of solace on the web
Related: Last year I had the pleasure to work with Bezier curves to make a very specific UI for an app I was working on.

I wrote down a bunch of posts on how I achieved the UI primarly to explain the process to my future self[0]

As a mobile developer it was so much fun to do something other than building a CRUD app.

[0]https://www.krtkush.com/computer-graphics-basics-with-compos...

So Raph, how do you draw these things? I’m not sure exactly where I’d start given an equation of the curvature or tangent (I assume?) angle. The pen tool link talks about “auto points”, giving the impression that it’s a sort of Bezier subdivision with some constraints, is that accurate? And your article mentions you’ve since fixed some things in the math - so this is a bit different from the pen tool, not using auto points?

Playing with your demo, I see the curve lock shape in certain configurations and stop moving even when I’m dragging one of the control points around. Is this a temporary or numerical stability issue, or is this a property of hyperbezier curves? For example if I arrange the control points in a square with P0 bottom left, C1 bottom right, C2 top left, P3 top right, and then drag C1 to the right, the shape locks up quickly. Eyeballing, it’s maybe when the length of P0C1 is ~1.5 times the length of C2P3? Moving C1 further right and up/down, there’s a huge area where moving C1 doesn’t affect the shape of the curve.

I was slightly curious about the P/C naming as well - is this a Hermite-like idea where P[03] are points and C[12] are similar to tangent vectors? Why not use P[0123]?

Probably one really obvious thing worth mentioning - Beziers are indeed very versatile, but it has to be said that one of the reasons they’re so popular is because the math is so simple, right? Decomposable into linear steps, integer exponents, with a couple multiplies of only your parameter you can evaluate them with a matrix multiply. They’re trivial to draw. Add in the controllability and intuitiveness and simplicity of computing other properties of the curve (such as finding roots & inflections & bounding boxes, splitting curves, etc.), and it makes sense they’re very popular. Hyperbeziers look interesting, and I don’t have intuition on their uses yet, but I assume their rendering involves heavier math than Beziers - since the curvature & angle equations have a divide & square root? Can they be split or subdivided easily?

You’ve been in search of a better curve for a long time. I’m wondering how you think about and where you stand on subdividing curves like Bezier vs finding a more perfect interpolation. Obviously there are tradeoffs, but are you aiming at problems that can’t be solved in practice using subdivision/approximation? I’d also be curious to hear your thoughts on hyperbeziers vs NURBS.

I'll try to answer some of these questions.

Yes, there are regions of the parameter space where moving a control point has vanishing effect on the curve shape. I'm not thrilled about this and have explored alternatives, but this is the best I could come up with. Pretty much all approaches based on solving for optimal curve fit have discontinuous "flipping" behavior. Another approach would be to split

We haven't yet done the work wiring this up into a spline like the older pen tool draft. The "auto point" is not a form of subdivision but is a way of achieving G2 continuity.

Yes, hyperbeziers can be split and subdivided without much trouble at all, and being closed under subdivision is an important mathematical property that was lacking in the earlier draft. This follows directly from their formulation as polynomials. If you look into the code, you'll see that there's subdivision at the near-cusp to make the integral robust.

The P/C naming evokes Hermite but there wasn't a lot of thought into it.

Math is heavier, but this is more nuanced than you might expect. My feeling is that computers are fast, so if we can draw higher quality curves with less human effort, it's worth it. But the seeming simplicity of Béziers is deceptive; you often have to solve inverse arc length problems (for example to compute dashing), and curve fitting is really hard (I have a blog post in the pipeline on that). So I think overall the math is only slightly heavier.

The goal is human-driven interactive design, originally motivated by font design. Splitting into more Béziers obviously gives much finer control, but it's hard to avoid them getting lumpy. In most fonts you have a minimum number of Bézier segments and accept whatever fine details the Bézier math gives you. That's even more so when making variable fonts, where the control points are interpolated.

I haven't yet done a rigorous comparison with NURBS. While they're hugely popular in CAD, they're basically unused in things like font design.

Thanks for these questions, they obviously show a deeper understanding.

Thanks! Okay this makes sense, and I have to agree interactive design with fonts & CAD does call for more control, and subdivision and resampling does often lead to lumpy, or just harder to manage curves. Personally I use splines mainly for CG hair rendering and procedural geometry, so very different goals. Do you see any major benefits to using hyperbezier curves for procedural/simulation assets like hair, or for applications like maps or auto-generated UI or other use-cases outside of manual design?

I have some modest experience with the polynomial curves but very little experience with the kind of non-polynomial curves you post about. I’m always curious but haven’t spent the time studying that I’d like to. I don’t have a lot of experience with NURBS either; it was just the rational in the hyperbezier curvature formula that made me think maybe there’s a relationship, and/or the rational in NURBS has something to do with it’s greater level of control versus the uniform B-spline.

Super good questions.

First, for hair rendering you've got a 3D trajectory, which Béziers can handle just fine, but I'm not sure about these spirals. I do have a chapter in my thesis and there has been a bit of followup from others, but I can't say anything with confidence.

That said, because of the specular reflections, applications like hair really would benefit from higher degrees of continuity. Cem Yuksel has a recent SIGGRAPH paper on how to tweak Béziers to get more continuity. In fact, seeing that was one of the motivations to take this work off the back burner.

I'm not sure about maps. But I do know of applications representing the centerline for autonomous vehicles that use polynomial spiral representations, specifically because of the extremely high degrees of continuity you can attain. For that, you don't have to represent these high-tension curvature regions.

I do think there is a specific application for drawing smooth connecting lines in autogenerated diagrams. These tend to be S-shaped, and with Béziers you tend to get curvature peaks near the endpoints. You're much better off with monotonic curvature and with spirals that's easier to achieve. And I also believe being able to get those squircle/superellipse shapes would help as well.

> because of the specular reflections, applications like hair really would benefit from higher degrees of continuity.

Oh this is interesting. So FWIW - I’ve done a bit of CG hair in production (in a previous life, for DreamWorks) - and now that everyone’s ray tracing, I like to advocate for considering quadratic B-splines for CG hair over cubics. In practice, I don’t personally think you can see anything in hair specular reflections that is based on degree or continuity beyond C1. Catmull-Rom is only C1 and people have been using Catroms for hair for a long time (and interesting side note - I’ve found that Catmull-Rom curves are pretty lumpy and ugly, even lumpier than quadratic B-splines. This is possibly very similar to the issue of designing with subdivision you mentioned).

My opinion here does not apply to surface patches - with surfaces, the continuity can be visible in the reflections. But at my work among the researchers there was a very strong assumption that cubic B-spline curves would be visibly better than quadratic, and that quadratic would suffer from reflection artifacts due to the C1 continuity, which just doesn’t seem to be true (and ignores the history of Catmull-Rom). Quadratic curves are faster and more accurate for ray intersections and bbox calculations, and they offer some interesting advantages like having an analytic rotation-minimizing frame (with the Frenet frame, even…). Of course with procedural curves, I recommend only the quadratic B-spline, not Bézier. With a uniform B-spline, the degree of the curve is essentially nothing more than a smoothing factor. Production hair/fur/sim data tends to be over-sampled already, so the smoothing factor doesn’t buy you much.

BTW, yes I know Cem and I’m familiar with his work. He also has published on some non-polynomial curve types, so your post reminded me of him as well.

re: the control points having areas where the curve is unresponsive. IIUC, whereas the control points of a Bezier have direct meaning, this is an attempt at a sensible/usable mapping of synthetic control points to the curve? Which presumably means it could be made much better with some work/exploration? Or did I misunderstand that part?
Playing with the example, the controls points don’t feel any more intuitive to work with than traditional cubic Béziers. They still exhibit annoying behaviors near the endpoints, though they don’t tend to “explode” like traditional cubics.

I find it curious that the author makes no attempt to compare his solution to other splines like B-splines or Catmull-Rom splines, given their popularity in computer graphics and CAD.

> the author makes no attempt to compare his solution to other splines like B-splines or Catmull-Rom

I’d argue that talking about Bézier is absolutely sufficient in this context; B-splines and Catmull-Rom splines and a few other types are all piecewise polynomial splines (cubic specifically, at least in the case of Catmull-Rom). You can convert B-splines and Catmull-Rom splines to Bézier directly and analytically; therefore B-splines and Catmull-Rom splines cannot do anything beyond what Bézier curves can do. There are some minor usability / interface / intuition differences, but there is no difference in mathematical control.

One big aspect that made Bezier popular was local support, i.e. moving control points resulted in expected changes in the same direction. It's interesting that this is the result of a search for 'a curve family better suited for interactive design than cubic Beziers.' I think it's better for achieving curve quality in the sense of curvature changes, but not so much in interactivity.
Trying the example from TFA, I think that it is easy to acquire a good intuition about how the curve moves when you pull a control point and the shapes of the curves that you can obtain are more beautiful and more interesting than what you obtain with cubic Beziers.

So I believe that if for you the "interactivity" does not seem better, that is more likely to be caused by being much more familiar about how cubic Beziers behave, from past experience, than because these hyperbezier curves were really less suited for interactivity. Also, the current implementation in JavaScript seems buggy.

For me, the poor approximation by cubic Beziers of some important curves, like conics and the Euler spiral, is an extremely serious defect, so I like these hyperbezier curves much more and I intend to investigate how efficient can they be, from a computational viewpoint.

There are two bad properties in terms of interactivity (and for other uses). In some configurations hyperbezier explodes towards infinity or at least way outside the bounds of control points. Cubic beziers don't do that, if control points are bounded the curve will be as well. This is direct result of how cubic bezier can be calculated with series of linear interpolations. Other issue was that there were discontinuities while moving through parameter space or at least very sudden jumps, small changes of control points caused curve flip to completely different shape.
There are two separate questions here. One is how much moving control points creates expected changes in the same direction. Béziers nail this, as the position of a point at t is a linear combination of the control points, with the Bernstein polynomials as weighting functions. So it always feels like direct control. With my mapping, you get this for a nice big chunk of the parameter range – small to moderate angles and control point distances. But this property does fall apart when pushing to extremes.

The other question is whether the control is local. As others have remarked, this has much more to do with the way the curve is embedded into a spline than the curve family itself. In particular, it is deeply affected by the continuity constraints. As payment for the local support, cubic Béziers only give G1 continuity. Euler spiral splines, by contrast, are G2 but changes do cause those ripples.

The pen tool prototype linked in the blog post suggests giving designers more choices. If you specify all control points, you get G1 just like a cubic Bézier. But it also gives the choice of specifying one control point on a smooth endpoint, and solving the other for G2 continuity. In my experience, it feels more like local control than Euler spiral-like splines. When you want smoother curves, you do that, and when you're willing to sacrifice continuity for local control, that's also possible.

Yeah, editing TrueType fonts w/ B-splines which have a shared off-curve control point between two on-curve control points is nightmarish as a small change will ripple through the entire outline.
I haven’t done any font editing but is this true in general? Sounds like some kind of application-defined constraint. You’re talking about quadratic splines with the shared approximating point between interpolating points, and probably quadratic Bézier, not B-splines, I would guess. Quadratic Bézier would do this if the application decides to constrain all tangents to be smooth, which is a choice, not a property of the spline. Quadratic B-splines do not in general have this property; you can move any of the control points and have local control of the curve that doesn’t extend beyond the two neighboring control points. The difference is that B-splines don’t have interpolating control points in general - the curve only approximates all the control points, and you have to use phantom points or duplicated points to ensure the curve touches them.
Mostly font editors use Bézier curves with four control points, so the effect of moving an off-curve point is limited to that portion of the curve from the associated on-curve node up towards the opposing on-curve node as affected by the other on-curve node.

It is my understanding that only a couple of very expensive font editors use B-splines where there are three control points which ripple as I noted, however it seems that FontForge supports order2 (quadratic, TrueType) or order3 (cubic, PostScript).

One big aspect that made bezier curves popular was Quake 3 Arena. That was literally first time general public even heard the name.
They were a part of computer graphics for a long time before that, 2D and 3D.
How many people knew about them prior and after Q3A?
I’ve been fiddling with curves a long time and I haven’t seen the Q3A-Bézier reference - what are you referring to exactly? Is there some blog post, and was this about game programmers knowing about cubic Bézier curves? Most of the ‘general public’ still haven’t heard of Bézier curves.

I don’t doubt something Q3 related might have popularized it. I’m familiar with the fast inverse sqrt approximation that was popularized by Q3A. That’s not what you’re thinking of, is it? (https://en.wikipedia.org/wiki/Fast_inverse_square_root) But animators and most people in graphics and rendering (the Pixar, ILM, and Siggraph types) as well as all font designers and mathematicians and car designers and CAD people all knew about Bézier curves long before Quake 3 Arena.

Dunno your age. You're probably bit younger than me.

You're right, I'm referencing to inverse sqrt.

Bezier curves were the main talking point about Quake 3 engine throughout all PC magazines when Quake 3 demo came out.

Because it was like nothing ever seen before, and noone ever expected it to run ~20-30FPS on period HW.

It wasn't a talking point for too long as with full game, Quake 3 became top multiplayer game, and graphics behind it were not important anymore.

> You’re probably bit younger than me.

Why do you say that? I was in graduate school studying computer graphics when Q3A was released. Before that, at a different school as an undergrad, there were entire courses on Bézier splines and NURBS and multiple textbooks that had written about them. All the universities in the US with computer science departments that taught any graphics in the 80s & 90s covered Bézier curves, and that’s not to mention anyone studying design, drafting, CAD, architecture, engineering, etc.

Ah I looked it up. Bi-Quadratic Bézier patches were used in Quake 3. They were tessellated into triangles for the HW.

The first quote I found from Carmack about this: “Well, this is technology that's been done since the late '60s as far as the different geometric representations go.” So it wasn’t new in general, but was new to real-time game engines, and there is a pretty big group of gamers and aspiring game programmers who heard about Bézier patches for the first time with Q3A. https://www.reddit.com/r/quake/comments/16w5g1i/the_quake_3_...

I have a wooden banana hanger that I designed using bezier curves, twenty years ago. Actually I made two; one of pine and another one of oak. I have the files somewhere, I hope; it was made using an abandonware vector graphics program called Dia.

It is made of two pieces: the base and the hook support. If you look at it from certain angles, you can perceive continuity between the curves of these two parts, because of the way the bezier curves project. I feel that this gives it elegance even when viewed from other angles.

“Polynomial spirals, or Spiro curves, the subject of my PhD thesis, fail to achieve this goal.”

Wasn’t your PhD thesis on attack-resistant trust metrics? At least I remember reading it.

That was my first attempt at a PhD thesis. The one that actually got me over the line was the second attempt, on spirals and splines. Of course this was all years ago.
These are an exciting new curve. I’d like to hear about how they will handle stroking. The inside and outside stroke of a Bézier curve can’t be represented with a Bézier curve. How do hyperbeziers fare?
This is future work, but I expect it to go fairly well. One encouraging sign is that there are parts of the parameter space where you do get an exact solution: circular arcs and circle involute. Another encouraging sign is that it's easy to get bounds on curvature, which is important for figuring out whether there's a cusp in the offset curve.
Very cool demo, The curve does sort of go screwball when the control points are close together.

After playing with it some more. Not close together, but more side loaded. On reflection while many of these forms would be awkward to find in a drawing program, I think this is the source of the superior spiral the author likes.

It can’t do a loop (or a cusp, in the limit) like cubic Beziers can, and may instead "lock" to a weird hook-like shape, I’m not sure whether it’s just an artifact of the way the demo tries to match the curve to a Bezier.

Loops and cusps are of course not very useful in 2D graphic or typeface design, and even if you’re animating a plane or designing a rollercoaster you’d probably use more than one Bezier to make up a looping shape.

As a clarification, the hyperbezier curve can do a loop, but I deliberately chose not to make that accessible in the parameter mapping. I couldn't figure out how to do it with any reasonable continuity. It's possible to flip from the normal shape to the loop, but I wanted to avoid that. And if you don't flip, then all trajectories have to go through an exact corner as an intermediate, which is very different behavior than the cubic Bézier. In the Bézier, the cusp can occur anywhere along the curve, but to make the corner shape it has to be exactly at the intersection of the endpoint tangents.

There are other Bézier shapes that the hyperbezier can't match, including two cusps on the interior. As you say, I consider these not very useful in actual 2D design, and am happy to give them up for smoother curves and the increased range of superellipse shapes.

This is awesome.

Geometric topology makes my brain itch. I refuse to engage with it, I am certain it would drive me mad.

I do agree though, those elastica (elasticas? elastici??) are fine as hell

This is a really cool demo, but I don't necessarily see these superceding traditional beziers so much as being another option for designers
One unintuitive thing I noticed about these curves, at least from the demo on the page, is that they have both areas where their behavior quickly 'snaps' from one configuration to another, and areas where they saturate such that changes to the control handles no longer produce any movement. Standard Bezier curves don't have either of these; I wonder if that's essentially coupled to the higher expressivity they offer?
Has anyone used those for a real life project that solves some issues or whatever?
>In this post, I present the curve family to the world.

>August 8, 2026

I would guess not.

Not yet.
Bezier curves were invented to design physical objects (cars), but they were an idealized and simplified solution to enable CAD at the time computer were much less powerful. Ideally, CAD should put elastica curves as the first choice - but they are difficult to compute as they can diverge drastically when control points get too close, and there is sometimes more than one solution for a set of constraints.

Spiro curves were supposed to solve it but I am surprised to read here that even spiro fails to approximate elastica. Have you mapped where the limitations are?

For information, I am drawing boat hulls, and elastica would model the natural bend of wood/plywood/metal much better than bezier... Amateur naval designers really lack good tools to bridge the gap between ideal hydrodynamic forms and ease of construction, and there are still a lot of tiny but annoying adjustments when one planks the first hull.

Elastica curves have only three parameters, compared with four for cubic Béziers, Spiro curves, and the new hyperbezier. The easiest way to understand that limitation is to consider the parallel curve of an Euler spiral. That has a built-in asymmetry, one end has higher tension than the other. But the math for elastica locks in odd symmetry around the inflection point.

I think hyperbezier would be a natural fit for boat hulls, but it's not a mathematically precise approximation to elastica either. I'd say to carefully evaluate it, and I'd very much like to hear how that goes.

ETA: "parallel curve of elastica" is an intriguing curve family to consider for this application, as it has the correct number of parameters and ticks a lot of the other boxes. However, the math for this is hard mode.

>Perhaps this is not surprising, as the exponent of 1.5 resembles the equation for curvature of a parametric curve : k = x' × x'' / (x'•x')^(1.5)

Hindsight is really something. Of course we usually write the denominator as |x'|^3 but once you see it, it makes sense.