Параметрические сплайны на плоскости

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Рассмотрим задачу: на плоскости дан набор точек и по ним надо, при помощи параметрических сплайнов, построить кривую ( замкнутую или незамкнутую ).
Обычно в таких случаях применяют кубические сплайны, я же рекомендую квадратичные, как более простые.
Итак, нам надо построить многочлен P(t) = A · t2 + B · t + C. Здесь и далее будем обозначать вектора большими буквами, а скаляры - малыми. Параметр t меняется от 0 до 1.
Для построения отдельного сплайна нам понадобятся крайние точки P0 и P1 и направления нормалей к кривой в этих точках: N0 и N1. Длина N0 и N1, как увидим позже, может быть произвольной. Главное - ненулевой.
Из условий непрерывности находим:

С = P0
A + B = P1 - P0

А из условий гладкости следует ( касательная должна быть перпендикулярна нормали ):

N0 · B = 0
N1 · ( 2·A + B ) = 0

Подставляем выражение для A из первой системы во вторую получим:

N0 · B = 0
N1 · B = 2 · N1 · ( P1 - P0 )

Это СЛАУ второго порядка, решив которую, найдём неизвестный вектор B, а зная его, определим вектор A. Система имеет решение только в случае, если нормали не параллельны ( выражение N0x · N1y - N0y · N1x не равно нулю ). Иначе считаем вектор A равным нулю, а B = P1 - P0, то есть сплайн вырождается в отрезок прямой. Решать систему даже второго порядка, я рекомендую методом Гаусса с выбором ведущего элемента, а не методом Крамера. В случае почти вырожденной матрицы разница может быть заметной.
Применим эти сплайны к аппроксимации единичной окружности. Получим:

Для 10 равномерных точек максимальное отклонение от окружности получается равным 1.26·10-3, а для 20 точек = 7.67·10-5
Для 10 равномерных точек максимальное отклонение от окружности получается равным 1.26·10-3, а для 20 точек = 7.67·10-5

В тех случаях, когда направление нормалей неизвестно, я поступаю следующим образом. Для текущей точки проводим отрезок между предыдущей точкой и следующей. Затем строим перпендикуляр к этому отрезку:

Можно придумать что-то другое, но так получается совсем просто:
Ni,x = Pi+1,y - Pi-1,y
Ni,y = Pi-1,x - Pi+1,x
Добавлю, что в одну сторону смотрит нормаль или в противоположную - разницы нет.
Ниже показана кривая построенная на случайном наборе точек и с нормалями определёнными указанным методом:

Источник: https://habr.com/ru/articles/860838/


Интересные статьи

Интересные статьи

Приветствую Хабравчане!Продолжаем мучить разрабатывать движок для моей любимой игры Arcanum. В данном уроке расскажу, как движок управляет памятью и какие паттерны и подходы использует. Напишем свою м...
Создадим прототип SPA в Bitrix без использования популярных JS фреймворков и библиотек, все будет сделано средставами Bitrix.И самое главное без потери серверного рендеринга и SEO страниц.ПогналиВсего...
В данной статье будет показана нестандартная реализация компонентов Vue + Bitrix, которую вряд ли кто то видел и использовал.Без NPM, без сборщиков и без костылей. Все "нативными" средствами
Предыдущая и первая моя статья здесь была про наш опыт создания производственной компании в сфере вакуумной электроники на базе фактически брошенных советских технических и технологических заделов. По...
Устраивать конкурсы в инстаграме сейчас модно. И удобно. Инстаграм предоставляет достаточно обширный API, который позволяет делать практически всё, что может сделать обычный пользователь ручками.