Введение

Кривая, используемая в компьютерной графике и смежных областях. Кривая Безье (/'//b//E//z//.//i//.//ei/ BEHzeeay) — параметрическая кривая, применяемая в компьютерной графике и связанных с ней областях. Набор дискретных "контрольных точек" определяет гладкую, непрерывную кривую посредством формулы. Как правило, кривая предназначена для аппроксимации формы реального объекта, который в противном случае не имеет математического представления, или чье представление неизвестно либо слишком сложно. Кривая Безье названа в честь французского инженера Пьера Безье (1910–1999), который использовал её в 1960-х годах для разработки кривых для кузова автомобилей Renault. Другие области применения включают в себя разработку компьютерных шрифтов и анимацию. Она используется в таких анимационных программах, как Adobe Flash, Adobe After Effects, Microsoft Expression Blend, Blender, Autodesk Maya и Autodesk 3ds Max, в дизайне пользовательских интерфейсов, а также для сглаживания траектории курсора в интерфейсах, управляемых движением глаз. Например, кривая Безье может быть использована для задания скорости изменения положения объекта, такого как иконка, перемещающаяся из точки А в точку В, вместо простого перемещения на фиксированное количество пикселей за шаг. Когда аниматоры или дизайнеры интерфейсов говорят о "физике" или "ощущениях" от операции, они могут иметь в виду конкретную кривую Безье, используемую для управления скоростью изменения положения в данном движении. Это также применимо к робототехнике, где движение, например, манипулятора сварки, должно быть плавным, чтобы избежать ненужного износа.

Изобретение

Математическая основа кривых Безье – полиномы Бернштейна – была заложена в 1912 году, но полиномы не нашли применения в графике еще около 50 лет, пока в 1959 году математик Поль де Кастельжо разработал алгоритм де Кастельжо, численно устойчивый метод вычисления значений кривых, и впервые применил их в системах автоматизированного проектирования на французском автомобильном заводе Citroën. Метод де Кастельжо был запатентован во Франции, но не был опубликован до 1980-х годов, в то время как полиномы Безье получили широкую известность в 1960-х годах благодаря французскому инженеру Пьеру Безье, который открыл их независимо и использовал для разработки кузовов автомобилей на Renault.

Специальные случаи

Кривая Безье определяется набором управляющих точек P0 через Pn, где n называется порядком кривой (n = 1 для линейной, 2 для квадратичной, 3 для кубической и т. д.). Первая и последняя управляющие точки всегда являются конечными точками кривой; однако промежуточные управляющие точки, как правило, не лежат на кривой. Суммирование в следующих разделах следует понимать как аффинные комбинации – то есть, коэффициенты в сумме равны 1.

Линейные кривые Безиера

При заданных различных точках P0 и P1, линейная кривая Безье – это просто отрезок прямой между этими двумя точками. Кривая задается выражением и эквивалентна линейной интерполяции. Величина представляет собой вектор смещения от начальной точки к конечной точке.

Общее определение

Кривые Безье могут быть определены для любой степени n.

Рекурсивное определение

Рекурсивное определение кривой Безиера степени n выражает её как линейную комбинацию точек (линейную интерполяцию) пары соответствующих точек в двух кривых Безиера степени n − 1. Пусть обозначает кривую Безиера, определяемую любым набором точек P0, P1, …, Pk. Для начала, эта рекурсия иллюстрируется в анимациях ниже.

Свойства

Кривая начинается и заканчивается в ; это так называемое свойство интерполяции конечных точек. Кривая является прямой тогда и только тогда, когда все управляющие точки коллинеарны. Начало и конец кривой касательны к первому и последнему отрезкам многоугольника Безье соответственно. Кривую можно разделить в любой точке на две подкривые или на произвольное количество подкривых, каждая из которых также является кривой Безье. Некоторые кривые, кажущиеся простыми, такие как окружность, не могут быть точно описаны кривой Безье или кусочно-Безье кривой; однако четырехчастная кубическая кривая Безье может аппроксимировать окружность (см. составную кривую Безье), с максимальной радиальной ошибкой менее одной части на тысячу, когда каждая внутренняя управляющая точка (или точка, не связанная с кривой) находится на расстоянии горизонтально или вертикально от внешней управляющей точки на единичной окружности. В более общем случае, кубическая кривая Безье из n частей может аппроксимировать окружность, когда каждая внутренняя управляющая точка находится на расстоянии от внешней управляющей точки на единичной окружности, где (т.е. ), и каждая квадратичная кривая Безье также является кубической кривой Безье, и в более общем случае, каждая кривая Безье степени n также является кривой степени m для любого m > n. В частности, кривая степени n с управляющими точками эквивалентна (включая параметризацию) кривой степени n + 1 с управляющими точками , где , и , определяют , что кривые Безье обладают свойством убывания вариации. Это означает в интуитивном смысле, что кривая Безье не "извивается" больше, чем многоугольник ее управляющих точек, и может фактически "извиваться" меньше. В кривых Безье степени n отсутствует локальное управление – это означает, что любое изменение управляющей точки требует пересчета и, следовательно, влияет на вид всей кривой, "хотя чем дальше от измененной управляющей точки, тем меньше изменение кривой". Кривая Безье порядка выше двух может самопересекаться или иметь точку перегиба при определенных выборах управляющих точек.

Кривая второго порядка - это параболический сегмент

Квадратная кривая Безие также является сегментом параболы. Поскольку парабола является коническим сечением, некоторые источники называют квадратные кривые Безие "коническими дугами". Касательные к параболе в конечных точках кривой (A и B) пересекаются в контрольной точке (C). Если D – середина отрезка AB, то касательная к кривой, перпендикулярная CD (пунктирная голубая линия), определяет её вершину (V). Ось симметрии (пунктирно-точечная голубая линия) проходит через V и перпендикулярна касательной. E – точка на кривой, касательная в которой образует угол 45° с CD (пунктирная зеленая линия). Если G – точка пересечения этой касательной и оси симметрии, то прямая, проходящая через G и перпендикулярная CD, является директрисой (сплошная зеленая линия). Фокус (F) находится на пересечении оси симметрии и прямой, проходящей через E и перпендикулярной CD (пунктирная желтая линия). Латус прямой – это отрезок прямой внутри кривой (сплошная желтая линия).

Оффсеты (или протяжения) кривых Безиера

Кривая, расположенная на фиксированном расстоянии от заданной кривой Безие, называемая в математике смещением или параллельной кривой (лежащей "параллельно" исходной кривой, как расстояние между рельсами железнодорожного пути), не может быть точно представлена кривой Безие (за исключением некоторых тривиальных случаев). В общем случае, двусторонняя смещенная кривая кубической кривой Безие является алгебраической кривой 10-го порядка, а более общо, для кривой Безие степени n, двусторонняя смещенная кривая является алгебраической кривой степени 4n - 2. Однако существуют эвристические методы, которые обычно обеспечивают достаточно точное приближение для практических целей. В области векторной графики, отрисовка двух симметрично отстоящих смещенных кривых называется обводкой (кривой Безие или, в общем случае, пути, состоящего из нескольких сегментов Безие).

Повторное повышение градусов

Концепция повышения степени может быть повторена для управляющего многоугольника R, чтобы получить последовательность управляющих многоугольников R, R1, R2 и так далее. После r повышений степени, многоугольник Rr имеет вершины P0,r, P1,r, P2,r, ..., Pn+r,r, определяемые рядом алгоритмов аппроксимации, которые были предложены и используются на практике.

Компьютерная графика

Кривые Безие широко используются в компьютерной графике для моделирования гладких кривых. Поскольку кривая полностью содержится в выпуклой оболочке своих контрольных точек, эти точки могут быть графически отображены и использованы для интуитивного управления кривой. Аффинные преобразования, такие как сдвиг и вращение, могут быть применены к кривой путем применения соответствующих преобразований к контрольным точкам кривой. Наиболее распространены квадратичные и кубические кривые Безие. Кривые более высокой степени требуют больших вычислительных затрат при оценке. Когда требуются более сложные формы, кривые Безие низкого порядка объединяются, образуя составную кривую Безие. Составная кривая Безие обычно называется "путем" в векторных графических языках (например, PostScript), стандартах векторной графики (например, SVG) и программах векторной графики (например, Artline, Timeworks Publisher, Adobe Illustrator, CorelDraw, Inkscape и Allegro). Для соединения кривых Безие в составную кривую без изломов достаточно обеспечить G1-непрерывность, которая гарантирует, что контрольная точка, в которой встречаются две составляющие кривые Безие, лежит на прямой, определяемой двумя контрольными точками с обеих сторон. Самый простой метод сканирования (растеризации) кривой Безие заключается в вычислении ее значений в большом количестве близко расположенных точек и последующей растеризации аппроксимирующей последовательности линейных сегментов. Однако это не гарантирует достаточную гладкость растрового изображения, поскольку точки могут быть расположены слишком далеко друг от друга. С другой стороны, в областях, где кривая близка к прямой, может быть сгенерировано слишком много точек. Распространенным адаптивным методом является рекурсивное подразделение, при котором проверяются контрольные точки кривой, чтобы определить, насколько хорошо она аппроксимируется прямой в пределах заданной погрешности. Если аппроксимация недостаточна, кривая параметрически делится на два сегмента: 0 ≤ t ≤ 0.5 и 0.5 ≤ t ≤ 1, и та же процедура рекурсивно применяется к каждой половине. Существуют также методы конечных разностей, но необходимо проявлять особую осторожность при анализе распространения ошибок. Алгоритм растеризации, используемый в Metafont, основан на дискретизации кривой, так что она аппроксимируется последовательностью "ходов ладьи", которые являются чисто вертикальными или чисто горизонтальными и выровнены по границам пикселей. Для этого плоскость сначала разделяется на восемь секторов по 45° (координатными осями и двумя линиями), а затем кривая декомпозируется на более мелкие сегменты, так что направление сегмента кривой остается в пределах одного сектора; поскольку скорость кривой является полиномом второй степени, значения, при которых она параллельна одной из этих линий, можно найти, решив квадратные уравнения. В каждом сегменте преобладает либо горизонтальное, либо вертикальное движение, и общее количество шагов в любом направлении можно определить по координатам конечных точек; например, в секторе 0–45° преобладает горизонтальное движение вправо, поэтому остается только определить, между какими шагами вправо кривая должна сделать шаг вверх. Существует также модифицированная форма алгоритма рисования линий Брезенхема, разработанная Зинглом, которая выполняет растеризацию, разделяя кривую на рациональные части и вычисляя ошибку в каждой точке пикселя таким образом, чтобы она двигалась под углом 45° или прямо, в зависимости от накопленной ошибки при итерации по кривой. Это сводит вычисление следующего шага к серии целочисленных сложений и вычитаний.

Анимация

В анимационных приложениях, таких как Adobe Flash и Synfig, кривые Безье используются для определения, например, движения. Пользователи задают желаемый путь с помощью кривых Безье, а приложение создает необходимые кадры для перемещения объекта по этому пути. В 3D-анимации кривые Безье часто используются для определения 3D-траекторий, а также 2D-кривых для интерполяции ключевых кадров. В настоящее время кривые Безье очень часто применяются для управления плавностью анимации в CSS, JavaScript, JavaFx и Flutter SDK. Фонтовые движки, такие как FreeType, отрисовывают кривые (и линии) шрифта на пиксельной поверхности, используя процесс, известный как растрирование шрифта. Как правило, шрифтовые и векторные графические движки отрисовывают кривые Безье, рекурсивно разбивая их до тех пор, пока кривая не станет достаточно плоской для отрисовки в виде серии линейных или круговых сегментов. Конкретный алгоритм разбиения зависит от реализации, но необходимо соблюдать критерии плоскостности для достижения требуемой точности и избежания немонотонных локальных изменений кривизны. Функция "сглаживание кривых" в графиках Microsoft Excel также использует этот алгоритм. Поскольку дуги окружностей и эллипсов не могут быть точно представлены кривыми Безье, они сначала аппроксимируются кривыми Безье, которые, в свою очередь, аппроксимируются дугами окружностей. Это неэффективно, так как существуют также аппроксимации всех кривых Безье с использованием дуг окружностей или эллипсов, которые могут быть отрисованы инкрементно с произвольной точностью. Другой подход, используемый современными аппаратными графическими адаптерами с аппаратным ускорением геометрии, позволяет точно преобразовывать все кривые (и поверхности) Безье и конические кривые в NURBS, которые могут быть отрисованы инкрементно без предварительного рекурсивного разбиения кривой для достижения необходимой плоскостности. Этот подход также сохраняет определение кривой при любых линейных или перспективных 2D и 3D преобразованиях и проекциях.