Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Apr 20, 2024 15:05

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Spaß mit Bézierkurven
BeitragVerfasst: Mo Okt 04, 2010 12:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hallo allerseits,

Zwischendurch, während ich immer noch auf Internet @ Home warte, eine lustige mathematische Frage *yaay*.

Und zwar geht es um Bézierkurven. Prinzipiell recht einfach, kann man sich auf Wikipedia anlesen. Nun haben diese Biester aber die unangenehme Eigenschaft, dass für ein gleiches Δt der Abstand zwischen den Punkten C(t) und C(t+Δt) für ein beliebiges t mit 0≤t≤1-Δt nicht gleich sein muss, oder sehe ich das falsch?
//Edit: Glatt vergessen die eigentliche Frage zu stellen: Wie würde man die Bézierkurve so einteilen, dass man gleich lange Segmente bekommt? Ich hab schon was zu De Castejau gelesen, aber das scheint mir doch was anderes zu sein.

Weiterhin suche ich eine Möglichkeit, an einer Stelle t der Bézierkurve die Tangente zu berechnen, die Normale dazu wäre die Krönung.

Ich denke, einer von euch Mathe-Profis kann mir da bestimmt helfen ;)
grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Mo Okt 04, 2010 12:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Kommt ja erstmal darauf an, was für eine Bezierkurve du nutzen willst.
Kubisch oder Quadratisch
Die Tangente kannst du sogar recht einfach bekommen.
Man visualisiert ja immer die sache mit dem ziehen von Linien zwischen den Stützpunkten und den Kontrollpunkten, dann wird zwischen diesen liniear interpoliert(um t).
Dann wird je nach dem ob es Kubisch oder Quadratisch ist noch entsprechend zwischen den interpolierten Punkten linien gezogen und wieder t linear interpoliert.
Der letzte Schritt ist deine Tangente, also da wo du den punkt raus bekommst.
Wie man das ohne dieses Schrittweise durchgehen die Tangente findet müsste ich auch erst googeln.
Die Normale kannst du über das Kreuzprodukt von tangente(in 3. dimension bringen) und Vec(0,0,1) errechnen aber auch hier wird man mit googeln ne elegantere Lösung mit Winkelfunktionen finden(ohne noch in 3. dimension zu gehen).
Ich hab noch nicht getestet ob das berechnen über Winkelfunktionen schneller ist als das erweitern auf 4 Komponenten und verwenden von einem SSE basiertem Kreuzprodukt.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Di Okt 05, 2010 12:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ups, ich dachte, ich hätte n=3 erwähnt. Also läuft es prinzipiell darauf hinaus, dass die Tangente einer n=3 Kurve der Vektor einer n=2 Kurve ist, die die Vektoren zwischen den Kontrollpunkte der kubischen Kurve als Kontrollpunkte verwendet?

Mein Hauptproblem ist leider immer noch nicht gelöst. Gibt es irgendeine Möglichkeit zu sagen, ich bin bei einer Stelle t und möchte um eine Strecke(!) s weiter nach vorne wandern, also wie groß ist das nächste t?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Di Okt 05, 2010 12:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Gibt es irgendeine Möglichkeit zu sagen, ich bin bei einer Stelle t und möchte um eine Strecke(!) s weiter nach vorne wandern, also wie groß ist das nächste t?

Ich habe gerade keine Lust mich darin zu vertiefen aber ich glaube das ging irgendwie über die Ableitung. Also die Länge des Gradientenvektors entspricht der Strecke (bzw. genauer gesagt der Geschwindigkeit an dem Punkt wo du den Gradienten gebildet hast)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Di Okt 05, 2010 12:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, aber wie hilft mir da die Ableitung? Daran hatte ich auch schon gedacht, nur was hilft mir das? Das Ergebnis der Ableitung an der Stelle t ist die Geschwindigkeit. Kann sein, dass ich da aufm Schlauch stehe, aber wie hilft mir das, wenn ich eine Kurve und keine Gerade habe und um eine Strecke s auf dieser Kurve weiter gehen will?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Mi Okt 06, 2010 09:38 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Sammeln wir einfach mal alles zusammen was du hast und was du brauchst:

Was kannst du denn alles berechnen? Du kannst die "Geschwindigkeit" berechnen? Was genau sagt die aus?
Kannst du die Gesamtlänge der Kurve berechnen?

Wenn ich das recht verstehe, möchtest du deine Kurve in n Gleich lange Teile zerlegen. Richtig?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Mi Okt 06, 2010 10:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich denke was du erreichen willst ist eine "Arc Length Parametrization". In dieser Form entspricht der Abstand zwischen t1 und t2 genau der Strecke die du auf der Kurve zwischen f(t1) und f(t2) zurückgelegt hast.


Dateianhänge:
Dateikommentar: Auszug einer Alpha-Version des Skripts der Vorlesung "Polynomial Curves and Surfaces". Enthält ggf. viele Fehler.
arc-length.pdf [107.35 KiB]
555-mal heruntergeladen

_________________
Yeah! :mrgreen:
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Mi Okt 06, 2010 12:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Flash hat geschrieben:
Wenn ich das recht verstehe, möchtest du deine Kurve in n Gleich lange Teile zerlegen. Richtig?

