A (scalar) cubic Bezier spline **B(s)** is a curve that is a piecewise
Bezier cubic function. A typical Bezier cubic function might be
denoted by **y(t)**.

A Bezier cubic function **y(t)** is a cubic function, usually
thought of as restricted to the range **0 <= t <= 1**.
The form of the function is specified by the values of four
*control points*, whose **t** coordinates are 0, 1/3, 2/3, and 1.
The **y** values of these control points are often denoted
by **P _{0}**,

The control point **P _{0}** can be thought of as the value of

whence we havedy/dt(0) = P_{1}- P_{0}------ t_{1}- t_{0}dy/dt(0) = 3 * ( P_{1}- P_{0})

P_{1}= P_{0}+ 1/3 * dy/dt(0)

Similarly, the control point **P _{3}** can be thought of
as the value of

whence we havedy/dt(1) = P_{3}- P_{2}------ t_{3}- t_{2}dy/dt(1) = 3 * ( P_{3}- P_{2})

P_{2}= P_{3}- 1/3 * dy/dt(1)

Because **y(t)** is a cubic function of **t**, we have a
formal representation for it as:

From the control point information we have been given, we can determine thaty(t) = a * t^{3}+ b * t^{2}+ c * t + d

Thus, given values for the control points, we can evaluate the Bezier functiona = P_{3}- 3 P_{2}+ 3 P_{1}- P_{0}b = 3 P_{2}- 6 P_{1}+ 3 P_{0}c = 3 P_{1}- 3 P_{0}d = P_{0}

While the control point formulation may be natural in some
cases, it may be the case that we want to use a Bezier representation,
but we do not see how to choose the control points. Instead, we
have a set of data values, and we would be perfectly satisfied if
we could use our Bezier representation to express the form of
a function that exactly passes through the four specified data values
(for a cubic Bezier function) or for **3*n+1** data values, for a cubic
Bezier spline constructed out of a succession of Bezier functions.

It turns out that it is not difficult to take a set of four data values and determine the appropriate control point information that will guarantee that our data will be interpolated. And if we can do this for a single cubic Bezier function, the technique is simply repeated for successives sets of data, to handle the case of a cubic Bezier spline.

So, sticking with the Bezier cubic function, let us suppose that
we have four values **y0**, **y1**, **y2** and **y3**,
and that we want to determine control values so that our Bezier
function will pass through these data points. To force interpolation,
it is only necessary to set the definition of the control point
values as follows:

P_{0}= y0 P_{1}= ( -5 y0 + 18 y1 - 9 y2 + 2 y3 ) / 6 P_{2}= ( 2 y0 - 9 y1 + 18 y2 - 5 y3 ) / 6 P_{3}= y3

The above formulas were derived by evaluating the formal representation
of the cubic Bezier function at **t = 0, 1/3, 2/3 and 1**. The
four equations reduce to two "interesting" equations involving
the unknowns **P _{1}** and

The Bezier function **y(t)** determined by these control values
will have the interpolation property we desired, namely, that:

y(0) = y0 y(1/3) = y1 y(2/3) = y2 y(1) = y3

The relationship between the control points and data points is linear, and the relationship we derived above may be written as

[ P_{0}] = 1/6 * [ 6 0 0 0 ] * [y0] [ P_{1}] [-5 18 -9 2 ] [y1] [ P_{2}] [ 2 -9 18 -5 ] [y2] [ P_{3}] [ 0 0 0 6 ] [y3]

This relationship can be inverted:

The fact that each row contains positive entries that add up to 1.0 is a partial illustration of the fact that the data values are[y0] = 1/27 * [ 27 0 0 0 ] * [ P_{0}] [y1] [ 8 12 6 1 ] [ P_{1}] [y2] [ 1 6 12 8 ] [ P_{2}] [y3] [ 0 0 0 27 ] [ P_{3}]

To see the difference between the usual approach and this
interpolating approach, consider the case where you are
approximating the function **f(x) = sin(x)** over the
interval **0 <= x <= pi**; in the usual case, we would
set **F(t) = f(x/pi) = sin ( pi * t )**, and find

Note that the value of Y1 = F(1/3) = Y2 = F(2/3) = 0.8660. In this case, some sample values of the cubic Bezier function areP_{0}= F(0) = 0.0 = 0.0 P_{1}= F(0) + 1/3 * dF/dt(0) = pi/3 = 1.0472 P_{2}= F(1) - 1/3 * dF/dt(1) = pi/3 = 1.0472 P_{3}= F(1) = 0.0 = 0.0

T Y(T) 0.000000 0.000000 <--- Interpolation for (T0,Y0) 0.083333 0.239983 0.166667 0.436333 0.250000 0.589050 0.333333 0.698133 <--- We do NOT interpolation (T1,Y1) 0.416667 0.763583 0.500000 0.785400 <--- Here is a poor estimate of sin(pi/2)! 0.583333 0.763583 0.666667 0.698133 <--- We do NOT interpolation (T2,Y2) 0.750000 0.589050 0.833333 0.436333 0.916667 0.239983 1.000000 0.000000 <--- Interpolation for (T3,Y3)

In the interpolating case, we set

In this case, some sample values of the cubic Bezier function areP_{0}= F(0) = 0.0 P_{1}= (-5*F(0)+18*F(1/3)- 9*F(2/3)+2*F(1))/6 = 1.2990 P_{2}= ( 2*F(0)- 9*F(1/3)+18*F(2/3)-5*F(1))/6 = 1.2990 P_{3}= F(1) = 0.0

T Y(T) 0.000000 0.000000 <--- Interpolation for (T0,Y0) 0.083333 0.297687 0.166667 0.541250 0.250000 0.730687 0.333333 0.866000 <--- Interpolation for (T1,Y1) 0.416667 0.947187 0.500000 0.974250 <--- Estimate of sin(pi/2) improved! 0.583333 0.947187 0.666667 0.866000 <--- Interpolation for (T2,Y2) 0.750000 0.730687 0.833333 0.541250 0.916667 0.297688 1.00000 0.000000 <--- Interpolation for (T3,Y3)

Computer graphics users are perfectly happy with Bezier functions and splines in which the control points are used in the usual way. And there is nothing wrong with that! It's just that, sometimes, the data you have (just a string of function values) doesn't seem to "fit" the tool that's available (in this case, a Bezier function). But it's not hard to figure out a way to "massage" your data to produce the information the Bezier function wants; and if interpolation is fine with you, so much the better. (When you go for interpolation, however, you are giving up the ability to control the smoothness of the transition from one Bezier function to the next, if you are using a Bezier spline, for instance.)

John Burkardt.

You can return to the HTML web page.