![]() |
---|
Hallo Zusammen, Zurzeit habe ich das Problem, einen bestimmten Punkt in einer Bezier-Kurve zu finden. Ich habe eine Bezier-Kurve mit 4 Kontrollpunkten. Ich möchte eigentlich ganz Simpel einen Punkt, nach gegebenem "Offset" finden. Zum Beispiel: Die XYZ Koordinaten nach 1 meter auf einer Bezier kurve. Mein Ziel ist es am Ende Gleichmäßige Unterteilung zu verschaffen. mfg Ercan Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert): "Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen." |
Hierzu passend bei OnlineMathe: Online-Übungen (Übungsaufgaben) bei unterricht.de: |
![]() |
![]() |
Hab ich das richtig verstanden: Du hast die Gesamtlänge deines Kurvensegmentes und das Kontrollpolygon und möchtest die Koordinaten des Punktes, der bei Länge liegt? |
![]() |
Genau so sieht es aus :-) |
![]() |
Um dir das Ganze graphisch vor Augen zu führen, solltest du dir den Casteljau-Algorithmus anschauen, der aus Kontrollpolygonen die Punkte des Bezier-Kurvensegmentes für die Werte einer Durchlaufvariable deinem Fall der Weg in von 0 bis Gesamtsegmentlänge) berechnet. http://www.cs.hs-rm.de/~linn/techVisu/tracking/decasteljau.htm Hier wird das beispielhaft vollzogen. Die Berechnung erfolgt dabei mittels den sog. Bernsteinpolynomen. Hergeleitet für den Fall von kubischen Bernsteinpolynomen ist das ganze hier: http//www2.cs.uni-paderborn.de/cs/info-cd/vorlesungen/domik/computergrafik/node78.htm EDIT: Die relevante Formel ist Für (Durchlaufvariable) musst du nun deinen gewünschten Weg bezogen auf die Gesamtlänge einsetzen, da sich typischerweise zwischen 0 und 1 bewegt. Für sind die Vektoren der Punkte einzutragen, also bekommst du für xyz-Komponente jeweils einen Wert, der der Koordinate entspricht. |
![]() |
Zitat: "Die Berechnung erfolgt dabei mittels den sog. Bernsteinpolynomen. Hergeleitet für den Fall von kubischen Bernsteinpolynomen ist das ganze hier: http//www2.cs.uni-paderborn.de/cs/info-cd/vorlesungen/domik/computergrafik/node78.htm Für (Durchlaufvariable) musst du nun deinen gewünschten Weg bezogen auf die Gesamtlänge einsetzen, da sich typischerweise zwischen 0 und 1 bewegt." Genau das ist was ich suche. Mal sehen ob ich das jetzt in einem Computer Programm implementieren kann. Wenn ich das nicht hinbekommen, werde ich mich noch mal melden. Ich bedanke mich jetzt schonmal :-) Ich werde berichten ob das geklappt hat. Dankeschön :-) |
![]() |
Wenn du das ganze implementieren willst, dann würde ich dir noch eine hilfreiche Eigenschaft der Bernsteinpolynome empfehlen: Damit lassen sich Bernsteinpolynome rekursiv auswerten, sodass du mit Caching wesentlich bessere Laufzeiten bekommst! |
![]() |
Hab mich doch zu früh gefreut. Den Formel den du mir gegeben hast, hatte ich schon so umgesetzt gehabt. Ich kriege die falsche position. Ich habe eben mir einen Test gemacht, indem ich für eine Bezier Kurve, die Position bei (bezogen auf die Gesamtlänge) ermittelt habe. Das was ich bekommen haben, ich definitiv nicht auf die Gesamtlänge bezogen. Jedoch, wenn meine Controllpunkte so angelegt sind, das die Kurve linear wird, dann ist auch am richten Position, nämlich bei wirklich in der Mitte der Kurve. hmmm? Edit: Die Umsetzung (pow bedeutet hoch pow(1.0 pow(1.0 pow(t, pow(t, Punk1.x) Punkt2.x) Punkt3.x) Punkt3.x) Punk1.y) Punkt2.y) Punkt3.y) Punkt3.y) Punk1.z) Punkt2.z) Punkt3.z) Punkt3.z) |
![]() |
Okay, nun verstehe ich das Problem...Dann musst du in einer von dir vorgegebenen Auflösung von 0 loslaufen lassen und die Bogenlänge der Kurve berechnen bis zu dem Punkt an dem deine gewünscht Bogenlänge von erreicht ist. Die Genauigkeit ist natürlich abhängig von der Auflösung und dem Verfahren, da Integrale im Rechner meistens durch Näherungen ersetzt werden. |
![]() |
Genau das mache ich schon, stell dir mal vor wie die CPU bei Belastung (je nach Unterteilungspräsizion) aussieht :-) Lässt sich auch nicht mehr in Echtzeit berechnen. Ich dachte, es gibt bestimmt eine andere Methode. |
![]() |
Über wie viele Punkte sprechen wir denn bei der Eingabe? |
![]() |
Wir reden von ca. . einzelne Bezier Kurven mit regelmäßgem Unterteilung. Ich erstelle damit Achterbahn Strecken (mit Bezier-Kurven), und dabei haben Achterbahn-Gleise Querverbindungen. Und stell dir mal vor wie viele Querverbindungen es gibt: |
![]() |
So es gibt doch ein nährungs Formel, um den den längen bezogenen punkt auf einem normalen punkt "konvertiert" (wobei die Variabel die Länge der Bezier-Kurve ist, und die Variabel der Punkt in Längeneinheit ist, wofür die richtige punkt raus gefunden werden kann: Und damit jetzt die Koordinaten: mfg Ercan |