Mathematik online lernen im Mathe-Forum. Nachhilfe online
Startseite » Forum » Punkt in einer Bezier-Kurve

Punkt in einer Bezier-Kurve

Universität / Fachhochschule

Tags: Bezier, Kurve, Punkt

 
Antworten Neue Frage stellen Im Forum suchen
Neue Frage
geforcefan

geforcefan aktiv_icon

16:38 Uhr, 15.10.2012

Antworten
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:
 
Online-Nachhilfe in Mathematik
Antwort
McMannus

McMannus aktiv_icon

17:22 Uhr, 15.10.2012

Antworten
Hab ich das richtig verstanden: Du hast die Gesamtlänge deines Kurvensegmentes und das Kontrollpolygon und möchtest die Koordinaten des Punktes, der bei 1m Länge liegt?
geforcefan

geforcefan aktiv_icon

17:23 Uhr, 15.10.2012

Antworten
Genau so sieht es aus :-)
Antwort
McMannus

McMannus aktiv_icon

17:34 Uhr, 15.10.2012

Antworten
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 m 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

p(t)=p0(1-t)3+p13(1-t)2t+p23(1-t)t2+p3t3

Für t (Durchlaufvariable) musst du nun deinen gewünschten Weg bezogen auf die Gesamtlänge einsetzen, da sich t typischerweise zwischen 0 und 1 bewegt.
Für p0,...,p3 sind die Vektoren der Punkte einzutragen, also bekommst du für xyz-Komponente jeweils einen Wert, der der Koordinate entspricht.
geforcefan

geforcefan aktiv_icon

17:38 Uhr, 15.10.2012

Antworten
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 t (Durchlaufvariable) musst du nun deinen gewünschten Weg bezogen auf die Gesamtlänge einsetzen, da sich t 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 :-)
Antwort
McMannus

McMannus aktiv_icon

17:46 Uhr, 15.10.2012

Antworten
Wenn du das ganze implementieren willst, dann würde ich dir noch eine hilfreiche Eigenschaft der Bernsteinpolynome empfehlen:

Bkn(t)=tBk-1n-1(t)+(1-t)Bkn-1(t)

Damit lassen sich Bernsteinpolynome rekursiv auswerten, sodass du mit Caching wesentlich bessere Laufzeiten bekommst!
geforcefan

geforcefan aktiv_icon

18:02 Uhr, 15.10.2012

Antworten
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 t=0.5 (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 t=0.5 auch am richten Position, nämlich bei wirklich in der Mitte der Kurve.

hmmm?

Edit:

Die Umsetzung (pow bedeutet x hoch n):

b0= pow(1.0 -t,3)
b1=3 pow(1.0 -t,2)t
b2=3(1.0-t) pow(t, 2)
b3= pow(t, 3)

x=(b0 Punk1.x) +(b1 Punkt2.x) +(b2 Punkt3.x) +(b3 Punkt3.x)
y=(b0 Punk1.y) +(b1 Punkt2.y) +(b2 Punkt3.y) +(b3 Punkt3.y)
z=(b0 Punk1.z) +(b1 Punkt2.z) +(b2 Punkt3.z) +(b3 Punkt3.z)
Antwort
McMannus

McMannus aktiv_icon

18:12 Uhr, 15.10.2012

Antworten
Okay, nun verstehe ich das Problem...Dann musst du in einer von dir vorgegebenen Auflösung t von 0 loslaufen lassen und die Bogenlänge der Kurve berechnen bis zu dem Punkt an dem deine gewünscht Bogenlänge von 0.5 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.
geforcefan

geforcefan aktiv_icon

18:14 Uhr, 15.10.2012

Antworten
Genau das mache ich schon, stell dir mal vor wie die CPU bei 100% Belastung (je nach Unterteilungspräsizion) aussieht :-)
Lässt sich auch nicht mehr in Echtzeit berechnen.

Ich dachte, es gibt bestimmt eine andere Methode.
Antwort
McMannus

McMannus aktiv_icon

18:33 Uhr, 15.10.2012

Antworten
Über wie viele Punkte sprechen wir denn bei der Eingabe?
geforcefan

geforcefan aktiv_icon

18:50 Uhr, 15.10.2012

Antworten
Wir reden von ca. min. 200-300 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:



Bildschirmfoto 2012-10-15 um 18.47.08
Frage beantwortet
geforcefan

geforcefan aktiv_icon

13:27 Uhr, 18.10.2012

Antworten
So es gibt doch ein nährungs Formel, um den den längen bezogenen t punkt auf einem normalen t punkt "konvertiert" (wobei die Variabel L die Länge der Bezier-Kurve ist, und die Variabel D der Punkt in Längeneinheit ist, wofür die richtige t punkt raus gefunden werden kann:

H11=P1-P0
H21=P3-P2
H1=13H11.x2+H11.y2+H11.z2
H2=13H21.x2+H21.y2+H21.z2

H3=((2(P0.x2))+(2(P0.y2))+(2(P0.z2))-
(6P0.xP1.x)-(6P0.yP1.y)-(6P0.zP1.z)+
(4(P1.x2))+(4(P1.y2))+(4(P1.z2))+
(2P0.xP2.x)+(2P0.yP2.y)+(2P0.zP2.z)-
(2P1.xP2.x)-(2P1.yP2.y)-(2P1.zP2.z))H149

H4=-((2(P3.x2))+(2(P3.y2))+(2(P3.z2))-
(6P2.xP3.x)-(6P2.yP3.y)-(6P2.zP3.z)+
(4(P2.x2))+(4(P2.y2))+(4(P2.z2))+
(2P1.xP3.x)+(2P1.yP3.y)+(2P1.zP3.z)-
(2P1.xP2.x)-(2P1.yP2.y)-(2P1.zP2.z))H249

t(d)=d(H1L(L-d)2+d(L(3-H2(L-d))-2d))L3

Und damit jetzt die Koordinaten:

b0=(1-t)3
b1=3(1-t)2t
b2=3(1-t)t2
b3=t3

x=b0P0.x+b1P1.x+b2P2.x+b3P3.x
y=b0P0.y+b1P1.y+b2P2.y+b3P3.y
z=b0P0.z+b1P1.z+b2P2.z+b3P3.z


mfg Ercan