2009-07-18 4 views
2

Ich versuche eine Klasse zu erstellen, die beliebig viele Punkte (Position und Kontrolle) aufnimmt und basierend auf den gegebenen Informationen einen catmull-rom Spline erstellt.Catmull-Rom-Splines verbinden und ihre Länge berechnen?

Was ich tue - und ich bin wirklich nicht sicher, ob dies der richtige Weg ist, es zu tun - ist jeden einzelnen Punkt in einer Klasse zu speichern etwa so:

class Point { public: Vector3 position; Vector3 control; }

Wo offensichtlich Position Die Position des Punktes und der Kontrolle ist der Kontrollpunkt.

Mein Problem ist die Verbindung der Splines - offensichtlich vorausgesetzt, dass die oben genannte Klasse, die einen Punkt im Spline-Array hält, angibt, dass jede gegebene Position nur einen Kontrollpunkt haben kann. Wenn also drei oder mehr Punkte in einem catmull rom Spline vorhanden sind, teilen sich die verschiedenen einzelnen catmull-rom Splines, die verbunden werden, eine Position und eine Steuerung mit einem anderen solchen Spline.

Jetzt mit Position wird das gleiche benötigt - da ich Splines erstellen möchte, die untereinander kontinuierlich sind. Allerdings frage ich mich, ob die Kontrollpunkte zwischen den beiden Splines auch gleich sind. Mit ein wenig Fiedeln der Kontrollpunkte kann ich den Übergang von einem Spline zum nächsten scheinbar fließend erscheinen lassen, aber ich muss betonen, dass ich nicht sicher bin, ob die Art und Weise, wie sie sich verändern, mit der Form von catmull-rom Splines übereinstimmt . Ich würde es lieber richtig machen, als auf meinen Händen zu sitzen und zu rationalisieren, dass es gut genug ist.

Offensichtlich ist der zweite Teil meiner Frage selbsterklärend: Gegeben zwei Kontroll- und Positionspunkte wie berechne ich die Länge eines catmull-rom Splines?

Antwort

4

Um den Spline zwischen zwei Kontrollpunkten zu definieren, benötigt der Catmull-Rom-Spline die Kontrollpunkte und den Tangentenvektor an jedem Kontrollpunkt. Jedoch ist die Tangentenvektor an internal (dh nicht-Endpunkt) Steuerpunkte wird durch die Kontrollpunkte auf beiden Seiten davon definiert: T (P n) = (P n + 1 - P n-1)/2. Bei geschlossenen Kurven wird der Spline vollständig durch die Kontrollpunkte definiert. Für nicht geschlossene Kurven müssen Sie auch den Tangentenvektor am ersten und letzten Kontrollpunkt angeben. Dies wird allgemein durchgeführt: T (0 P ) = P - P 0 und T (P n) = P n - P n-1 .

Daher ist Ihre Datenstruktur für geschlossene Kurven nur eine Liste von Kontrollpunkten. Bei allgemeinen Splines handelt es sich um eine Liste von Punkten plus dem ersten und letzten normalen Vektor.

Wenn Sie einen Kardinalspline haben möchten, können Sie der Tangentenvektorberechnung einen Gewichtungsfaktor hinzufügen, wie in der Wikipedia article.

Um die Länge eines solchen Splines zu berechnen, wäre ein Ansatz, ihn zu approximieren, indem der Spline an vielen Punkten ausgewertet und dann der lineare Abstand zwischen jedem benachbarten Punktepaar berechnet wird.

1

In Bezug auf die Messung der Längen können Sie dies mit Kalkül tun, da es ein Polynom Spline ist. Sie müssen die Abstandsfunktion über die Linie integrieren. Es ist ziemlich gut beschrieben auf Wikipedia ...

Verwandte Themen