Как-то после обеда прочитал статью на gamedev.ru, а потом в комментариях к статье нашел другую и неожиданно обрел знание: как работают кривая Безье и в чем собственно суть. И чтобы не забыть, сделал эту запись в блоге.
Вообще я сразу теряюсь, когда в статье наталкиваюсь на математические формулы и сразу пытаюсь их пролистать, а тут решил вникнуть и внезапно осенило!
Линейная кривая
Самая простая кривая Безье называется «линейная кривая», хотя она не кривая, а очень даже прямая. Это банальная линейная интерполяция от точки
до
. Формула этой кривой вот такая: ![Rendered by QuickLaTeX.com P=(1-t)*P_0+t*P_1](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-69a24b855ad53308a11afa6fbc1f614c_l3.png)
Параметр
у нас живет в пределах от нуля до единицы, заместо
подставляем
или
и получаем искомое значение.
Программистами используется та же самая формула, только в профиль (убирается лишнее умножение): ![Rendered by QuickLaTeX.com P=P_0+t*(P_1-P_0)](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-8518070931f7167e5e6087f1bcc4bb04_l3.png)
Квадратичная кривая
Следующая по сложности идет «квадратичная кривая». Она строится по трем точкам
,
и
. Оказывается, она представляет собой линейную интерполяцию двух простых кривых Безье по точками P0, P1 и P1, P2 соответственно. На мой взгляд звучит ужасно сложно, в голове рисуются страшные формулы, но на деле выходит довольно просто.
Формула первой кривой: ![Rendered by QuickLaTeX.com A=(1-t)*P_0+t*P_1](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-de64896ff4fbba1b5597853a743d5436_l3.png)
Формула второй кривой: ![Rendered by QuickLaTeX.com B=(1-t)*P_1+t*P_2](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-f99fe4aa464c4e90eef04e21d1dd0cb0_l3.png)
Линейная интерполяция: ![Rendered by QuickLaTeX.com P=(1-t)*A+t*B](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-e0167bfb6afd890e87953882f549f7b8_l3.png)
После замены A и B получается такой монстр: ![Rendered by QuickLaTeX.com (1-t)*((1-t)*P_0+t*P_1)+t*((1-t)*P_1+t*P_2)](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-407cc4dacbb571e5aca82ecb750b7116_l3.png)
Раскрываем, сокращаем, упрощаем: ![Rendered by QuickLaTeX.com P=P_0*(1-t)^2+2*t*P_1*(1-t)+t^2*P_2](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-acd903040142a669e32971609e2ecc32_l3.png)
Касательная к квадратичной кривой
Если записать по науке, то формула выше такая: ![Rendered by QuickLaTeX.com f(t)=P_0*(1-t)^2+2*t*P_1*(1-t)+t^2*P_2](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-e11be04e7d36f4ba746d36588e7a34ee_l3.png)
Чтобы найти касательную к кривой Безье в любой точке t, надо вычислить производную этой функции (подсмотрено в википедии): ![Rendered by QuickLaTeX.com f'(t)=2*(1-t)*(P_1-P_0)+2*t*(P_2-P_1)](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-1689ee302b80fb97926f52e3504f9894_l3.png)
Для чего может пригодится касательная:
- поворачиваем касательную на 90 градусов, делим на длину и получаем нормаль к кривой Безье в точке t
- берем некий шаг
, вычисляем касательную для каждой t от нуля до единицы с шагом
, суммируем длину этих касательных, умноженную на
, получаем общую длину кривой Безье, точность которой зависит от ![Rendered by QuickLaTeX.com \Delta t](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-64b0fd23f2eee7f1b41a6e86040da96b_l3.png)
Если я ничего не напутал, то формула для вычисления длины выглядит вот так:
![Rendered by QuickLaTeX.com \sum\limits_{t=0}^1=|f'(t)|*\Delta t](https://blog2k.ru/wp-content/ql-cache/quicklatex.com-d3c5f868a46f7515e898a9fd48930884_l3.png)
Затем можно рассмотреть «кубическую кривую», но это уж как-нибудь сами. Вот собственно и все, чем хотел поделиться… Не судите строго.