В этой статье будут показаны примеры некоторых алгоритмов для работы с B-сплайнами, в основном по мотивам книги “The NURBS Book”. Здесь не будут рассматриваться тонкие моменты и разнообразные случаи, а лишь более-менее общий вариант задания и построения сплайнов.
Основные определения
Замечание: термины могут не совпадать с аналогичными в различных книгах как на русском, так и на английском языках.
Пусть — неубывающая последовательность рациональных чисел.
будем называть узлами, а
— узловым вектором.
-ую базисную функцию В-сплайна степени p (порядок
) будем обозначать
и определим как
![](/nurbs/image014.gif)
Невооруженным глазом видно, что базисные функции определяются рекуррентно. Для вычисления соответствующей базисной функции удобно осознать и использовать следующую треугольную таблицу
![](/nurbs/image016.gif)
Т.е. например, для того, чтобы определить
![](/nurbs/image018.gif)
![](/nurbs/image020.gif)
В-сплайном степени p называется кривая, определяемая как
![](/nurbs/image022.gif)
, где — контрольные точки,
— базисные функции степени p, определенные на непериодическом и неоднородном векторе узловых точек
1. Построение кривой
Построим кривую В-сплайнами третьей степени по контрольным точкам
![](/nurbs/image030.gif)
Точек 5, степень 3-я, т.е. узлов должно быть .
Пусть вектор узловых точек имеет вид: ,
т.е. параметр изменяет свои значения от 0 до 3.
Важные замечания: Чаще всего используются так называемые непериодические узловые векторы, т.е. типа , здесь первые и последние компоненты равны друг другу по 4 шт, отсюда можно сделать вывод, что степень базисных функций будет
, а, соответственно, контрольных точек обрабатывается
(9 узлов – 4 одинаковых значения). Конечно же, существуют и периодические узловые векторы и т.д., но о них позже и их методы обработки не отличаются совершенно от рассмотренных ниже.
Распишем функцию:
![](/nurbs/image042.gif)
Определим базисные функции для В-сплайнов в соответствии с таблицей:
![](/nurbs/image044.gif)
Первая строка
![](/nurbs/image046.gif)
Итого, первая строка из треугольной таблицы необходимых базисных функций В-сплайна:
![](/nurbs/image062.gif)
Вторая строка
По треугольной таблице для базисной функции, т.к. является комбинацией
и
, а они оба равны нулю, то и
.
Аналогично с ,
.
Сложнее с другими:
![](/nurbs/image076.gif)
Следующий
![](/nurbs/image078.gif)
И еще один
![](/nurbs/image080.gif)
Остальные уже обсудили, они равны нулю.
Итого, по второй строке:
![](/nurbs/image082.gif)
Третья строка
По треугольной таблице для базисной функции, т.к. является комбинацией
и
, а они оба равны нулю, то и
.
Аналогично с .
Вычислим остальные из третьей строки:
![](/nurbs/image093.gif)
Следующий
![](/nurbs/image095.gif)
И еще один
![](/nurbs/image097.gif)
И последний в этой строке:
![](/nurbs/image099.gif)
Итого, по строке
![](/nurbs/image101.gif)
Четвертая строка (последняя)
![](/nurbs/image103.gif)
Далее
![](/nurbs/image105.gif)
Итого, искомые базисные функции для B-сплайнов имеют вид:
![](/nurbs/image113.gif)
Вспомним искомое:
![](/nurbs/image115.gif)
Составим параметрическое уравнение кривой:
1) При
![](/nurbs/image119.gif)
2) При
![](/nurbs/image123.gif)
Подставим координаты точек:
![](/nurbs/image125.gif)
1) При
![](/nurbs/image127.gif)
2) При
![](/nurbs/image129.gif)
Итого
1) При
![](/nurbs/image131.gif)
2) При
![](/nurbs/image121.gif)
![](/nurbs/image133.gif)
Построим ограничивающий (контрольный) многоугольник (соединив контрольные точки) и искомую кривую. Разным цветом указаны сплайны при
![](/nurbs/image117.gif)
![](/nurbs/image121.gif)
![](/nurbs/image135.gif)