Параметрические кривые

Sovka Ivanov
5 min readNov 13, 2018

--

для заголовочка

Что это блять??

Это просто. Прикинь, есть переменная t, от неё зависят другие двe переменных, например таким макаром:

x = 3t

y = 2t + 1

Для начала можно прогнать t от -дохуя до +дохуя, и попутно перекладывать полученные x и y на декартовы оси, получится вот такое множество точек с координатами (3t, 2t + 1):

ебать, да это ж линия!

Переменная t называется параметром, если чо. А полученная линия кривой. Но чот не кривая она ни хрена, давай исправлю.
Пускай зависимости будут тригонометрическими. И t достаточно будет в промежутке [0, 2Pi], ибо 2Pi — это 360 градусов.

АЕшный проект в конце статьи. Косинус в икс, синус в игрек, хуль тут непонятного.

x = r * sin(t)

y = r * cos(t)

Если написать просто синус и косинус, то будет окружность с радиусом 1. А хочется с каким-то другим, поэтому весь результат я домножил на любое число. Просто обозначил его переменной r, чтоб мозг не ебать. И кстати никто не запрещает сделать радиус вторым параметром, менять его значение вместе с t и получать спирали и эллипсы, сам поэкспериментируй.

А ещё это можно записать как векторную функцию:

f(t) = r *[cos(t), sin(t)], t ∈ [0, 2Pi]

Вектор я взял в квадратные скобки, чтобы легче читалось, вообще так не делается. Результатом являются координаты точки на кривой, косинус идёт в координату x, а синус в y. Теперь надо это записать в форме чуть пострашнее, потому что далее понадобится именно пострашнее. Но сначала я уберу вот это злоебучее t ∈ [0, 2Pi] в конце. Пускай теперь по умолчанию всегда будет t ∈ [0, 1], и прям в формуле буду интерполировать его в нужный промежуток. Чтобы сделать t ∈ [0, 2Pi], я просто домножу его на 2Pi. Далее надо разложить (cos(t), sin(t)) на составляющие — вектор x и вектор y, это (1,0) и (0,1).

f(t) = ( [1,0] * r * cos(t * 2Pi) ) + ( [0,1] * r * sin(t * 2Pi) )

Жирные скобки не играют роли, они там для лёгкости чтения. Если чуешь, что не догнал чо произошло, то попробуй вывести эту формулу сам, абзац выше считай за инструкцию. Если это будет сложно, то замени cos(t * 2Pi) буквой a и sin(t * 2Pi) буквой b, должно полегчать. Очень важно и круто въехать в эту дичь.

Безье и его пацанский алгоритм

Ща попробую соединить две точки P1 и P2 с помощью векторной функции. Точка и вектор — одно и то же, набор координат. Через параметр t это можно так выразить: когда он равен нулю, точка должна быть P1, когда равен единице — P2, когда половинке — точка ровно посередине между P1 и P2. В общем параметр надо интерполировать в промежуток [P1, P2]. Ничо сложного, смотри. Общая формула интерполяции из промежутка [0, 1] в промежуток [a, b]:

t * (b - a) + a

Немного рассуждения: [0, 1] * (b - a) = [0, b - a]. Прибавить к этому a и [0 + a, b - a + a] = [a, b]. Теперь a и b заменю на P1 и P2, раскрою скобки и закрою их по-другому:

t * (P2 - P1) + P1 =

= t * P2 - t * P1+ P1 =

= (1 - t) * P1 + t * P2

И вот так это говно работает

Простецкая функция соединения двух точек, можно и усложнить.

Добавлю третью точку P3. Теперь есть две пары точек, две одновременных интерполяции. При каждом конкретном значении t есть две конкретных точки. И почему бы между этими двумя точками не замутить ещё одну интерполяцию? Вот товарищи Безье и де Кастельжо задались этим же вопросом и подумали что-то в стиле “Я же ебанутый, я могу!”

Так, надо б с формулой разобраться.

P12: (1 - t) * P1 + t * P2;

P23: (1 - t) * P2 + t * P3;

f(t) = (1 - t) * P12 + t * P23 =

= (1 - t) * ((1 - t) * P1 + t * P2) + t * ((1 - t) * P2 + t * P3) =

= (1 - t) * (1 - t) * P1 + (1 - t) * t * P2 + t * (1 - t) * P2 + t * t * P3 =

= (1 - t)² * P1 + 2 * t * (1 — t) * P2 + t² * P3

Я тут по сути ни хрена не делал, просто скобки раскрывал, ты точно с этим справишься. Так вот, а чо если добавить четвёртую точку, может даже пятую и шестую и хуйпоймическую? Ради любопытства и качки мозгов рекомендую сделать это лично ручкой по бумаге. Я и много других пацанов уже сделали, вот что получается, когда есть n точек:

И это можно записать как сумму для краткости:

пиздец.

Хорошо, что нам с тобой это всё нахой не надо! Нам хватит только одного случая с четырьмя опорными точками, вот он:

И внезапный нежданчик, я просто уберу линию P2-P3:

на чо похоже?

Вот такие красавцы Безье и де Кастельжо. Они догнали до этого алгоритма в начале 60-х почти одновременно и независимо друг от друга. Два разных человека по разным соображениям пришли к одной и той же формуле, разве это не охуенно?

Ну вот и всё ебать.

Проект АЕ
Статья на хабре там может быть понятнее. А может нет, я не знаю.

Аффтаръ жжот.

--

--

Sovka Ivanov

Папкин математик, мамкин программист, дизайнер папиной подруги.