Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Curves.doc
Скачиваний:
51
Добавлен:
01.09.2019
Размер:
4.51 Mб
Скачать

Базисные Функции b-spline: Определение

Базисные функции Безье использовались в качестве весов. Базисные функции B-spline будут использоваться так же; тем не менее, они гораздо более сложны. Есть два интересных свойства, которые не являются частью базисных функций Безье, а именно: (1) интервал разделяется узлами, и (2) базисные функции не являются ненулевыми на всем интервале. Фактически, каждая базисная функция B-spline является ненулевой на нескольких смежных под-интервалах и, в итоге, базисные функции B-spline являются вполне "локальными".

Пусть U - это последовательность m + 1 неубывающих действительных чисел, u0 <= u2 <= u3 <= ... <= um. Числа ui называются узлами, последовательность U - узловым вектором, а полуоткрытый интервал [ui, ui+1) - i-м узловым диапазоном. Заметьте, так как некоторые ui могут быть равны, то соответствующих узловых диапазонов может не существовать. Если узел ui появляется k раз (i.e., ui = ui+1 = ... = ui+k-1), где k > 1, ui называется множественным узлом kмножественности, пишется ui(k). Иначе, если ui появляется лишь однажды, это - простой узел. Если узлы равномерно разделены (т.e. ui+1 - ui постоянно для 0 <= i <= m - 1), узловой вектор или последовательность узлов называется однородной(-ым); иначе, неоднородной.

Узлы можно представить как точки, делящие интервал [u0, um] на узловые интервалы. Все базисные функции B-spline должны иметь область определения на [u0, um]. Таким образом, используем u0 = 0 и um = 1, чтобы преобразовать интервал в [0,1].

Чтобы описать базисные функции B-spline, нужен еще один параметр, степень этих базисных функций, p. i-я базисная функция B-spline степени p (пишется Ni,p(u) ), описывается рекурсивно:

Вышеуказанное уравнение обычно называют рекурсивной формулой Cox - de Boor. Это определение выглядит сложным. Но оно просто для понимания. Если степень равна нулю (т.e., p = 0), эти базисные функции являются скачковыми и это как раз то, о чем говорит первое выражение в формуле. То есть, базисная функция Ni,0(u) равна 1, если u лежит на i-м узловом интервале [ui, ui+1). Например, если есть четыре узла u0 = 0, u1 = 1, u2 = 2 и u3 = 3, узловые интервалы 0, 1 и 2 - это [0,1), [1,2), [2,3) и базисные функции 0 степени - это N0,0(u) = 1 на [0,1) и 0 в других случаях, N1,0(u) = 1 на [1,2) и 0 в других случаях, и N2,0(u) = 1 на [2,3) и 0 в других случаях. Это показано ниже:

Чтобы понять принцип расчета Ni,p(u) для p больше 0, вернемся к треуголной схеме расчета. Все узловые интервалы - в левом (первом) столбце, а все базисные функции нулевой степени - во втором. Это показано на следующей диаграмме.

Чтобы вычислить Ni,1(u), нужно Ni,0(u) и Ni+1,0(u). Таким образом, мы можем вычислить N0,1(u), N1,1(u), N2,1(u), N3,1(u) и так далее. Все эти Ni,1(u) записываются в третий столбец. Когда будут найдены Ni,1(u), можно будет вычислить Ni,2(u) и записать их в четвертый столбец. Продолжаем в том же духе, пока не вычислим все нужные Ni,p(u).

Выше мы нашли N0,0(u), N1,0(u) и N2,0(u) для узлового вектора U = { 0, 1, 2, 3 }. Давайте вычислим N0,1(u) и N1,1(u). Чтобы вычислить N0,1(u), так как i = 0 и p = 1, по определению имеем

N0,1(u) = (u - u0) / (u1 - u0 ) N0,0(u) + (u2 - u) / (u2 - u1 ) N1,0(u)

Так как u0 = 0, u1 = 1 и u2 = 2, вышеизложенное преобразуется к виду

N0,1(u) = u N0,0(u) + (2 - u) N1,0(u)

Так как N0,0(u) не равно нулю на [0,1), а N1,0(u) не равно нулю на [1,2), когда u лежит на [0,1) (соотв., на [1,2) ), только N0,0(u) (соотв., N1,0(u) ) влияет на [? contributes to] N0,1(u). Таким образом, когда u в пределах [0,1), N0,1(u) равно uN0,0(u) = u, а когда u в пределах [1,2), N0,1(u) равно (2 - u)N1,0(u) = (2 - u). Простые вычисления дают N1,1(u) = u - 1, если u лежит на [1,2), а N1,1(u) = 3 - u, если u лежит на [2,3). На следующем рисунке черные и красные линии - это соответственно N0,1(u) и N1,1(u). Заметьте, что N0,1(u) (соотв., N1,1(u)) не равно нулю на [0,1) и [1,2) (соотв., на [1,2) и [2,3)).

Как только будут найдены N0,1(u) и N1,1(u), можно вычислить N0,2(u). Из определения следует:

N0,2(u) = (u - u0) / (u2 - u0 ) N0,1(u) + (u3 - u) / (u3 - u1 ) N1,1(u)

Подставляя эти значения узлов, имеем

N0,2(u) = 0.5u N0,1(u) + 0.5 (3 - u) N1,1(u)

Заметьте, что N0,1(u) не равно нулю на [0,1) и [1,2), а N1,1(u) не равно нулю на [1,2) и [2,3). Таким образом, имеем три случая:

  1. u в пределах [0,1): В этом случае, только N0,1(u) влияет на значение N0,2(u). Так как N0,1(u) равно [is] u, имеем

N0,2(u) = 0.5u2.

  1. u в пределах [1,2): В этом случае, и N0,1(u), и N1,1(u) влияют на N0,2(u). Так как на [1,2), N0,1(u) = 2 - u и N1,1(u) = u - 1, имеем

N0,2(u) = (0.5u)(2 - u) + 0.5(3 - u)(3 - u) = 0.5(-3 + 6u - 2u2)

  1. u в пределах [2,3): В этом случае, только N1,1(u) влияет на N0,2(u). Так как N1,1(u) = 3 - u на [2,3), имеем

N0,2(u) = 0.5(3 - u)(3 - u) = 0.5(3 - u)2

Если нарисовать отрезок кривой для каждого из трех случаев, то станет видно, что два смежных отрезка кривых соединяются, образуя кривую по узлам. Говоря точнее, отрезки первого и второго случаев соединяются при u = 1, а второго и третьего случаев - при u = 2. Это показано на рисунке ниже. Заметьте, что образованная кривая, изображенная на рисунке, является гладкой. Но в общем случае это не так, если, например, мы имеем дело с множественными узлами.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]