# Arc Length of Bezier Curves

I'm not sure if this is more of a math.stackexchange.com (or physics??) question, but here it is:

How can I find out the distance traveled by a Bezier Curve? For example, the distance traveled by a Linear Bezier Curve is:

``````distance = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));
``````

But what of a Quadratic, Cubic, Nth-Degree Bezier Curve?

My goal is to figure out the "resolution" beforehand, so I don't have to waste time checking if the next point is touching the previous point.

-
You should reword the question to refer to the length of the curve, that is a much more straightforward (and searchable) term. –  Sparr Nov 28 '10 at 11:34
i suggest posting this on math, i'm sure some clever face over there will give you the answer in one of them clever web fonts :p –  Tor Valamo Nov 28 '10 at 17:27
@Tor I did (yesterday), but I've been told it's very complicated, and hence unpractical. [ math.stackexchange.com/q/12186/2736 ] –  muntoo Nov 28 '10 at 21:08

For cubic ones a simple way is to split up the curve into N segments and then compute the distances between each segment and sum those up, as Williham said, this in non trivial, but diving is a rather simple approach.

Also, as soon as you need more than just the length (e.g. get a point at 30% of the curves length), arc-length parameterization will come into play, so you should take a look at that.

I posted a fairly long answer on one of my own questions about béziers which explains that in simple code:
Moving ships between two planets along a bezier, missing some equations for acceleration

-
I'm doing this for the LEGO Mindstorms NXT, which has a really weak processor (48Mhz), so I need as much speed as possible. I'll take the dividing approach to conserve some speed, and get it accurate enough (for "non-realtime" rendering). I also have a option in which you can set the value of `1.0/t` (called `resolution`), so that's for "realtime" (which is at best 10fps on the slow NXT). Every iteration, `t += resolution`, and a new point/line is drawn. Anyways, thanks for the idea. –  muntoo Nov 29 '10 at 0:58

While this question is a better fit for math.stackexchange.com, the short version is that except for trivial and/or degenerate cases; solving for the exact length of an arbitrary bezier curve is non-trivial.

If you can make do with an approximation, quadratic curves are relatively easy to deal with (source), cubic curves less so.

-

While I am d'accord with the answers you got already, I want to add a simple but powerful approximation mechanism which you can use for any degree Bézier curves: You continually subdivide the curve using de Casteljau subdivision until the maximum distance of the control points of a sub-curve to the sub-curve's baseline is below some constant epsilon. In that case the sub-curve can be approximated by its baseline.

In fact, I believe this is the approach usually taken when a graphics subsystem has to draw a Bézier curve. But do not quote me on this, I do not have references at hand at the moment.

In practice it will look like this: (except the language is irrelevant)

``````public static Line[] toLineStrip(BezierCurve bezierCurve, double epsilon) {
ArrayList<Line> lines = new ArrayList<Line>();

Stack<BezierCurve> parts = new Stack<BezierCurve>();
parts.push(bezierCurve);

while (!parts.isEmpty()) {
BezierCurve curve = parts.pop();
if (distanceToBaseline(curve) < epsilon) {