Ich muss die Y-Koordinate eines bestimmten Punktes der Bezier-Kurve in der Leinwand herausfinden. Weißt du, wie man es herausfinden kann? Danke
Mit dem Algorithmus von de Casteljau können Sie die Koordinaten x und y einer Bezier-Kurve für jedes t, den Prozentsatz oder den Interpolationsschritt finden. Also würde ein t von .1 Ihnen das x und y bei 10% der Kurve von Anfang an geben. Ein t von 0,9 wäre von Anfang an 90% und so weiter.
In unserem kubischen Bezier gibt es p0 (Punkt 0), cp0 (Kontrollpunkt 0), cp1 (Kontrollpunkt 1) und p1 (Punkt 1).
Im ersten Schritt des Algorithmus zeichnen wir eine Linie, die p0 und cp0 verbindet, eine weitere Linie, die cp0 und cp1 verbindet, und eine weitere, die cp1 und p1 verbindet. Dann werden wir für alle 3 dieser Zeilen den Punkt auf ihnen finden, der t% von Anfang an ist.
Ich rufe die Punkte wie folgt an:
cp1 - & gt; p1 = C
%Vor%Der zweite Schritt ist dem ersten sehr ähnlich. In der ersten haben wir die vier Punkte mit Linien verbunden und dann 3 neue Punkte auf ihnen gefunden. In diesem Schritt verbinden wir diese 3 Punkte mit Linien und finden 2 neue Punkte auf ihnen. Ich werde diese zwei neuen Punkte D und E nennen.
%Vor%Schließlich können wir diese letzten zwei Punkte mit einer anderen Linie verbinden und den letzten Punkt darauf finden, der uns den Punkt auf der Bezier-Kurve für dieses t geben wird. Ich werde diesen Punkt P nennen.
%Vor%Da haben wir jetzt die X- und Y-Koordinate eines Punktes auf der Bezier, der von Anfang an t% ist. Ich werde bald ein paar Bilder hinzufügen.
Ich habe versucht, dasselbe zu finden, und ich denke, ich habe es zumindest für quadratische Bezier-Kurven gelöst, bei denen es sich um Bezier-Kurven mit nur einem einzigen Kontrollpunkt handelt.
Mathematische Erklärung
Die mathematische Formel für eine quadratische Bezierkurve lautet:
Wenn 'X' das Ergebnis ist, ist 'A' die Position des Startpunkts, 'B' der Kontrollpunkt und 'C' der Endpunkt.
't' ist eine Zahl zwischen 0 und 1, die angibt, welcher Punkt in der Zeile berechnet werden soll. 0 steht für den Startpunkt, 1 für den Endpunkt und 0,5 für den Mittelpunkt der Kurve.
Diese Funktion wird zur Berechnung der X- und Y-Koordinaten eines Punktes auf der Linie verwendet. Wenn Sie X berechnen möchten, geben Sie einfach die X-Koordinate der Punkte A, B und C ein.
Um nun das Y zu bestimmen, das zum X gehört, müssen wir das 't' für die X-Koordinate bestimmen.
Wir können die gleiche Bezier-Gleichung in quadratischer Form schreiben ():
Dies erlaubt uns, die quadratische Formel zu verwenden, um die Werte von 't' abzuleiten, die die Gleichung lösen. Die quadratische Formel ist eigentlich 2 Formeln.
und
Die resultierende Formel lautet:
und
Codelösung
Wir können das im Code wie folgt beschreiben:
%Vor%Nun habe ich das nicht getestet, und die Funktion prüft nicht, ob es tatsächlich irgendwelche gültigen Punkte gibt, also gibt es definitiv Werte, für die es eine Ausnahme auslöst. Stellen Sie sicher, dass Sie nach "dividiere durch 0" und "Quadratwurzel aus Zahlen unter 0" suchen.
Probleme mit dieser Lösung
Ein großes Problem mit dieser Gleichung ist, dass es nur für quadratische Bezierkurven funktioniert, während die meisten Bezierkurven tatsächlich kubisch sind. Ich habe versucht, einen ähnlichen Weg zu finden, um die kubische Version dieses Problems zu lösen, leider ist das eine Größenordnung schwieriger. Die einzige Formel, die ich zum Lösen von kubischen Gleichungen finden konnte, finden Sie hier Kubische Funktion . Diese Formel enthält imaginäre Zahlen und ich habe keine Ahnung, was ich damit anfangen soll.
Ein weiteres Problem ist, dass es für Bezierkurven mit 4 Kontrollpunkten oder mehr keine Möglichkeit gibt, die Gleichung überhaupt zu lösen.
Fazit
Am Ende ist es am besten, die Bezier-Kurve einfach in Geraden zu konvertieren, die unendlich einfacher zu berechnen sind.
Die Gleichung für einen Kreis lautet:
(x-h) ^ 2 + (y-k) ^ 2 = r ^ 2 wobei h, k die Koordinaten x, y für das Zentrum sind. Die Gleichung für y wäre also y = sqrt (r ^ 2 - (x-h) ^ 2) + k. Die meisten Sprachen sind mit einem Math-Paket ausgestattet, also nehme ich an, Sie können eine Art Math.sqrt(..)
und Math.pow(..)
Jeder korrigiert mich, wenn meine Mathematik aus ist.
@DerekR: Obwohl das, was Sie hier vorgestellt haben, klar und wahrscheinlich hilfreich für viele ist, denke ich, dass die Antwort und alle folgenden Kommentare von Ihnen und immo das Problem nicht ansprechen.
(Meine Mathematik stinkt und ich habe versucht, das gleiche Problem zu lösen, damit ich die Folgekommentare nicht verstehe.)
Ich denke, die Frage ist: Wenn man die X-, Y-Koordinaten für die zwei Endpunkte und die zwei Kontrollpunkte kennt und annimmt, dass der Bereich 0 zu 1 ist, dann ist Y gegeben, was ist Y?
Ich bin neu und kann noch keine Bilder posten, aber Sie können die Kurve unter duck.cc/images/beziercurve_findY.png
sehenTags und Links canvas point bezier coordinate curve