Украина |
Кривые и поверхности в компьютерной геометрии, I
Алгоритм де Кастелье
Алгоритм де Кастелье позволяет построить кривую Безье с помощью рекуррентного соотношения
![B_i^n=tB_{i-1}^{n-1}+(1-t)B_i^{n-1}.](/sites/default/files/tex_cache/e3717a668ce5de84c70f00f1afafedde.png)
Пусть даны опорные точки Обозначим через
кривую Безье, построенную по точкам
Тогда искомая кривая Безье - это кривая Имеем
Выведем рекуррентные формулы для определения
исходя из начальных данных:
Имеем
![r(t)=p_0(1-t)^n+p_nt^n+\sum_{i=1}^{n-1}(tB_{i-1}^{n-1}+(1-t)B_i^{n-1}p_i=\\
=(1-t)(p_0(1-t)^{n-1}+\sum_{i=0}^{n-1}B_i^{n-1}p_i)+t(p_nt^{n-1}+\sum_{i=0}^{n-1}B_{i-1}^{n-1}p_i)=\\
=(1-t) \sum_{i=0}^{n-1}B_i^{n-1}p_i+t \sum_{i=0}^{n-1}B_i^{n-1}p_{i+1}=(1-t)r_0(t; n-1)+tr_1(t; n-1).](/sites/default/files/tex_cache/1fa50722c8702862daf9dc446c73c704.png)
Отсюда получаем следующую рекуррентную формулу де Кастелье для вычисления кривой Безье:
![]() |
( 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, действующий на кривых вида
где
- гладкие функции от
по формуле
![Er(t)=\sum_{i=0}^{n-1}f_i(t)p_{i+1}](/sites/default/files/tex_cache/8287e5bcf4b9a60cc1e54d28dd777abb.png)
Аналогично, на кривых вида определен оператор левого сдвига L:
![Lr(t)=\sum_{i=1}^{n}g_i(t)p_{i-1}](/sites/default/files/tex_cache/6a5a24fe7b8ce707ddeac05e9c44495b.png)
Тогда на множестве кривых, для которых определен оператор или
имеем
Другими словами,
Мы будем пользоваться также степенями операторов
и
(где
и
повторяются
раз), применяя их к тем кривым, для которых эти степени определены.
Кривую мы будем обозначать просто
Лемма 5.1. Кривая Безье, построенная по точкам может быть задана в виде
![]() |
( 5.23) |
а также в виде
![]() |
( 5.24) |
В операторных обозначениях алгоритм де Кастелье имеет вид
![r_i(t; k) = ( (1 -t)+ tE ) r_i(t; k-1), (i + k \le n),](/sites/default/files/tex_cache/da0ab467fee725a19846252b9a9009f7.png)
поскольку
В частности
![r_0(t;n)= ( (1-(t)+tE ) r_0(t;n-1),\\
r_0(t; n - 1) = (1 -t) + tE ) r_0(t; n - 2),\\
............................................................\\
r_0(t;1) = p_0,](/sites/default/files/tex_cache/b2d0fafb588efaa95bb6e15f00f4be84.png)
что опять дает нам формулу (5.24):
![r(t) = r_0(t; n) = ( (1 -t)+ tE )^n p_0.](/sites/default/files/tex_cache/145577266695a751ad69b150d585f425.png)
Лемма 5.2. Для любого значения соответствующая точка
на кривой Безье
делит отрезок, соединяющий точки
и
в отношении
Сама кривая
касается этого отрезка в точке
Рассмотрим две операции на кривых Безье.