Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

Bezier
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Mathe-Forum -> Bezier
 
Autor Nachricht
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 06 Jun 2005 - 11:01:30    Titel: Bezier

Aloha!

Beschäftige mich seit kurzem mit dem berechnen von Freiformkurven,
also Beziers. Ich nutze - da ich ein Programm schreib - den DeCasteljau-
Algorothmus um die einzellnen Polynome rekursiv zu berechnen.

Momentan arbeite ich an einer Art Graph auf Bezier-Basis, indem man
eine frei gestaltbare Kurve mittels der Ankerpunkte formen kann und
das Programm diesen Graph dann auslesen kann. Soweit klappt das
auch prima.

Eine Bezier-Kurve bzw. dessen Polynome berechnen sich ja durch die
gewichteten Mittel seiner Ankerpunkte und des Parameters t [0-1].
Also habe ich mir eine Funktion zur linearen Interpolation geschrieben
und berechne den Kurvenverlauf rekursiv.

Mein Problem liegt jetzt darin, die erstellte Kurve nach x und nicht nach t
zu berechnen. Sprich um zu jedem Wert auf der X-Achse des Graphs auch
den entsprechenden Wert auf der Y-Achse zuzuordnen.

Ist dies möglich ? Hat jemand eine Idee dazu ?

Ich hatte die Idee, dies - wie die Kurve - rekursiv zu berechnen. Die
Funktion zur linearen Interpolation konnt ich schon umstellen und testen.
Jetz weiß ich aber nicht weiter, wie ich diese Rekursiv zum berechnen
nutzen kann. Im Grunde stehen mir dazu ja nur die Ankerpunkte der
Kurve zur Verfügung.

MfG sHo
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 06 Jun 2005 - 11:24:13    Titel:

Zitat:
Eine Bezier-Kurve bzw. dessen Polynome berechnen sich ja durch die gewichteten Mittel seiner Ankerpunkte und des Parameters t [0-1].


Das ist eine sehr sehr abstrakte Beschreibung davon. Meinen Wir die selben "Bezier-Kuren"?

Zitat:
Also habe ich mir eine Funktion zur linearen Interpolation geschrieben und berechne den Kurvenverlauf rekursiv.


Das hört sich sehr nach einem Overkill an. Schreibe doch deine Rekursionsformeln hin.

Insgesamt ist die Aufgabenstellung nicht ganz klar.

P.S. Es wurde schon oft über Bezier-Kurven hier diskutiert. Schau mal da rein einfach nur zum Vergleich.

http://www.uni-protokolle.de/foren/viewtopic.php?t=17503&highlight=bezier
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 06 Jun 2005 - 12:11:11    Titel:

Ich glaube wir beide reden von der selben Bezier-Kurve, nur bin ich
mathematisch da auch noch nicht so versiert. Vielleicht hab ichs falsch
beschrieben.

Meine Formel zur berechnung ist diese : P(t) = P0 + (P1 - P0) * t

Diese berechnet mir zwar nur die strecke zwischen zwei Punkten, mit Hilfe
der Rekursion kann ich aber die Bezier-Kurve für beliebig viele Punkte berechnen.

.. im Programm schaut das bei mir so aus :
Code:

function lerp(p0, p1, t) {
   var x = p0._x + ( (p1._x - p0._x) * t);
   var y = p0._y + ( (p1._y - p0._y) * t);
   return { _x:x, _y:y };
}


function rlerp( pts, t ) {
   if( pts.length > 2 ) {
      var tmp = [];
      for( var i=0; i<pts.length-1; i++ ) tmp.push( lerp( [pts[i], pts[i+1]], t) );
      return lerp( tmp, t );
   } else {
      return lerp( p[0], p[1], t );
   }
}


Die Funktion rlerp berechnet mir nur den rekursiven Lauf aus einem Array
von Punkten (pts) und dem Parameter t. Die Grundrechnung findet in lerp
statt.

Erst hatte ich mit den Formel für die kubische Bezierkurve :

P(t) = P0 * (1-t)^3 + P1 * 3(1-t) ^2 * t + P2 * 3(1-t) * t^2 + P3 * t^3

gerechnet, möcht es aber lieber in der Rekursion belassen, ist glaub ich
der schnellste und flexibelste Weg.


Ich glaube ich beschreibe mein Problem am besten am direkten Beispiel.

http://7069.inethost24.de/bezbsp.swf (Flash-Player benötigt!)

Der Nutzer soll die Ankterpunkte des Beziers ( M1 und M2 ) selbst
bestimmen können. Das Programm soll dann aus dieser Kurve anhand
des Wertes auf der X-Achse den Wert auf der Y-Achse bestimmen.
Derzeit kann man den Verlauf steuern, indem man den Balken für t
verschiebt. Der Balken für f dient nur der Veranschaulichung.

Wenn man zB. den Punkt M1 weiter nach rechts verschiebt und dann ein
bisschen mit dem Balken für t spielt, sieht man gut, dass ich den t-Wert
nicht zum berechnen der Y-Werte benutzen kann.

Ich hoffe das hat Euch mein Problem etwas besser erklärt.

MfG sHo
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 06 Jun 2005 - 13:56:53    Titel:

Eigentlich sollte es bei einer kubischen Bezier-Kurve (also mit 2 Ankerpunkten reichen die Gleichung

P(t) = P0 * (1-t)^3 + P1 * 3(1-t) ^2 * t + P2 * 3(1-t) * t^2 + P3 * t^3

nach t aufzulösen. P(t) ist ja der X- bzw. Y-Wert mitdem ich t berechnen kann. Nur seh ich kein rekursiven Ansatz dafür. Ihr ?
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 06 Jun 2005 - 15:36:10    Titel:

Ich werde mir heute Abend deinen rekursiven Ansatz reinziehen, da ich mir über die Korrektheit noch nicht im Klaren bin. Was die Rekursion bei Interpreter-Sprachen (unsauber weiß ich) anbetrifft, so ist eine Auswertung der Rekursion auf jeden Fall vorzuziehen, da Rekursionsaufrufe aufgrund des Speichermanagements (Stack's Parameter auswerten usw.) teuerer sind.

Ich würde empfehlen, wenn Du nicht Kurven vom Grad > 4 betrachtest, doch den Ansatz X-Koordinate -> t -> Y-Koordinate zu wählen. Die Berechnung von t ist ja im Thread oben ordentlich durchgekaut worden. Sonst mußt Du approximieren. Das ist aber nicht die übliche Praxis, wie ich feststellen mußte, daß man Bezier-Kurven höheren Grades benutzt, sondern, wie auch bei den meisten Interpolationsaufgaben, mehrere Interpolationen mit einem kleineren Grad (<< 4) verwendet.

P.S. Ist dein Code wirklich ein Teil eines funktionierenden Programms? Meiner Meinung nach sollte es in der vor-vorletzten Zeile pts[0] und pts[1] heißen. Sonst ist mir nicht ganz klar, was p ist.
sHo
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 05.06.2005
Beiträge: 28
Wohnort: Dresden

BeitragVerfasst am: 06 Jun 2005 - 16:23:58    Titel:

Jo, les mich gard durch den obigen Thread. Werd es auch bei kubischen Beziers belassen, da sie ja die effizienteste Bezier-Form darstellen.

Du hast Recht! Es sollte pts[0] bzw pts[1] heißen, hab die funktion zwar schon getestet, aber später ein wenig umbeschrieben .. das kommt dabei raus wenn man nicht aufpasst. Danke Wink
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Mathe-Forum -> Bezier
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum