Ich habe mich eine Weile umgesehen und kann keine Lösung für dieses Problem finden. Angenommen, ich habe eine kubische Bezierkurve (definiert durch 4 Punkte) und möchte eine Reihe von Punkten erhalten, die gleichmäßig entlang der Kurve verteilt sind. Stellen Sie sich zum Beispiel einen Text entlang einer Kurve vor.
Das Problem ist nun, dass bei einer Eingabe t
(Interpolationswert von 0-1) mit einem konstanten Inkrement die Punkte nicht gleichmäßig verteilt sind. Der Abstand entlang der Kurve ist kleiner, wenn die Kurve eine Kurve macht, und länger, wenn die Kurve gerade ist.
Wie platziere ich Punkte gleichmäßig entlang einer Bezierkurve?
interpolation
curves
beziers
Foaly
quelle
quelle
t
, beispielsweise 100 Schritte erhöhen und die Abstände zwischen den resultierenden Punkten messen. Interpolieren Sie dann wie gewünscht entlang dieser Polylinie.Antworten:
Es ist eher eine mathematische Frage. Eine Bezierkurve hat also die folgende Formel , sowohl in der
x
als auch in dery
Komponente.Die
t
entlang einer Kurve zurückgelegte Längegamma
ist gegeben durch:Es gibt keine vom Menschen beschreibbare Lösung für das Integral, daher müssen Sie sich annähern.
Ersetzen der
gamma(t)
durch den AusdruckB(t)
der Länge zu erhaltenlength_B
durch reistet
entlang der Bezier - Segment. Nehmen wir an, es reist von0
nachL
.Wählen Sie nun
n
Werte zwischen0
undL
, die den gleichmäßig verteilten Punkten entsprechen. Zum Beispiel Längen des Formularsk*L/n
fürk
von0
bisn
.Jetzt müssen Sie die Funktion umkehren
length_B
, damit Sie diet
Rückseite aus der Länge berechnen könnenl
. Es ist ziemlich viel Mathe und ich bin verdammt faul, versuche es selbst. Wenn Sie nicht können, können Sie zum Mathe-Stapelaustausch gehen . Für eine vollständigere Antwort können Sie trotzdem dorthin gehen.Sobald Sie diese Umkehrfunktion
length_B
(oder eine vernünftige Annäherung) haben, ist Ihre Verarbeitung recht einfach.l[k]
mit einem bestimmten Pfadabstand vom Ursprung(P0_x,P1_x)
.t[k]
Verwendunglength_B_inverse
.(B_x(t[k]),B_y(t[k]))
.quelle
Nun, es ist einige Zeit her ...
Aber ich konnte dieses Problem endlich lösen!
Alles, was Sie brauchen, finden Sie in diesem Beitrag: Bewegen von Schiffen zwischen zwei Planeten entlang eines Bezier, wobei einige Gleichungen für die Beschleunigung fehlen
quelle
Um das zu erweitern, was Marco gesagt hat, besteht eine übliche Technik darin, die Kurve in viel kleineren Schritten als den Schritten fester Länge, die Sie ausführen möchten, entlangzugehen und den resultierenden Ausgabepunkt (und möglicherweise die Entfernung?) In einer Tabelle zu speichern.
Anschließend gehen Sie die Tabelle durch und verwerfen alle Einträge mit Ausnahme der Punkte, die den ganzzahligen Vielfachen der Entfernungen, die Sie zurücklegen möchten, am nächsten liegen.
Dann bleibt Ihnen eine Tabelle übrig, die Sie sehr schnell direkt zur Laufzeit indizieren können. Wenn Sie zu der Stelle gehen möchten, die fünfmal so groß ist wie Ihre Entfernung, sehen Sie in Ihrer Tabelle nach Index [5].
Beachten Sie, dass Sie die beiden Schritte in einem Schritt ausführen und die zusätzlichen Elemente zunächst nicht in der Tabelle speichern können. Es ist jedoch einfacher, sie in zwei Schritten zu visualisieren und zu verstehen.
Ich habe einmal eine Technik gesehen, mit der dies tatsächlich im laufenden Betrieb berechnet werden kann, ohne eine Tabelle vorab zu berechnen (es wurde auch keine Iteration / Wurzelfindung verwendet!), Aber leider kann ich mich überhaupt nicht an die Details erinnern):
Wenn ich mich daran erinnere oder es finde, werde ich die Infos posten!
quelle
Schritt 1 - Generieren Sie N + 1 Punkte, indem Sie die Kurve in Schritten von 1 / N interpolieren. N sollte groß genug für gute visuelle Ergebnisse sein, aber klein genug, um leicht berechnet zu werden. Ein Wert von 50 sollte in den meisten Situationen in Ordnung sein, sollte jedoch auf Ihren speziellen Fall abgestimmt sein. Ich werde dies die "interpolierten Punkte" nennen.
Alternativ können Sie eine kurze Liste von Segmenten erstellen und jedes Segment rekursiv aufteilen, das länger als die gewünschte maximale Segmentlänge ist (anfangs sollten Sie mindestens vier Segmente generieren, um S-Kurven zu berücksichtigen, bei denen der Anfang sehr nahe am Ende liegt).
Schritt 2 - "Gehen Sie die Linie" mit den interpolierten Punkten und dem gewünschten Abstand zwischen den einzelnen Punkten.
Ich lasse es hier meinen Unity-Code:
quelle
Hier ist ein Algorithmus, der ziemlich gute Ergebnisse liefert:
quelle