В качестве первого примера возьмём кубический (четвёртого порядка) В-сплайн, показанный на рис.3.3. Определяющий многоугольник состоит из четырёх вершин, обозначенных В0 ,В1 ,В2 и В3 ,соединённые пунктирными линиями.
Что можно определить по этой кривой? Давайте ответим на несколько вопросов по этой кривой. Первый, сколько нужно точек, чтобы задать кубическую кривую? Выясняется, что нужно столько точек, каков порядок кривой. Для задания линии нужно две точки, параболы - три точки, для кубической кривой нужно четыре точки. Т.к. в нашем определяющем многоугольнике четыре точки, то можно предположить, что в этом примере всего один кубический интервал.
Как выглядит параметрическое пространство этой кривой, т.е. как изменяется параметр u вдоль кривой? Мы вправе назначить любой интервал изменения параметра u, но с тем условием, чтобы на этом интервале кривая монотонно возрастает при переходе из начала в конец кривой. Кроме того, нам важны не сами значения параметра, а его изменения вдоль кривой. Для удобства примем, что u изменяется от 0 до 1 при переходе из одного конца кривой в другой.
Затем, что такое узловой вектор для данной кривой? Т.к. мы знаем, что кривая состоит из единственного кубического интервала и что значения узлового вектора определяют границы интервалов, то можно догадаться, что узловой вектор выглядит как [0, 1]. Близко, но не совсем правильно. В текущей версии FastShip используется т.н. открытый узловой вектор (противопоставление периодическому узловому вектору, использовавшемуся в FastShip 3 и более ранних версиях). Открытый узловой вектор имеет свойство, заключающееся в том, что существует многозначность узловых значений в начале и в конце узлового вектора. Т.о. узловой вектор в данном примере имеет вид [0,0,0,0,1,1,1,1]. Значение многозначности узлов – сделать так, чтобы первая и последняя вершины многоугольника и начало и конец кривой соответственно совпадали. Сформулируем это важное свойство для В-сплайнов с открытым узловым вектором: кривая интерполирует между крайними точками определяющего многоугольника.
Наконец, как можно вычислить значение точки кривой по данным определяющему многоугольнику и узловому вектору? Чтобы продемонстрировать это, давайте вычислим значение точки при значении u=0.5. Этот процесс состоит из серии повторяющихся линейных интерполяций. Т.к. кривая третьей степени, то потребуется три серии последовательных интерполяций. Сперва проинтерполируя каждую из трёх наклонных определяющего многоугольника посередине длины (потому что данное значение параметра лежит посередине наклонной), получим три новых точки, отмеченные ромбиками на рис.3.3. Теперь проинтерполируем две новых наклонных, образованные соединением трёх точек, посередине длины и получим две новые точки. И, наконец, проинтерполируем наконную, полученную соединением двух точек, и получим искомое значение при u=0.5.
3.4 Пример простого квадратичного В-сплайна
Рассмотрим пример другого В-сплайна. Рассмотрим квадратичный (третьего порядка) В-сплайн, показанный на рис.3.4, определённый тремя вершинами определяющего многоугольника. Как мы уже поняли из предыдущего примера, чтобы определить квадратичную кривую нужно три точки, и что в данном случае существует единственный квадратичный интервал. Открытый узловой вектор будет иметь вид [0,0,0,1,1,1]. Возможно, вы заметили, что существует связь между числом вершин определяющего многоугольника и числом узлов узлового вектора. Для В-сплайнов в общем случае, число узлов равняется числу вершин определяющего многоугольника плюс порядок кривой. Как было замечено в предыдущем примере, многозначность узлов нужна для того, чтобы концы кривой совпадали с крайними вершинами определяющего многоугольника
Вычислим значение кривой при параметре u=0.5. Как уже упоминалось, этот процесс состоит из серии линейных интерполяций. Проинтерполируем первую наклонную посередине длины. То же самое проделаем и со второй наклонной. Получим две точки. Соединяя их, получим новую наклонную. Проинтерполируем ёе посередине длины, получим значение кривой при u=0.5. Заметьте, что пришлось всего две интерполяции, чтобы вычислить значение кривой, и в общем случае нужно столько интерполяций, какова степень кривой. Подобную процедуру можно провести для вычисления значения кривой при любом значении u. Конечно, это всего лишь графический метод решения подобной задачи. Существуют также математические методы для решения этой проблемы (такие как метод Кокса-ДеБура), которые и используются в FastShip. Однако, графический метод полезен для более полного понимания математики NURBS, а также для демонстрации ряда важных свойств NURBS.
3.5 Пример простого линейного В-сплайна
Рис.3.5. Пример простого линейного В-сплайна
В качестве последнего примера рассмотрим линейный В-сплайн, показанный на рис.3.5. Определяющий многоугольник состоит из трёх вершин, обозначенных B0, B1, и B2. Что можно сказать об этой линейной кривой? Мы знаем, что нужно две точки, чтобы определить линию, так что здесь должно быть два линейных интервала. В узловом векторе нужно иметь три узла, чтобы определить два интервала, один - в начале, другой - в конце, третий - между первыми двумя. Для многих поверхностей, с которыми вы будете работать в FastShip, используется стандартный узловой вектор. Это значит, что внутренний узел находится на равном расстоянии, как от первого узла, так и от последнего. В дальнейшем мы будем рассматривать нестандартные узловые векторы. Следовательно, в данном примере узловой вектор будет иметь вид [0,0.5,1]. Тогда открытый узловой вектор с соответствующей многозначностью будет иметь вид [0,0,0.5,1,1]. Чтобы вычислить значение кривой при u=0.25 нужно рассмотреть наклоную B0B1, имеющие соответственно значения 0 и 0.5, и интерполировать эту наклонную посередине длины. Выясняется, что фактически для линейного В-сплайна определяющий многоугольник и линейный В-сплайн совпадают.
3.6 В-сплайн кривые против традиционных кривых интерполирования
Интерполирующая кривая
Многие из Вас работали с интерполирующими кривыми в том или ином виде, " кубическими сплайнами ", используемыми во многих приложениях для интерполирования между дискретным набором заданных точек. Чем эти кривые отличаются от В-сплайнов и почему они не используются в FastShip? Этот пункт рассказывает об основных различиях между использованием интерполирующих кривых и В-сплайнов в отношении проектирования.
Рассмотрим только случай сплайна четвертого порядка или третьей степени, так как эти функции ведут себя как большинство материалов, из которых построено судно. Воспользуемся рисунком 3.6 .Рассуждения начнем с пространственных кривых и затем перейдём к поверхностям.
Принципиальное разница между кубическим В-сплайном и параметрическим кубическим сплайном - это набор “ручек”, которыми проектировщик управляет кривой. В-сплайн использует вспомогательную контрольную сеть для вытягивания кривой, в то время как интерполирующий сплайн использует узлы, чтобы непосредственно определить положение кривой в пространстве.
На первый взгляд, последний метод непосредственного управления узлами на кривой для проектирования формы кривой кажется чрезвычайно заманчивым, в то время как концепция управления вспомогательной фигурой (контрольная сеть), кажется излишней абстракцией.
Рисунок 3.6 показывает два В-сплайна, каждый состоящий из пяти контрольных точек, у каждого из них серединная точка смещена вертикально вверх. Заметьте совершенно разные полученные кривые. Интерполирующий сплайн действительно проходит через все контрольные точки, но непредсказуемо колеблется между определяющей линией , в то время как В-сплайн фактически не проходит через контрольные вершины, но более гладко повторяет контрольную сеть. Стоит также отметить, что если бы кривая в примере содержала большее количество контрольных точек на конце кривой, полученный В-сплайн остался бы прежним, в то время как интерполирующий сплайн продолжил бы затухающие колебания вплоть до к конца кривой. Отсюда следует два важных свойства В-сплайнов. Первое, при движении определяющей контрольной сетки В-сплайн может перемещаться только в направлении параллельном движению контрольной точки на величину, зависящую от близости к сдвигаемой контрольной точке. Второе, контрольная точка на кривой имеет ограниченный интервал влияния, т.е. при движении одной контрольной точки изменения в форме кривой будут иметь локальный характер. Этих свойств совершенно нет у интерполирующих сплайнов, которые должны проходить через контрольные точки. Фактически, можно показать, что воздействие от движения одной контрольной точки влияет по всей длине кривой, и что изменения формы кривой колебательны по своей природе. Манипулируя контрольной сетью В-сплайна при движении одной точки сети, сдвигается не один узел. Возвращаясь к рис.3.6, можно увидеть, что серединный узел, соответствующий сдвигаемой контрольной точке, сдвинулся на 2/3 расстояния контрольной точки, а два смежных узла сдвинулись параллельно на 1/6 расстояния. Смещения двух последних узлов оказалось достаточно, чтобы кривая сама устранила осцилляции. Проектировщик, использующий интерполирующие сплайны мог бы создать идентичную кривую, сдвинув три узла в заданные положения, но такая точность нежелательна. Аналогично проектировщик мог бы создать кривую путём интерполирования, используя В-сплайны, но для этого ему потребовалось бы создать колебательную сеть.