# # Curves

## # 1 Arcs

Approximating a circular arc by a cubic Bézier curve

I needed a method that was robust in the limit of near-straight arcs as $$r \to \infty$$, here’s what I came up with based on fang’s answer on M.SE.

We want to approximate an arc through points $$A$$ and $$B$$ with radius $$r$$. If instead we have 3 points, we can use the side lengths $$a, b, c$$ of the triangle formed by the points to calculate $$r$$:

\begin{aligned} s &= \frac{1}{2}(a + b + c) \\ r &= \frac{a b c}{4 \sqrt{s (s - a) (s - b) (s - c)}} \end{aligned}

Let $$C_0 = \frac{1}{2}\left(A + B\right)$$ be the midpoint of $$A$$ and $$B$$. Let $$C = C_0 + D$$ (where $$D$$ is perpendicular to $$AB$$) be the control point of the quadratic Bézier curve through the points $$A$$ and $$B$$ with its midpoint at the midpoint of the arc, then $|D| = 2 r \left(1 - \cos\left(\sin^{-1}\left(\frac{|A - B|}{2r}\right)\right)\right)$ Naively computed this has catastrophic cancellation, so I used series expansion, with $$x = |A - B|, y = \frac{x}{r}$$: $|D| = x y \left(\frac{1}{4} + \frac{1}{64} y^2 + \frac{1}{512} y^4 + \frac{5}{16384}y^6 + \frac{7}{131072} y^8 + O(y^{10})\right)$ If $$y$$ is not small enough for the series to converge quickly enough, subdivide the original arc into smaller pieces and retry.

This quadratic Bézier is not a good approximation of a circular arc. But if we split the original arc in half (the midpoint of the arc is $$C_0 + \frac{1}{2} D$$), and then find the quadratic control points $$C_A$$ and $$C_B$$ for each half as above, they can be modified to give the control points $$Q$$ of a cubic Bézier curve for the original arc: \begin{aligned} Q_0 &= A \\ Q_1 &= A + \frac{4}{3}\left(C_A - A\right) \\ Q_2 &= B + \frac{4}{3}\left(C_B - B\right) \\ Q_3 &= B \\ \end{aligned}

A diagram may help: 