Größtenteils. Es geht darum, die Bezierkurve zum erzeugen von Geometrie zu zerlegen. Dazu will ich teile, die eine bestimmte Länge oder (wenn es das letzte Teil ist und es nicht mehr ganz auf die Kurve passt) kürzer.

Zur Erzeugung der Geometrie brauch ich dann natürlich auch zeug wie Tangenten etc., aber das ist geklärt.
Den Anhang von dir, Coolcat, werd ich mir mal anschauen, danke.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Fr Feb 18, 2011 16:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich hab nun endlich die Zeit gefunden, mich genauer mit dem Paper auseinander zu setzen. Ich glaube, ich kann dem auch folgen, nur beim letzten Schritt, dem invertieren von s(t) scheitere ich. Ich bekomme für s(t) ein Polynom 3. Grades ohne konstanten Term:
s(t)=||a||t³+||b||t²+||c||t.
Das zu invertieren ist… ähm… nicht möglich, oder? Schließlich ist das ganze nicht mehr bijektiv, sobald ||b|| groß genug wird. Wie komme ich dann an mein t(s)=s⁻¹(t)?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Fr Feb 18, 2011 17:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Deine Funktion ist doch ein Integral, genauer gesagt das folgende:
Bild
Das Ding sollte eigentlich streng monoton steigend sein, wegen dem Betrag im Integral. Eine streng monoton steigende Funktion ist bijektiv und somit invertierbar.

Edit: Wie du jetzt aber die Inverse berechnest...da steh ich gerade auch auf dem Schlauch...;)

Edit: Wenn der Betrag zwischenzeitlich mal 0 ist, ist es natürlich nicht mehr streng monoton sondern nur monoton.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: Fr Feb 18, 2011 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Stimmt, t geht ja nur von 0 bis 1, daher konnte ich den Betrag ja erst so schön auf die Vektoren runterziehen und mit die Integration vereinfachen… Dennoch ist das mit der Inverse ein Problem. Any suggestions?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spaß mit Bézierkurven
BeitragVerfasst: So Mär 06, 2011 17:38 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
tak hat das meiste ja schon gesagt... bezierkurven bleiben üblicherweise nicht stehen, also ist ihre geschwindigkeit positiv. leite die kurve in ihrem parameter ab (ist darin nur ein polynom, sollte nicht schwer sein) und du bekommst den geschwindigkeitsvekor - der zeigt,wenn du ihn an deiner kurve anlegst, immer nach vorne (auch in 3D). darfst auch nochmal ableiten dann hast du die beschleunigung. die steht senkrecht zur geschwindigkeit und muss bei nicht linearen bezierkurven imho auch immer größer null sein. wenn du aus geschwindigkeit und beschleunigung das kreuzprodukt bildest, bekommst du das begleitende dreibein: http://de.wikipedia.org/wiki/Begleitendes_Dreibein da steht einiges, was du durch ableiten so bekommst. die englische variante scheint mir aber zwecks mehr bildchen verständlicher: http://en.wikipedia.org/wiki/Frenet%E2% ... t_formulas . wiehe auch http://wiki.delphigl.com/index.php/Geom ... rch_Kurven . vielleicht hast du sogar glück und es existieren sourcen für das anaglyphen-tutorial, da müsste die torusvariante drin sein.
über tangenten zwischen zwei samplingpunkten würde ich bei so einfachen kurven wie bezierkurven nicht rechnen, das geht per ableiten billiger.

nun willst du auch noch die geschwindigkeit konstant haben. recht und billig ist es es, an jedem punkt der kurve anhand der geschwindigkeit der kurve im aktuellen punkt die schrittweite mit dem inversen des geschwindigkeitsbetrages zu multiplizieren. das ist zwar fehlerbehaftet, würde dir aber das problem mit dem invertieren abnehmen. alternativ gibt es z.B. hier ein wenig hilfe (beziers sind ja polynome...): http://www.tutorvista.com/math/inverse- ... l-function . ansonsten vorsicht, wenn du nach inversen von polynomen im netz suchst; da findet man oft die ringinversen polynome, die man mit dem euklidischen algorithmus findet. das willst du nicht :-D. ansonsten auch de-casteljau ansehen.

edit: sorry, nicht gemerkt, dass die wurzel ja auch noch gezogen werden muss. aber bis zu quadratischen beziers lässt sich das integral geschlossen rechnen, da unter der wurzel dann nur ein polynom 2. grades steht (wird abgeleitet, verliert einen grad zu eins und das dann wieder quadriert, gibt grad zwei) siehe: /*na toll der link geht nicht. gehe auf http://www.wolframalpha.com und gib "integrate((c * x^2 + d*x +f)^(1/2),x)" ein. */. ob du dann mit mehr bedingungen an die integrationsgrenzen und an die parameter noch auf eine geschlossene form für das inverse kommst, bezweifle ich ein wenig :-) das inverse musst du ab dann anders suchen. irgend ein itrationsverfahren oder os.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.025s | 18 Queries | GZIP : On ]