Как-то после обеда прочитал статью на gamedev.ru, а потом в комментариях к статье нашел другую и неожиданно обрел знание: как работают кривая Безье и в чем собственно суть. И чтобы не забыть, сделал эту запись в блоге.
Вообще я сразу теряюсь, когда в статье наталкиваюсь на математические формулы и сразу пытаюсь их пролистать, а тут решил вникнуть и внезапно осенило!
Линейная кривая
Самая простая кривая Безье называется «линейная кривая», хотя она не кривая, а очень даже прямая. Это банальная линейная интерполяция от точки до . Формула этой кривой вот такая:
Параметр у нас живет в пределах от нуля до единицы, заместо подставляем или и получаем искомое значение.
Программистами используется та же самая формула, только в профиль (убирается лишнее умножение):
Квадратичная кривая
Следующая по сложности идет «квадратичная кривая». Она строится по трем точкам , и . Оказывается, она представляет собой линейную интерполяцию двух простых кривых Безье по точками P0, P1 и P1, P2 соответственно. На мой взгляд звучит ужасно сложно, в голове рисуются страшные формулы, но на деле выходит довольно просто.
Формула первой кривой:
Формула второй кривой:
Линейная интерполяция:
После замены A и B получается такой монстр:
Раскрываем, сокращаем, упрощаем:
Касательная к квадратичной кривой
Если записать по науке, то формула выше такая:
Чтобы найти касательную к кривой Безье в любой точке t, надо вычислить производную этой функции (подсмотрено в википедии):
Для чего может пригодится касательная:
- поворачиваем касательную на 90 градусов, делим на длину и получаем нормаль к кривой Безье в точке t
- берем некий шаг , вычисляем касательную для каждой t от нуля до единицы с шагом , суммируем длину этих касательных, умноженную на , получаем общую длину кривой Безье, точность которой зависит от
Если я ничего не напутал, то формула для вычисления длины выглядит вот так:
Затем можно рассмотреть «кубическую кривую», но это уж как-нибудь сами. Вот собственно и все, чем хотел поделиться… Не судите строго.