Кривые и поверхности в компьютерной геометрии, I
Алгоритм де Кастелье
Алгоритм де Кастелье позволяет построить кривую Безье с помощью рекуррентного соотношения

Пусть даны опорные точки
Обозначим через
кривую Безье, построенную по точкам 
Тогда искомая кривая Безье - это кривая
Имеем
Выведем рекуррентные формулы для определения
исходя из начальных данных:
Имеем

Отсюда получаем следующую рекуррентную формулу де Кастелье для вычисления кривой Безье:
![]() |
( 5.22) |
где 
По формуле (5.22), начиная от значений
получаем последовательно значения
На последнем шаге вычисляем
Это и есть алгоритм де Кастелье.
Пример 5.3.5. Алгоритм де Кастелье:
In[11]: =
DynamicModule [ {s, r, b, t, p} ,
b[t_, i_, r_] := (1 - t) b[t, i, r- 1] + tb[t, i + 1, r - 1] ;
b[t_, 0, 1] = (1-t) p[0] + tp[l]; b[t_, 1, 1] = (1-t) p[l] +tp[2];
b[t_, 2, 1] = (1-t) p[2] + tp[3] ; p[0] = {0.0, 0.5};
p[l] = {0.5, 2.5} ; p[2] = {3.0, 2.0}; p[3] = {4.0, 0.0};
Manipulate[
Module[{pit},
plt=ParametricPlot[b[t, 0, 3] , {t, 0, s} ,
PlotStyle -> {Blue, Thickness [0.01] }] [ [1] ] ;
Which [r == 1,
Graphics [{{Lighter [Gray] , Line[{p[0] ,p[l],p[2],p[3]}]},
{PointSize[0.015] , Point[{p[0] , p [1] , p [2] , p[3]}]},
{Purple, PointSize[0.015],
Point [{b[s, 0, l],b[s, 1, l],b[s, 2, 1]}]},
{Purple, Thickness[0.005], Line[{p[0], b[s, 0, 1]}],
Line[{p[l] , b[s, 1, 1]}] , Line [{p [2], b[s, 2, 1]}]}},
PlotRange -> {{-0.1, 4.1}, {-0.1, 2.6}}, ImageSize -> {300, 275}] ,
r == 2, Graphics [{{Lighter [Gray] , Line[{p[0] ,p[l],p[2],p[3]}]},
{PointSize [0.015] , Point [{p[0] ,p[l],p[2],p[3]}]},
{Lighter[Gray],
Line[{{b[s, 0, l],b[s, 1, 1]}, {b[s, 1, l],b[s, 2, 1]}}]},
{Purple, PointSize[0.015],
Point [{b[s, 0, 1] , b[s, 1, 1], b[s, 2, 1], b[s, 0, 2] , b[s, 1, 2]}]},
{Purple, Thickness[0.005],
Line[{{p[0], Ь[з, 0, 1]}, {p[l], b[з, 1, 1]}, {p[2], b[s, 2, 1]},
{b[s, 0, 1], b[s, 0, 2]}, {b[s, 1, 1], b[s, 1, 2]}}]}},
PlotRange -> {{-0.1, 4.1}, {-0.1, 2.6}}, ImageSize -> {300, 275}] ,
r == 3, Graphics [ {pit, {Lighter [Gray] , Line[{p[0] , p [1] , p[2] , p[3] } ]} ,
{PointSize [0.015] , Point [{p[0] ,p[l],p[2],p[3]}]},
{Lighter[Gray],
Line[{{b[s, 0, 1] , b[s, 1, 1]}, {b[s, 1, l],b[s, 2, 1]},
{b[s, 0, 2], b[s, 1, 2]}}]},
{Purple, PointSize[0.015],
Point[{b[s, 0, 1] , b[s, 1, 1] , b[s, 2, 1] , b[s, 0, 2] , b[s, 1, 2] ,
b[s, 0, 3]}]}, {Purple, Thickness[0.005],
Line[{{p[0], b[s, 0, 1]}, {p[l], b[s, 1, 1]}, {p[2], b[s, 2, 1]},
{b[s, 0, 1], b[s, 0, 2]}, {b[s, 1, 1], b[s, 1, 2]},
{b[s, 0, 2], b[s, 0, 3]}}]}},
PlotRange -> {{-0.1, 4.1}, {-0.1, 2.6}}, ImageSize -> {300, 275}]] ] ,
{{r, 3, "Шаг рекурсии."}, {1, 2, 3}},
{{s, 0.5, "t (параметр на кривой)"}, 0.01, 1}] ]Пример 5.3.6. Следующий пример строит последовательность кривых Безье в форме "цветка", соседние кривые имеют только одну общую крайнюю точку. Все опорные точки расположены на двух окружностях: первая имеет радиус 1, а радиус второй управляется ползунком.
In[12]: =
Manipulate[
DynamicModule[{ptlists, img, pts2},
pts2 =
Table [ If [ EvenQ[i] , 1. , r] *
{Sin [2 Pii *iMul/ iDiv] , Cos [2 Pi i * iMul / iDiv] } ,
{i,0, iLoops / 2 * LCM [iDiv, iDeg, iMul] } ] ;
ptlists = Partition [ pts2 , iDeg + 1, iDeg];
img = Graphics[{
Table[{If[bColor, Hue[2 *k/Length[ptlists]] , Black] ,
BezierCurve [ptlists [ [k] ] , SplineDegree -* iDeg] } ,
{k, Length[ptlists]}] }, ImageSize -" {375, 375}, Axes 4 True]] ,
{{bColor, True, "Расцветка кривых Безье"}, {True, False}},
{ {iDiv, 23,
"Количество равностоящих точек окружностей, в которых (возможно
не во всех) будут располагаться все опорные точки"}, 2,
40, 1, ImageSize -> Tiny, Appearance -> "Labeled"} ,
{{iDeg, 9, "Степень кривых Безье"} , 1, 11, 1, ImageSize -> Tiny,
Appearance -> "Labeled" } ,
{{iMul, 7, "Шаг, с помощью которого выбираются опорные точки"},
1, 10, 1, ImageSize->" Tiny, Appearance -> "Labeled"},
{{r, .5, "Радиус второй окружности"}, 0, 1.5, .01, ImageSize -> Tiny,
Appearance -> "Labeled" } ,
{{iLoops, 1, "Добавление опорных точек"}, 1, 4,1, ImageSize -> Tiny,
Appearance -> "Labeled" } ,
Control Placement -> Left]Операторная форма кривой Безье
Пусть даны опорные точки
и параметр
Определим оператор правого сдвига E, действующий на кривых вида
где
- гладкие функции от
по формуле

Аналогично, на кривых вида
определен оператор левого сдвига L:

Тогда на множестве кривых, для которых определен оператор
или
имеем
Другими словами,
Мы будем пользоваться также степенями операторов
и
(где
и
повторяются
раз), применяя их к тем кривым, для которых эти степени определены.
Кривую
мы будем обозначать просто 
Лемма 5.1. Кривая Безье, построенная по точкам
может быть задана в виде
![]() |
( 5.23) |
а также в виде
![]() |
( 5.24) |
В операторных обозначениях алгоритм де Кастелье имеет вид

поскольку 
В частности

что опять дает нам формулу (5.24):

Лемма 5.2. Для любого значения
соответствующая точка
на кривой Безье
делит отрезок, соединяющий точки
и
в отношении
Сама кривая
касается этого отрезка в точке 
Рассмотрим две операции на кривых Безье.




