Построение де Кастельжо · Веса Бернштейна

Кривая Безье

На каждой стороне многоугольника отметьте одну и ту же долю t её длины, затем повторяйте на сторонах нового, меньшего многоугольника, пока не останется одна точка. Когда t меняется от 0 до 1, эта точка рисует кривую Безье.

Кривые Безье в этой визуализации

Кривая Безье степени n задаётся n + 1 контрольными точками P0,…,PnP_0, \dots, P_n: две точки дают отрезок, три — квадратичную кривую, четыре — кубическую, знакомую по графическим редакторам. Её точка B(t)B(t), красная на рисунке, получается, если раз за разом брать долю t вдоль каждой стороны контрольного многоугольника. Здесь можно двигать точки, проводить t от 0 до 1 и смотреть, как отрезки построения оставляют нити, обрисовывающие кривую.

Построение показывает многоугольники всех уровней при текущем t; на каждом уровне на одну сторону меньше, чем на предыдущем. Провести меняет t от 0 до 1, оставляя нити построения через равные шаги t и окрашивая их по t. Сама кривая — тонкая линия.

В формулах построение превращается в лестницу взвешенных средних — алгоритм де Кастельжо:

Pi0=Pi,Pik(t)=(1−t) Pik−1(t)+t Pi+1k−1(t),B(t)=P0n(t).P_i^0 = P_i, \qquad P_i^k(t) = (1 - t)\,P_i^{k-1}(t) + t\,P_{i+1}^{k-1}(t), \qquad B(t) = P_0^n(t) .

Если раскрыть последовательные уровни, коэффициент при каждой контрольной точке станет суммой произведений из n множителей, каждый из которых равен 1 − t или t. Для PiP_i каждое произведение содержит ровно i множителей t, а всего таких произведений (ni)\binom{n}{i}, поэтому

B(t)=∑i=0nbi,n(t) Pi,bi,n(t)=(ni)ti(1−t)n−i.B(t) = \sum_{i=0}^{n} b_{i,n}(t)\, P_i, \qquad b_{i,n}(t) = \binom{n}{i} t^{i} (1 - t)^{n-i} .

Эти веса — полиномы Бернштейна, показанные на маленьком графике. При 0≤t≤10 \le t \le 1 они неотрицательны и в сумме дают 1, поэтому B(t)B(t) — взвешенное среднее точек, а кривая не выходит из их выпуклой оболочки. Сдвиг одной точки PiP_i на вектор Δ сдвигает каждую точку кривой на bi,n(t) Δb_{i,n}(t)\,\Delta, сильнее всего вблизи t=i/nt = i/n. Эта часть кривой не всегда ближе всего к контрольной точке.

При t = 0 каждый уровень начинается в P0P_0, поэтому B(0)=P0B(0) = P_0; аналогично, B(1)=PnB(1) = P_n. Кривая проходит через оба конца и обычно не проходит через остальные точки. Последний уровень построения — один отрезок. Если он не стягивается в точку, то лежит на касательной к кривой:

B′(t)=n(P1n−1(t)−P0n−1(t)),B′(0)=n (P1−P0),B′(1)=n (Pn−Pn−1).B'(t) = n \bigl(P_1^{n-1}(t) - P_0^{n-1}(t)\bigr), \qquad B'(0) = n\,(P_1 - P_0), \qquad B'(1) = n\,(P_n - P_{n-1}) .

Значит, кривая выходит из P0P_0 в направлении P1P_1 и приходит в PnP_n со стороны Pn−1P_{n-1}, если только две точки у соответствующего конца не совпадают. Поэтому графический редактор показывает средние точки кубической кривой как управляющие ручки, выступающие из её концов.

Каждая нить последнего уровня, не стянувшаяся в точку, касается кривой в лежащей на ней точке построения. Нить уровнем ниже так же касается кривой, заданной меньшим числом соседних точек. Поэтому каждое семейство нитей обрисовывает свою кривую, а внутри многоугольника видны кривые меньшей степени. Обрисовать — не значит обернуть с одной стороны: в точке перегиба кривая пересекает собственную касательную, и нити лежат по обе стороны. Если три контрольные точки не лежат на одной прямой, нити квадратичной кривой соответствуют нитяной графике между двумя прямыми рядами гвоздей, а обрисованная ими кривая — парабола.

Построение при t = s также разрезает кривую на две части. Первые точки его уровней — контрольные точки участка от 0 до s, а последние — участка от s до 1. Разбить показывает эти две группы. При многократном делении пополам многоугольники участков приближаются к кривой. Повысить степень действует в обратном направлении: на одну контрольную точку больше, та же кривая и более близкий к ней многоугольник. А точка, добавленная нажатием на рисунок, меняет кривую.

Поль де Кастельжо разработал это построение в Citroën в 1959 году. Пьер Безье в Renault независимо получил те же кривые и опубликовал их в 1960-х годах.

На что обратить внимание

  • Равные шаги t не обязательно соответствуют равным расстояниям вдоль кривой.
  • Самая насыщенная область — не сама кривая. Это место, где перекрывается больше всего нитей, и оно может находиться немного в стороне от кривой.

Связанные темы