Расщепление NURBS-кривых

8

Разделить кривую Безье на две части по некоторому параметру tлегко благодаря алгоритму де Кастельжау .

Есть ли аналогичный алгоритм для кривых NURBS? Как разбить кривую NURBS?

Ecir Hana
источник
Я не знаю, будет ли он делать то же самое, но алгоритм Де Бур является эквивалентом Де Кастельо. Интересно, что я знаю, что вы можете использовать алгоритм Де Боора для разбиения NURBS или b-сплайна на кусочно-кривую Безье.
Алан Вулф

Ответы:

5

Способ, которым кривые NURBS обычно разделяются в произвольной точке, заключается в вставке узла . Вы вставляете узлы в точке разделения, пока она не достигнет максимальной кратности, и в этот момент вы можете просто прочитать две кривые разделения.

Тем не менее, вы не можете разделить в произвольной точке. Если конечная цель состоит в том, чтобы нарисовать кривые или что-то в этом роде, то лучше разделить кривую по существующим точкам узлов (то есть выполнить вставку узлов, пока все узлы не достигнут максимальной кратности), а не вставлять новые.

Этот процесс разбивает NURBS на однородные рациональные B-сплайны. Получив это, вы можете использовать алгоритм де Бур для дальнейшего разделения.

Количество узлов в векторе узлов:

numKnots = degreeOfCurve + numControlPoints + 1

или если вы предпочитаете:

numKnots = orderOfCurve + numControlPoints

Таким образом, вставка узла увеличивает количество контрольных точек на одну.

Когда вы путешествуете по кривой NURBS, каждый узел представляет собой место, где одна контрольная точка «выпадает», а другая «входит». Если значение узла повторяется, это означает, что в этом месте заменяется более одной контрольной точки.

Для кривой степени больше 1 первый и последний узлы повторяются несколько раз по одной простой причине: вам нужно ввести более одной точки, чтобы начать, и вам нужно выбросить более одной точки до конца.

Давайте пока подумаем о кубических кривых, просто чтобы все было просто.

Кривая с вектором узла [0,0,1,1] является равномерной кривой B-сплайна.

Кривая с вектором узла [0,0,1,1,2,2] является неоднородной, но ее можно рассматривать как две однородные кривые B-сплайна, которые соединяются при t = 1, одна соответствует [0,0 , 1,1] и один соответствует [1,1,2,2]. Вы можете сделать это, потому что кратности узлов достаточно, чтобы «начать» и «закончить» кубическую кривую.

Если вы столкнулись с кривой с вектором узла, например [0,0,1,2,2], вы можете вставить узел в 1, не меняя форму кривой (это процедура вставки узла). Это увеличивает количество контрольных точек на одну; процедура вставки узла регулирует точки вокруг нового узла, чтобы приспособить его. Но как только вы это сделаете, у вас есть две одинаковые кривые B-сплайна.

Вставка узлов не создаст перекрывающихся контрольных точек, если вы не вставите слишком много узлов в одно и то же место, а под «слишком многими» я подразумеваю степень кривой. Таким образом, для неоднородной кубической кривой вы должны вставить узлы таким образом, чтобы каждый узел имел кратность 2. Это дает вам ряд примыкающих однородных кубических кривых, которые затем вы можете использовать алгоритм де Бур для дальнейшего разделения.

Псевдоним
источник
Извините, я очень новичок в NURBS: что вы подразумеваете под "максимальной кратностью"? Я имею в виду, когда я делаю это первым способом, получаю ли я несколько перекрывающихся контрольных точек?
Ecir Hana
Позвольте мне попытаться объяснить в ответ.
псевдоним
1
Псевдоним err нет не очень хороший вектор узлов, чтобы продемонстрировать это. Я вижу, что мне может понадобиться расширить другой пост. Хотя @EcirHana было бы неплохо спросить, что такое множественность.
joojaa
Вы, вероятно, правы насчет этого @joojaa.
псевдоним