Der Einfachheit halber werde ich eine kubische Bezier-Kurve als 4 Punkte (A, B, C, D) darstellen, wobei A und D die Endpunkte der Kurve sind, und B und C sind die "Kontrollpunkte". (Die tatsächliche Kurve in der Regel nicht berühren Sie die Steuerpunkte).
Siehe "Don Lancaster's Guru's Lair Cubic Spline Library" für Möglichkeiten, diese Darstellung einer kubischen Bezier-Kurve in andere populäre Darstellungen zu konvertieren.
Interpolation
eine kubische Bezier-Kurve (P0, P1, P2, P3) gegeben, wir De Casteljau's algorithm verwenden, um eine Bezier-Kurve in eine linke Hälfte und eine rechte Hälfte zerhacken. Das ist super-einfach, dass selbst auf einem Mikrocontroller, der keine „multiplizieren“ Anweisung hat, denn es erfordert nur wenige mittelt Berechnung, bis wir einen Mittelpunkt erhalten:
P0
F0 := average(P0, P1)
P1 S0 := average(F0, F1)
F1 := average(P1, P2) Midpoint := average(S0, S1)
P2 S1 := average(F1, F2)
F2 := average(P2, P3)
P3
Die gesamte Bézier-Kurve ist (P0 , P1, P2, P3).
Die linke Hälfte dieser ganzen Bezier-Kurve ist die Bezier-Kurve (P0, F0, S0, M).
Die rechte Hälfte dieser ganzen Bezier-Kurve ist die Bezier-Kurve (M, S1, F2, P3).
Viele Mikrocontroller weiterhin jede Kurve zu unterteilen in immer kleinere kleine Kurven , bis jedes Stück klein genug ist, mit eine gerade Linie anzunähern.
Aber wir wollen den anderen Weg gehen - auf eine größere Kurve extrapolieren.
Extrapolation
entweder die linke Hälfte oder die rechte Hälfte gegeben, wir können dies in umgekehrter Reihenfolge ausführen, um die ursprüngliche Kurve zu erholen.
Stellen wir uns vor, dass wir die ursprünglichen Punkte P1, P2, P3 vergessen haben.
die linke Hälfte einer Bezier-Kurve Given (P0, F0, S0, M), wir nach rechts mit extrapolieren kann:
S1 := M + (M - S0)
F1 := S0 + (S0 - F0)
P1 := F0 + (F0 - P0)
dann diese Werte verwenden berechnen
F2 := S1 + (S1 - F1)
P2 := F1 + (F1 - P1)
und schließlich
P3 := F2 + (F2 - P2)
zu extrapolieren und die hochgerechneten Bazier Kurve (P0, P1 zu erholen, P2, P3).
Details
Die extrapolierte Kurve (P0, P1, P2, P3) verlaufen in der ursprünglichen Kurve jeden Punkt durch (P0, F0, S0, M) - insbesondere beim Starten P0 und durch den Mittelpunkt M - und geht weiter bis zum Erreichen von P3.
Wir können immer von allen 4 Punkten extrapolieren (P0, F0, S0, M), , ob diese vier Punkte wurden ursprünglich als die linke Hälfte (oder rechte Hälfte) eines größeren Bezierspline berechnet.
Ich bin sicher, dass Sie bereits wissen, dies aber nur für Klarheit:
Midpoint = average(F0, F1)
bedeutet "finden den Mittelpunkt genau auf halber Strecke zwischen den Punkten F0 und F1", oder in anderen Worten,
Midpoint.x = (F0.x + F1.x)/2
Midpoint.y = (F0.y + F1.y)/2
Midpoint.z = (F0.z + F1.z)/2
Der Ausdruck
S1 := M + (M - S0)
bedeutet „ein Liniensegment gegeben, der mit einem Ende am S0, und der Mittelpunkt bei M, Start bei S0 und in einer geraden Linie Vergangenheit M ausgeführt, bis Sie das andere Ende an S1" erreichen, oder mit anderen Worten (es sei denn, Sie haben eine anständige Vektor-Bibliothek) 3 Zeilen Code
S1.x := M.x + (M.x - S0.x)
S1.y := M.y + (M.y - S0.y)
S1.z := M.z + (M.z - S0.z)
. (Wenn Sie 2D machen, überspringen Sie alle "z" Zeug - es ist immer Null).
MATLAB ist eine Bibliothek, ich suche Code wie erwähnt. Ich habe eine Reihe von Datenpunkten, die eine Kurve erzeugen. Ich muss die Kurve nur ein wenig nach vorne verlängern. Es ist nicht komplizierter als das. –
Nun, nimm einfach die letzte Kurve 3. Ordnung und berechne dann die gewünschten Werte. Wenn Sie es eingerichtet haben, haben Sie bereits die Koeffizienten. – Rook
Dieser Code wurde vor vielen Jahren geschrieben, als ich dieses Niveau der Mathematik leicht machen konnte. Jetzt müsste ich das Ganze auseinanderreißen und die Konzepte auffrischen ... nicht trivial. Ich hatte gehofft, dass dieser Beitrag eine Verbindung zu irgendeinem Code veranlassen würde ... –