División de curvas NURBS

8

Dividir la curva de Bezier en dos partes en algún parámetro tes fácil gracias al algoritmo de De Casteljau .

¿Existe un algoritmo similar para las curvas NURBS? ¿Cómo dividir una curva NURBS?

Ecir Hana
fuente
No sé si hará lo mismo, pero el algoritmo de De Boor es el equivalente de De Casteljeau. Curiosamente, sé que puede usar el algoritmo de De Boor para dividir un NURBS o b-spline en una curva Bezier por partes.
Alan Wolfe

Respuestas:

5

La forma en que las curvas NURBS se dividen típicamente en un punto arbitrario es mediante inserción de nudos . Inserta nudos en el punto de división hasta que esté en la multiplicidad máxima, momento en el que puede leer las dos curvas de división.

Sin embargo, es posible que no desee dividir en un punto arbitrario. Si el objetivo final es dibujar las curvas o algo así, entonces vale la pena dividir la curva en los puntos de nudo existentes (es decir, realizar la inserción del nudo hasta que todos los nudos tengan la máxima multiplicidad) en lugar de insertar nuevos.

Este proceso divide las NURBS en splines B racionales uniformes . Una vez que tenga eso, puede usar el algoritmo de de Boor para dividirse aún más.

El número de nudos en el vector de nudo es:

numKnots = degreeOfCurve + numControlPoints + 1

o si lo prefieres:

numKnots = orderOfCurve + numControlPoints

Insertar un nudo aumenta así el número de puntos de control en uno.

A medida que viaja a lo largo de una curva NURBS, cada nudo representa un lugar donde un punto de control "cae" y otro "entra". Si se repite un valor de nudo, esto significa que se reemplaza más de un punto de control en este lugar.

Para una curva de grado mayor que 1, los nudos y los últimos nudos se repiten varias veces por una simple razón: necesita traer más de un punto para comenzar y debe expulsar más de un punto para finalizar.

Pensemos en las curvas cúbicas por el momento, solo para simplificar las cosas.

Una curva con el vector de nudo [0,0,1,1] es una curva B-spline uniforme.

Una curva con el vector de nudo [0,0,1,1,2,2] no es uniforme, pero puede considerarse como dos curvas uniformes B-spline que se conectan en t = 1, una correspondiente a [0,0 , 1,1] y uno correspondiente a [1,1,2,2]. Puede hacer esto porque la multiplicidad de los nudos es suficiente para "comenzar" y "terminar" una curva cúbica.

Si se enfrenta a una curva con un vector de nudo como [0,0,1,2,2], puede insertar un nudo en 1 sin cambiar la forma de la curva (este es el procedimiento de inserción del nudo). Esto aumenta el número de puntos de control en uno; El procedimiento de inserción del nudo ajusta los puntos alrededor del nuevo nudo para acomodarlo. Pero una vez que haya hecho eso, tiene dos curvas uniformes B-spline.

La inserción de nudos no creará puntos de control superpuestos a menos que inserte demasiados nudos en el mismo lugar, y por "demasiados", me refiero al grado de la curva. Entonces, para una curva cúbica no uniforme, insertaría nudos para que cada nudo tuviera multiplicidad 2. Eso le da una cantidad de curvas cúbicas uniformes contiguas, que luego puede usar el algoritmo de De Boor para dividir aún más.

Seudónimo
fuente
Lo siento, soy muy nuevo en NURBS: ¿qué quieres decir con "máxima multiplicidad"? Quiero decir, cuando lo hago de la manera anterior, ¿termino con múltiples puntos de control superpuestos?
Ecir Hana
Déjame intentar explicar en la respuesta.
Seudónimo
1
El seudónimo err no no es un buen vector de nudo para demostrar esto. Veo que podría necesitar expandir la otra publicación. Aunque @EcirHana podría ser una buena idea preguntar qué es una multilicidad.
joojaa
Probablemente tengas razón sobre eso @joojaa.
Seudónimo