Drawing ellipses and elliptical arcs with piecewise cubic Bézier curve approximations
Jerry R. Van Aken
TL;DR
The paper tackles the problem of rendering ellipses and elliptical arcs with compact piecewise cubic Bézier code by exploiting affine invariance to map circle-based arc approximations to arbitrary oriented ellipses. It proposes a simple, portable interface using three points $C$, $P$, and $Q$ to define an ellipse, and provides concrete C++ implementations for DrawEllipse and DrawEllipticalArc that decompose the shapes into a small number of Bézier segments. Key contributions include deriving Bezier control-point placement rules (e.g., $\tau=(4/3)\tan(\phi/4)$) for arc approximation, mapping between circle and ellipse via a 2×2 matrix $\mathbf{M}$, and a rigorous error analysis with practical guidance on segment sizing. The approach enables consistent, affine-transform-friendly rendering across graphics libraries, with explicit handling of arc start/direction and segment-wise accuracy control for robust 2D graphics applications.
Abstract
This tutorial explains how to use piecewise cubic Bézier curves to draw arbitrarily oriented ellipses and elliptical arcs. The geometric principles discussed here result in strikingly simple interfaces for graphics functions that can draw (approximate) circles, ellipses, and arcs of circles and ellipses. C++ source code listings are included for these functions. Their code size can be relatively small because they are designed to be used with a graphics library or platform that draws Bézier curves, and the library or platform is tasked with the actual rendering of the curves.
