Bezier curves are shapes very popular in computer design. They could be found among instruments in almost any image editor, including Microsoft Paint presented with any version of Windows.
Initially they were invented by engineers working on design of car bodies at automobile industry. Now we will try to learn how to create such curves programmatically.
The curve is defined by starting, ending and several intermediate points. The example above have
4 points - i.e.
At first step we draw a polyline between these points, from starting via all intermediate in order to the ending one. It is shown with thin grey line at the picture.
Now suppose we choose some parameter
alpha in range
0 ... 1 and divide each segment of the polyline according
to it, i.e. in ratio:
alpha : (1 - alpha)
For example, in the drawing above
alpha = 0.333.
For polyline drawn between
N points and consisting of
N - 1 segments we get
N - 1 new points - they are shown
as small purple dots at the leftmost picture.
Let us link these new points with new polyline, consisting of
N - 2 segments. It is shown as thin blue line at
the central and right-most pictures.
Then we can divide these new segments with the same ratio
alpha once more. So we build a third polyline (shown in
green at the rightmost picture).
We will continue building polylines until we get the last one consisting of only one segment. When we divide it with
alpha, we get a single point.
This last point is the point of the Bezier Curve corresponding to parameter
The remaining is simple - just repeat these steps for different values of
alpha - for example:
alpha = 0.00, 0.01, 0.02, 0.03, ... , 0.98, 0.99, 1.00
So that for example with
101 value (from
1 with the step of
0.01) we get the same amount of points,
placed closely enough to each other. Connecting them we get the smooth curve (thick grey line at the rightmost
Please refer to wikipedia article for more examples and animated demo.
Input data will contain the number of initial points
M and the number
N of values for parameter
M lines will contain coordinates of one initial point each (
Answer should contain
N pairs of coordinates (also
Y) for all calculated points lying on the given
curve. Pairs and points in them should be separated simply by space. Coordinates should be rounded to nearest
integer (because when we do graphics coordinates of pixels are of course integer).
Note: the values for
alpha should be calculated by dividing the range
0.0 ... 1.0 into
N - 1 equal steps.
input data: 4 10 0 180 90 0 180 120 270 60 answer: 0 180 30 130 60 99 90 82 120 76 150 75 180 78 210 79 240 74 270 60
Additional Exercise for your own amusement - try to draw the resulting curve by the points which you calculated
using graphical instruments of your favorite programming language. Or you can do this loading these points into
Microsoft Excel (
Openoffice Calc) and drawing
XY chart by them.