Fractionnement des courbes NURBS

8

La division de la courbe de Bézier en deux parties à un certain paramètre test facile grâce à l'algorithme de De Casteljau .

Existe-t-il un algorithme similaire pour les courbes NURBS? Comment diviser une courbe NURBS?

Ecir Hana
la source
Je ne sais pas s'il fera de même, mais l'algorithme de De Boor est l'équivalent de De Casteljeau. Fait intéressant, je sais que vous pouvez utiliser l'algorithme de De Boor pour diviser une NURBS ou une b-spline en une courbe de Bézier par morceaux.
Alan Wolfe

Réponses:

5

La façon dont les courbes NURBS sont généralement divisées à un point arbitraire est l' insertion de nœuds . Vous insérez des nœuds au point de partage jusqu'à ce qu'il soit à la multiplicité maximale, point auquel vous pouvez simplement lire les deux courbes de partage.

Cependant, vous ne souhaiterez peut-être pas vous séparer à un point arbitraire. Si le but ultime est de dessiner les courbes ou quelque chose comme ça, alors il vaut la peine de diviser la courbe aux points de nœuds existants (c'est-à-dire d'effectuer l'insertion de nœuds jusqu'à ce que tous les nœuds soient à la multiplicité maximale) plutôt que d'en insérer de nouveaux.

Ce processus divise le NURBS en B-splines rationnelles uniformes . Une fois que vous avez cela, vous pouvez utiliser l'algorithme de de Boor pour diviser davantage.

Le nombre de nœuds dans le vecteur de nœuds est:

numKnots = degreeOfCurve + numControlPoints + 1

ou si vous préférez:

numKnots = orderOfCurve + numControlPoints

L'insertion d'un nœud augmente ainsi le nombre de points de contrôle de un.

Lorsque vous voyagez le long d'une courbe NURBS, chaque nœud représente un endroit où un point de contrôle "sort" et un autre "entre". Si une valeur de nœud est répétée, cela signifie que plus d'un point de contrôle est remplacé à cet endroit.

Pour une courbe de degré supérieur à 1, le et les derniers nœuds sont répétés plusieurs fois pour une raison simple: vous devez apporter plus d'un point pour commencer et vous devez éjecter plus d'un point pour terminer.

Pensons aux courbes cubiques pour le moment, juste pour garder les choses simples.

Une courbe avec le vecteur de noeud [0,0,1,1] est une courbe B-spline uniforme.

Une courbe avec le vecteur de noeud [0,0,1,1,2,2] n'est pas uniforme, mais peut être considérée comme deux courbes B-spline uniformes qui se connectent à t = 1, une correspondant à [0,0 , 1,1] et un correspondant à [1,1,2,2]. Vous pouvez le faire car la multiplicité des nœuds suffit pour "démarrer" et "terminer" une courbe cubique.

Si vous êtes confronté à une courbe avec un vecteur de nœud comme [0,0,1,2,2], vous pouvez insérer un nœud à 1 sans changer la forme de la courbe (c'est la procédure d'insertion de nœud). Cela augmente le nombre de points de contrôle d'un; la procédure d'insertion de nœud ajuste les points autour du nouveau nœud pour l'adapter. Mais une fois que vous avez fait cela, vous avez deux courbes B-spline uniformes.

L'insertion de nœuds ne créera pas de points de contrôle qui se chevauchent, sauf si vous insérez trop de nœuds au même endroit, et par «trop», je veux dire le degré de la courbe. Donc, pour une courbe cubique non uniforme, vous insérez des nœuds de sorte que chaque nœud ait une multiplicité 2. Cela vous donne un certain nombre de courbes cubiques uniformes contiguës, que vous pouvez ensuite utiliser l'algorithme de Boor pour diviser davantage.

Pseudonyme
la source
Je suis désolé, je suis très nouveau sur NURBS: que voulez-vous dire par "multiplicité maximale"? Je veux dire, quand je le fais de la manière précédente, est-ce que je me retrouve avec plusieurs points de contrôle qui se chevauchent?
Ecir Hana
Permettez-moi d'essayer d'expliquer dans la réponse.
Pseudonyme
1
Le pseudonyme n'est pas un bon vecteur de nœuds pour le démontrer. Je vois que j'ai peut-être besoin de développer l'autre article. Même si @EcirHana peut être une bonne idée de demander ce qu'est une multilicité.
joojaa
Vous avez probablement raison à ce sujet @joojaa.
Pseudonyme