Günstige Möglichkeit der Berechnung von kubischen Bézier-Länge
Eine analytische Lösung für kubische bezier-Länge
scheint nicht zu existieren, aber es bedeutet nicht, dass
Codierung einer günstigen Lösung nicht vorhanden ist. Durch billige ich meine so etwas wie im Bereich von 50-100 ns (oder weniger).
Weiss einer etwas? Vielleicht in zwei Kategorien:
1) weniger Fehler wie 1%, aber langsamer code.
2) mehr Fehler, wie einer um 20%, aber schneller?
Scannte ich über google ein bisschen, aber es funktioniert nicht
finden Sie etwas, das aussieht wie eine schöne Lösung. Nur so etwas wie Gefälle auf N Liniensegmente
und die Summe der N sqrt - zu langsam für mehr Präzision,
und wahrscheinlich zu ungenau für 2 oder 3 Segmente.
Gibt es was besseres?
- Siehe stackoverflow.com/a/28764614/107090.
- viel zu schwer zu bekommen, Antwort von dort (falls es die Antwort hier an alle, 99% wahrscheinlich nicht) ich brauche die direkte Antwort, die in c oder pseudocode nicht komplexe mathematische Papiere sehr schwer zu Lesen
- Warum tun Sie es erwarten, werden code leicht verfügbar? Wie oft, denken Sie, jemand muss wissen, die genaue Länge einer Bezier-Kurve? Wenn Sie müssen etwas tun, das nie zuvor getan wurde, erwarten Sie, um einige Arbeit zu tun.
- viele Menschen haben das Bedürfnis, dass.. (ich brauche genau, aber approximete) .. es ist erforderlich, beim zeichnen von bezier-Punkte in der for-Schleife, um zu wissen, wie viele dieser Punkte, die Sie benötigen, um zu zeichnen.. also ich Stand dieser questi0n, ich Dünn, SO dass ein Platz für solche Fragen
- Auf dieser Seite ist es mehr relevant für post-code, der nicht richtig funktioniert, ist zu Fragen, warum. Wenn Sie code haben, der funktioniert, aber Sie möchten, dass ein effizienter Algorithmus, die Sie könnten versuchen, Stack Exchange.
- Zu wissen, die Länge der Kurve ist nicht zu helfen Sie wissen, wie viele Punkte zu zeichnen.
- aproximation nicht die genaue Länge.. geht.. nutzbar ist (neben Billig Rezept für Sie nutzbar sein könnte, die von vielen anderen Fällen ) ich benutze es manchmal für Bahnen etc, seine gut zu wissen, die Länge der gegebenen Trajektorie und ich muss es evtl. schnell
- als Autor von pomax.github.com/bezierinfo: die wichtigste Frage hier ist, was Sie denken, Sie brauchen, dass die Angleichung -nicht korrekt - arclength, denn der bestimmt, was Fehlergrenzen akzeptabel sind, und die approximation der shortcuts kann man sogar nehmen, ohne dabei die Informationen, die Sie benötigt
- handeln vielleicht als reality-check, die meisten Vektor-illustration-software hat Bogenlänge Berechnung gebacken. Alles, was machen muss, gepunkteten oder gestrichelten Kurven, zum Beispiel haben einige form der Bogenlänge Berechnung implementiert. Es ist weit mehr gemeinsam, als Ihre Frage, schlage vor, Sie glauben, es ist.
- Du bist nicht gehen, um eine einfache Lösung für dieses. Gute Schätzungen beinhalten numerische Methoden, erfordern einige mathematische Reife, um zu verstehen. Ihre Wahl ist, die Herausforderung anzunehmen und zu wachsen Ihre Fähigkeiten, oder beauftragen Sie jemanden, der über diese Fähigkeiten verfügt.
- wie ich schon schrieb, ich brauche so etwas 1-2% der Fehler in genauer Fall und anout 10-20 % in einem anderen - dies sollte nicht so verdammt schwer, ich brauche nur etwas besser als lame hinzufügen lineare Segmente Länge vielleicht
- wenn Sie nicht wissen, die Lösung, die Sie wirklich haben keine Grundlage zu behaupten, "das soll nicht sein, so verdammt schwer," in den geringsten. Immer die echte Bogenlänge einer kubischen Kurve ist nicht nur "hart", es gibt buchstäblich keinen Weg, um zu berechnen, es generisch. Es ist unmöglich, und so berechnen wir es mit numerischen Methoden. Abflachung auf der anderen Seite, ist super einfach, so dass die Tatsache, dass Sie call-Länge-Berechnung mit einer abgeflachten Kurve hart ist schon komisch: es ist schnell, es ist unrichtig, sondern willkürlich Fehler (brauchen mehr Präzision? verwenden Sie mehr Segmente), was zu schwer ist?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere Möglichkeit ist die Abschätzung der Bogenlänge als der Durchschnitt zwischen dem Akkord und der Steuerung net. In der Praxis:
Kann man dann rekursiv teilen Sie Ihre spline-segment in zwei Segmente und Berechnung der Bogenlänge bis zu Konvergenz. Getestet habe ich selbst und es tatsächlich konvergiert ziemlich schnell. Ich habe die Idee von diesem forum.
Einfachste Algorithmus: glätten Sie die Kurve und Aufzeichnung der euklidischen Distanz. So lange, wie Sie wollen, eine Ungefähre Bogenlänge, diese Lösung ist schnell und Billig. Angesichts Ihrer Kurve zu koordinieren LUT—Sie reden über Geschwindigkeit, so dass ich annehme, dass Sie diese verwenden, und nicht ständig neu berechnen, die Koordinaten—es ist eine einfache for-Schleife mit einer Bilanz. In generischem code, mit
dist
Funktion berechnet die euklidische Distanz zwischen zwei Punkten:Getan.
arclength
jetzt ist die Ungefähre Bogenlänge auf der Basis der maximalen Anzahl der Segmente, die Sie bilden können, in der Kurve, basierend auf Ihrer LUT. Müssen die Dinge schneller und mit einem größeren möglichen Fehler? Steuern des Segments zählen.Dies ist so ziemlich die einfachste mögliche Algorithmus, der noch Werte generiert, die auch nur annähernd den wahren Bogenlänge. Um alles besser, du gehst zu haben, um die Verwendung teurer numerische Ansätze (wie die Legendre-Gauss-Quadratur-Technik).
Wenn du wissen willst, warum, schlug die Bogenlänge Abschnitt von "A Primer on Bézier-Kurven".
Habe ich die geschlossene form Ausdruck der Länge für eine 3-Punkt-Bezier (unten). Ich habe nicht versucht, zu arbeiten, eine geschlossene form für 4+ Punkte. Dies würde höchstwahrscheinlich zu schwierig oder kompliziert, zu repräsentieren und zu verarbeiten. Jedoch, eine numerische approximation Verfahren wie Runge-Kutta-integration-Algorithmus (siehe mein Q&A hier für details) würde ganz gut funktionieren, durch die Integration mit der Bogenlänge Formel.
Hier einige Java-code für die Bogenlänge einer 3-Punkt-Kurve, Punkte
a
,b
, undc
.in meinem Fall eine schnelle und Gültiger Ansatz ist. (Neu geschrieben in c# für Unity3d)
erste von zunächst sollten Sie Verstehen den Algorithmus in Bézier,
Wenn ich die Codierung ein Programm von c#, Das war voll von Grafik-material, das ich verwendet, beziers und die viele Zeit, die ich hatte, um einen Punkt zu finden cordinate in Bézier , whic es scheinen imposisble in den ersten Blick. also das, was ich Tue, zu schreiben, das Kubische Bézier-Funktion in mein Kostüm math-Klasse, die war in meinem Projekt. so möchte ich den code mit Euch.
wie Sie oben sehen, ist dies der Weg einer bezier-Funktion arbeiten und Sie ziehen die gleiche Bezier wie Microsoft Bézier-Funktion tun( ich habe es testen). Sie können machen es noch genauer durch die Inkrementierung der array-Größe und-Zähler der Größe oder zeichnen elipse statt line& ... . Alle von Ihnen abhängen, die Sie brauchen und das Niveau der Genauigkeit, die Sie brauchen, und ... .
Rückkehr zum Hauptziel ,die Frage ist, wie calc die Länge???
nun, Die Antwort ist wir Haben Tonnen von Punkt und jeder von Ihnen hat ein x coorinat-und y-Koordinaten, die denken Sie daran, uns eine Dreieck-Form & vor allem Eine RightTriabgle Form. wenn wir also Punkt p1 & p2 , können wir berechnen, den Abstand von Ihnen als RightTriangle Akkord. wie wir mehr aus unserem Matheunterricht in der Schule, im ABC-Dreieck Typ RightTriangle -, Akkord-Länge ist -> Sqrt(der Winkel ist FrontCostalLenght ^ 2 + Winkel ist SideCostalLeghth ^ 2);
und es ist diese Beziehung zwischen allen Punkten, die wir calc die Länge zwischen aktuellen Punkt und dem letzten Punkt vor dem aktuellen Punkt(exmp p[i - 1] & p[i]) und speichern die Summe von Ihnen allen in einer Variablen. können zeigen, dass es im code Balg
wenn Sie möchten, um eine schnellere Berechnung brauchen nur zu reduzieren, px & py array-Länge und loob zählen.
Wir können auch verringern Speicherbedarf durch die Reduzierung von px und py der array-Länge auf 1 oder einen einfachen double-Variablen, sondern weil der Bedingte situation Passiert, die zu einer Erhöhung Unserer Big O habe ich es nicht getan.
Hoffe es hat dir geholfen, so viel. wenn noch weitere Fragen haben einfach Fragen.
Mit Besten GRÜßEN, Herr - der islamischen Republik Iran.