Siehe auch: gleiche Frage zu Math.SE
Wie finde ich die Bogenlänge einer Bézier-Kurve? Beispielsweise hat eine lineare Bezier-Kurve die Länge:
length = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));
Aber was ist mit quadratischen, kubischen oder n-Grad-Bezier-Kurven?
(Mein Ziel war es, vorher eine Abtastauflösung zu schätzen, damit ich keine Zeit verschwenden muss, um zu prüfen, ob der nächste Punkt den vorherigen Punkt berührt.)
mathematics
graphics
beziers
heuristics
Mateen Ulhaq
quelle
quelle
Antworten:
Eine einfache Möglichkeit für kubische Beziers besteht darin, die Kurve in N Segmente aufzuteilen und die Segmentlängen zu summieren.
Sobald Sie jedoch nur die Länge eines Teils der Kurve benötigen (z. B. bis zu einem Punkt, der 30% der Länge entspricht), kommt die Parametrierung der Bogenlänge zum Tragen. Ich habe eine ziemlich lange Antwort auf eine meiner Fragen zu Béziers mit einfachem Beispielcode gepostet .
quelle
1.0/t
(calledresolution
) einstellen kannst , also ist das für "Realtime" (was bestenfalls 10fps auf dem langsamen NXT ist). Bei jeder Iteration wirdt += resolution
ein neuer Punkt / eine neue Linie gezeichnet. Trotzdem danke für die Idee.Während ich mit den bereits erhaltenen Antworten einverstanden bin, möchte ich einen einfachen, aber leistungsstarken Näherungsmechanismus hinzufügen, den Sie für Bézier-Kurven mit beliebigem Grad verwenden können: Sie unterteilen die Kurve kontinuierlich mit der Unterteilung de Casteljau bis zum maximalen Abstand der Kontrollpunkte einer Unterkurve zur Grundlinie der Unterkurve liegt unter einem konstanten Epsilon . In diesem Fall kann die Unterkurve durch ihre Grundlinie angenähert werden.
Tatsächlich glaube ich, dass dies der Ansatz ist, der normalerweise angewendet wird, wenn ein Grafiksubsystem eine Bézier-Kurve zeichnen muss. Aber zitieren Sie mich nicht dazu, ich habe im Moment keine Referenzen zur Hand.
In der Praxis wird es so aussehen: (außer die Sprache ist irrelevant)
quelle
Bogenlängen für Bezier-Kurven sind nur für lineare und quadratische geschlossen. Für Cubics kann keine geschlossene Lösung garantiert werden. Der Grund dafür ist, dass die Bogenlänge durch ein Radikalintegral definiert ist, für das nur Polynome 2. Grades geschlossen sind.
Nur als Referenz: Die Länge eines quadratischen Beziers für die Punkte (a, p) (b, q) und (c, r) ist
Wobei LN der natürliche Logarithmus ist und ^ die Potenz und √ die Quadratwurzel bezeichnet.
Daher sollte es einfacher und billiger sein, den Bogen durch eine andere Regel, wie ein Polygon oder ein Integrationsschema wie die Simpson-Regel, zu approximieren, da die Quadratwurzeln der LN teure Operationen sind.
quelle
Ich habe den Längenausdruck in geschlossener Form für einen 3-Punkt-Bezier (unten) erarbeitet. Ich habe nicht versucht, ein geschlossenes Formular für 4+ Punkte zu erstellen. Dies wäre höchstwahrscheinlich schwierig oder kompliziert darzustellen und zu handhaben. Eine numerische Approximationstechnik wie ein Runge-Kutta-Integrationsalgorithmus funktioniert jedoch recht gut, wenn die Integration unter Verwendung der Bogenlängenformel erfolgt . Meine Fragen und Antworten zu RK45 unter MSE können bei der Implementierung von RK45 hilfreich sein.
Hier ist ein Java-Code für die Bogenlänge eines 3-Punkt-Beziers mit Punkten
a
,b
undc
.quelle