Кривые и поверхности в компьютерной геометрии, 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. Для любого значения соответствующая точка на кривой Безье делит отрезок, соединяющий точки и в отношении Сама кривая касается этого отрезка в точке
Рассмотрим две операции на кривых Безье.