Aufteilung von NURBS-Kurven

8

tDank des Algorithmus von De Casteljau ist es einfach, die Bezier-Kurve an einigen Parametern in zwei Teile zu teilen .

Gibt es einen ähnlichen Algorithmus für NURBS-Kurven? Wie teile ich eine NURBS-Kurve?

Ecir Hana
quelle
Ich weiß nicht, ob es dasselbe tun wird, aber der Algorithmus von De Boor entspricht dem von De Casteljeau. Interessanterweise weiß ich, dass Sie den Algorithmus von De Boor verwenden können, um eine NURBS oder einen B-Spline in eine stückweise Bezier-Kurve aufzuteilen.
Alan Wolfe

Antworten:

5

Die Art und Weise, wie NURBS-Kurven normalerweise an einem beliebigen Punkt geteilt werden, erfolgt durch Einfügen von Knoten . Sie fügen Knoten am Teilungspunkt ein, bis die maximale Multiplizität erreicht ist. An diesem Punkt können Sie einfach die beiden Teilungskurven ablesen.

Möglicherweise möchten Sie jedoch nicht an einem beliebigen Punkt teilen. Wenn das ultimative Ziel darin besteht, die Kurven oder ähnliches zu zeichnen, lohnt es sich, die Kurve an den vorhandenen Knotenpunkten zu teilen (dh das Einfügen von Knoten durchzuführen, bis alle Knoten die maximale Multiplizität erreicht haben), anstatt neue einzufügen.

Dieser Prozess teilt die NURBS in einheitliche rationale B-Splines auf. Sobald Sie das haben, können Sie den Algorithmus von de Boor verwenden , um weiter zu teilen.

Die Anzahl der Knoten im Knotenvektor beträgt:

numKnots = degreeOfCurve + numControlPoints + 1

oder wenn Sie es vorziehen:

numKnots = orderOfCurve + numControlPoints

Das Einfügen eines Knotens erhöht somit die Anzahl der Kontrollpunkte um eins.

Während Sie sich entlang einer NURBS-Kurve bewegen, repräsentiert jeder Knoten eine Stelle, an der ein Kontrollpunkt "herausfällt" und ein anderer "eintritt". Wenn ein Knotenwert wiederholt wird, bedeutet dies, dass an dieser Stelle mehr als ein Kontrollpunkt ersetzt wird.

Bei einer Gradkurve größer als 1 werden der und der letzte Knoten aus einem einfachen Grund mehrmals wiederholt: Sie müssen mehr als einen Punkt einbringen, um zu beginnen, und Sie müssen mehr als einen Punkt auswerfen, um zu enden.

Lassen Sie uns für den Moment über kubische Kurven nachdenken, um die Dinge einfach zu halten.

Eine Kurve mit dem Knotenvektor [0,0,1,1] ist eine einheitliche B-Spline-Kurve.

Eine Kurve mit dem Knotenvektor [0,0,1,1,2,2] ist ungleichmäßig, kann jedoch als zwei gleichmäßige B-Spline-Kurven betrachtet werden, die sich bei t = 1 verbinden, wobei eine [0,0 entspricht , 1,1] und eine entsprechend [1,1,2,2]. Sie können dies tun, weil die Vielzahl der Knoten ausreicht, um eine kubische Kurve zu "starten" und "zu beenden".

Wenn Sie mit einer Kurve mit einem Knotenvektor wie [0,0,1,2,2] konfrontiert sind, können Sie einen Knoten bei 1 einfügen, ohne die Form der Kurve zu ändern (dies ist das Verfahren zum Einfügen von Knoten). Dies erhöht die Anzahl der Kontrollpunkte um eins; Beim Einsetzen des Knotens werden die Punkte um den neuen Knoten angepasst, um ihn aufzunehmen. Sobald Sie dies getan haben, haben Sie zwei einheitliche B-Spline-Kurven.

Durch das Einfügen von Knoten werden keine überlappenden Kontrollpunkte erstellt, es sei denn, Sie fügen zu viele Knoten an derselben Stelle ein, und mit "zu vielen" meine ich den Grad der Kurve. Für eine ungleichmäßige kubische Kurve würden Sie also Knoten einfügen, sodass jeder Knoten eine Multiplizität von 2 hat. Dies gibt Ihnen eine Reihe aneinandergrenzender einheitlicher kubischer Kurven, die Sie dann mit dem Algorithmus von de Boor weiter teilen können.

Pseudonym
quelle
Es tut mir leid, dass ich bei NURBS sehr neu bin: Was meinst du mit "maximaler Vielfalt"? Ich meine, wenn ich es auf die frühere Weise mache, habe ich dann mehrere überlappende Kontrollpunkte?
Ecir Hana
Lassen Sie mich versuchen, in der Antwort zu erklären.
Pseudonym
1
Pseudonym err nein kein guter Knotenvektor, um dies zu demonstrieren. Ich sehe, dass ich möglicherweise den anderen Beitrag erweitern muss. Obwohl @EcirHana es eine gute Idee sein könnte zu fragen, was eine Vielzahl ist.
Jojaja
Da hast du wahrscheinlich recht mit @joojaa.
Pseudonym