Pull, Don't Draw: The Control Polygon Under Every Rhino Curve
How one idea, cutting each leg of a control polygon at the same ratio, became the Bézier curve and the NURBS geometry behind every Rhino control point.
Open Rhino, draw any free-form curve and press F10. A scatter of dots appears, joined by thin straight lines, floating slightly off the curve itself. Those dots are not decoration and they are not a display setting. They are the control polygon: a handful of points the curve mostly never touches, yet obeys completely. You drag one and the whole curve leans toward it. Every curve, every surface, every arc and every circle you have ever modelled in Rhino is built on this one idea. It is a curve that is steered, not drawn.
The idea is older than your software and it began on the drawing tables of the European car industry. Two engineers, in the same Paris decade, reached it separately while trying to solve one practical problem: how to give a milling machine a stylist’s sweeping line precisely enough that it could cut the same body panel twice, identically. One worked at Citroën, the other at Renault. A generation later, a doctoral thesis at Syracuse University generalised their curve into the form Rhino runs on today. This essay follows that line from the car body to the facade panel and finishes with a few lines of code you can run yourself.
←TODAY: In 2026 most curves a Swiss office sends to a CNC router leave as NURBS, through 3dm, STEP or IGES.
→3012: The file formats will turn over many times; the step of cutting each leg at ratio t will outlast all of them.
Fulcrum: If you understand the construction, you can rebuild the geometry from first principles whatever happens to the file.
What it is
What it is: A Bézier curve is a smooth curve defined by an ordered set of control points. It starts on the first point and ends on the last. The points in between act as handles that pull the curve toward them without lying on it. A NURBS curve (Non-Uniform Rational B-Spline) is the same idea extended in three ways. It chains many short Bézier-like pieces together. It lets those pieces have unequal lengths in parameter space. And it gives every control point a weight. Degree, control points, knots, weights: these four words in Rhino’s Properties > Details panel cover the whole concept. You do not need to derive the formulas to use Rhino well. You do need to understand what each word controls.
Why it works
Why it works: Start with four points, P0 to P3. Choose a number t between 0 and 1, say 0.3. Mark the point 30% of the way along each of the three legs of the control polygon. You now have three new points, so join them and cut again at 30%, which gives two points. Cut once more and you have a single point, and that point lies on the curve. Sweep t from 0 to 1 and you trace the entire curve using nothing except repeated linear interpolation, the same “go a fraction of the way from A to B” you use to place a point on a line. This is de Casteljau’s algorithm. It is numerically stable, which is why geometry kernels still rely on it decades after it was first written down.
Write the same construction out as one formula and each control point turns out to be multiplied by a blending polynomial. These are the Bernstein polynomials, which Sergei Natanovich Bernstein introduced in a probabilistic proof of the Weierstrass approximation theorem, published in 1912 in the Communications de la Société Mathématique de Kharkov. For any t the blending weights add up to exactly 1. That partition of unity is the reason the curve always stays inside the convex hull of its control points. The curve cannot escape its cage, and that predictability is what makes it feel natural to edit.
A single Bézier curve with many control points gets stiff, though: move one point and the whole span moves. B-splines solve this by joining several low-degree pieces at knots, so that dragging a control point only changes the stretch of curve nearby. “Non-uniform” means the knots can be spaced unevenly. “Rational” means each control point carries a weight, and a heavier weight pulls the curve harder toward its point. With the right weights a degree-2 curve becomes an exact circle or ellipse, something a plain Bézier curve or a non-rational B-spline cannot represent. That is why Rhino’s circle is a true circle and not a polygon with many sides. The trade-off is built into the system. Raising the degree buys smoothness but spreads every edit further along the curve, and rebuilding a curve with fewer control points buys editability at the cost of fidelity to the shape you had.
Origins
Origins: Before computers, shipbuilders drew fair curves with flexible wooden battens held in place by lead weights known as “ducks”. The mathematician I. J. Schoenberg named the mathematical spline after that tool. The batten was an analogue computer that minimised bending, and the curve came out of the material.
Paul de Casteljau, born in Besançon in 1930, was a physicist and mathematician trained at the École Normale Supérieure. He joined Citroën in 1958 and stayed until he retired in 1992. In 1959 he developed the algorithm that now carries his name. According to Wikipedia’s account of his publications, it was recorded internally as Outillage Méthodes Calcul (INPI Enveloppe Soleau No. 40.040, 1959) and followed in 1963 by the internal document Courbes et Surfaces à Pôles. Citroën kept the work internal, so it was not published until 1974.
At Renault, Pierre Bézier had joined in 1933 at the age of 23, after a mechanical engineering degree from the École des Arts et Métiers (1930) and a second degree in electrical engineering from Supélec (1931), and spent 42 years with the company. As Christophe Rabut of INSA Toulouse wrote in his December 1999 obituary notice in NA Digest (v99 n48), Bézier “started his research in CADCAM in 1960” on his UNISURF system, which “was launched in 1968 and has been in full use since 1975”. Bézier published openly, and so the curve carries his name. Wikipedia sums this up carefully: he “popularized but did not actually create the Bézier curve”. The best way to read the history is as two engineers who reached the same idea independently, each of them solving their own company’s problem. Bézier went on to earn a doctorate in mathematics in Paris in 1977, at 67, received the ACM SIGGRAPH Steven A. Coons Award in 1985, and was awarded an honorary doctorate by the Technical University Berlin.
The quiet hero of this chapter is Wolfgang Boehm. He was the first in the research community to credit de Casteljau and coined the term “de Casteljau algorithm” in the late 1970s. Without that act of careful attribution, the first engineer’s name could easily have been lost. De Casteljau later received the 1987 Seymour Cray Prize, the 1993 John Gregory Memorial Award and, in 2012, the Bézier Award from the Solid Modeling Association.
The road to NURBS ran through Syracuse University, where Steven A. Coons’ group, which also included William Gordon and Robin Forrest, worked on computer-aided design. Rich Riesenfeld’s dissertation brought B-splines into CAD. Ken Versprille’s 1975 PhD, Computer-Aided Design Applications of the Rational B-Spline Approximation Form, supervised by Coons and held today in Syracuse’s SURFACE repository, generalised them to the non-uniform, rational form. Boeing adopted it, a Boeing manager coined the acronym “NURBS”, and the form went into Boeing’s TIGER CAD system before becoming part of IGES, STEP, ACIS and PHIGS. Writing on the Siemens Solid Edge blog on 16 September 2013, Versprille put the spirit of the work in one line: “It’s all about the application of the math. Not just the math!”
Rhino arrived late in this story, and its contribution was to package the maths for everyone else. The McNeel timeline records a first meeting with Applied Geometry in May 1992 about integrating their AGLib NURBS library into AutoCAD, a Rhino beta in April 1994 and Rhino 1.0 in October 1998. David Rutten’s Grasshopper, first released in 2007 and added to Rhino for Windows in March 2008 according to the same timeline, turned those control points into parameters that anyone could wire together. As PAZ’s earlier piece Universal glue put it, Rhino’s NURBS geometry is what lets complex forms be created precisely and intuitively through editable control points. Making a research result usable on an ordinary office desk was engineering in its own right.
In practice
In practice: The control points that shaped a car fender in the 1960s now shape a curved facade panel, the edge of a CNC-milled foam or timber formwork, or a laser-cut rib for a free-form roof. All of them leave the office as NURBS, through native 3dm, STEP or IGES. Because the arcs are rational, the fabricator’s CAM software receives the true radius rather than a faceted guess, and the shop can cut the same shape twice, which is exactly what Renault wanted from UNISURF. In Grasshopper the concepts appear as components. Nurbs Curve takes control points, a degree and a periodic flag. Control Points breaks an existing curve back down into its points, weights and knots. Once you know what those outputs mean, a definition stops being a black box and becomes something you can reason about.
Atelier: When a Büro adopts AI-assisted modelling, the tools generate curves faster than anyone checks what those curves actually are, and a rebuilt degree-5 approximation of an arc looks identical on screen to a true rational circle until it reaches the CNC shop. The Monday move: add one line to your fabrication handoff template that records the degree, control-point count and rational flag (all read from Properties > Details) for every curve that leaves for CAM.
From where I write, decades on, the parametric files my generation regretted were rarely the ugly ones. They were the ones whose logic nobody could rebuild after the plugin went dark. A curve you can describe as “degree 3, seven points, these weights, these knots” can be rebuilt by anyone. A curve described only as “the output of the tool” cannot. Keep the description.
Hack
Hack: Trace a cubic curve by hand with de Casteljau’s cut-at-the-same-ratio loop inside a GhPython component, then lay it over Grasshopper’s own Nurbs Curve output for the same four points with degree 3. Feed the component a list of points called cps (set the input to List Access) and pass the output to a Polyline component. The two should coincide, because an open, uniform, degree-3 NURBS with four control points is exactly a Bézier curve. Then add a fifth point and watch the hand-built curve stiffen while the NURBS version stays local.
def lerp(a, b, t): return [a[i] + t * (b[i] - a[i]) for i in range(3)]
def casteljau(P, t):
while len(P) > 1: P = [lerp(P[i], P[i + 1], t) for i in range(len(P) - 1)]
return P[0]
import Rhino.Geometry as rg
a = [rg.Point3d(*casteljau([[p.X, p.Y, p.Z] for p in cps], k / 40.0)) for k in range(41)]Open your last facade or formwork model today, press F10 on its most important curve, and read the control polygon until you can explain why the curve takes the shape it does.
PAZ Kaffi · multidisciplinary editorial, led by PAZ Academy