Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#58

Re: RiB - Reflect it Baby

  Alt 15. Mär 2007, 08:51
Splines, die durch Kontrollpunkte verlaufen, lassen sich relativ einfach berechnen. Im Prinzip sind es polynome 3.Grades, die durch die einzelnen Punkte laufen. Betrachten wir drei Punkte P[i-1], P[i] und P[i+1]. Ein Spline durch diese Punkte besteht aus 2 Polynomen. PN1 geht von P[i-1] zu P[i] und PN2 geht von P[i] zu P[i+1].

Die beiden Polynome müssen am Punkt P[i] in ihrer 1. und 2.Ableitung gleich sein, damit keine Stufen entstehen und das Ganze glatt verläuft.

Wir wissen also:
1. PN1'(x[i]) = PN2'(x[i]) // gleiche Steigung
2. PN1''(x[i]) = PN2''(x[i])

Ich weiss nicht mehr, wieso, aber ich habe alle Polynome nicht von x[i]...x[i+1], sondern von 0... x[i+1]-x[i] laufen lassen.

Damit ergeben sich folgende Bedingungen (sei dx0 = x[i]-x[i-1] und dx1 = x[i-1] - x[i]):
1. PN1[0] = y[i-1]
2. PN2[0] = y[i]
3. PN1[dx0] = y[i]
4. PN2[dx1] = y[i+1]

Wir haben nun 6 Gleichungen für 8 unbekannte (2x 4 Koeffizienten für die Polynome). 2 fehlen noch. der nächste Abschnitt liefert uns jedoch die fehlenden 2 Gleichungen (für PN2) und so weiter. Wenn man das Gleichungssystem für alle Punkte in eine Matrix schreibt, erhält man M-2 Gleichungen mit M Unbekannten. Fast fertig. Nun kann man einfach definieren, das PN0"(0) = 0 und PNn"(dxn) = 0, also setzt einfach die 2.Ableitung am ersten Punkt und die am letzten Punkt auf 0.

Somit ist das Gleichungsystem vollständig und man kann es mit einfachen Mitteln lösen. Dann erhält man N 4-tupel, die Koeffizienten der Polynome.

Kleiner Haken: Die Sache klappt nur bei streng monoton steigenden X-Werten.

Um nun beliebige Kurven zu zeichnen, Erstellt man zwei Splines:
Eins für die Punkte x[i],z[i] und eins für die Punkte y[i],z[i], wobei z[i] eine streng monoton steigende Hilfsfunktion ist, z.B. der Abstand zwischen den einzelnen Punkten aufsummiert. Abschließend berechnet man die Splines S1 und S2 und trägt die Werte S1 S2 auf. Fertig ist die glatte Kurve.

Leider hab ich den Sourcecode nicht auf meinem Laptop, sondern -wenn überhaupt- nur uff Aaabeet. Aber das selbst ich das vor 10-15 Jahren mal hinbekommen habe, schaffst Du das auch: Einfach mal 10 Minuten sacken lassen, Gleichungssystem aufschreiben und lösen (lassen).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat