[GDI+] Casteljau Beispiel & Bezier Beispiel

  • Moin,

    Es ist eigentlich nichts großes, aber ich habe genau so ein Beispiel letztens gesucht und falls irgendwer sonst mal auf die Idee kommt den Casteljau3 (mit q = 3) Algorithmus (er ist wirklich trivial) zu basteln hat er hier eine kleine Vorlage (außerdem endet Casteljau3 auf "au3". Allein deshalb muss das hier ins Forum).

    Mit den Variablen $bDrawXYZ (zeile 17 & 18) kann man auswählen in welchen Iterationsstufen man das Zwischenergebnis anzeigen lassen will.

    Edit: Habe noch ein Beispiel für BezierN gebastelt.

    lg

    M

  • Coole Sache :thumbup:

    Ich hatte mit dem Titel erst Probleme, hatte an Kabeljau gedacht.:D Aber nach dem Googlen habe ich mehr erfahren über De-Casteljau...

    Könnte ich für FB gut gebrauchen.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Sehr schick!

    Wenn man die Zeile 55

    _GDIPlus_GraphicsDrawImageRect($hGFX, $hBMP, 0, 0, $iW, $iH)

    (ggf sleep(100) anfügen)

    vor die Zeile 73

    If $iter < $MaxIter Then

    kopiert, dann sieht man auch, dass das Script "funktioniert" :o)

    aka die Punkte auf den Bezierkurven aus den Geraden berechnet werden.

  • Schön, dass es euch gefällt. Ja im Prinzip ist Casteljau eine coole Sache, aber (in dieser Form) nicht der Way to go (Beschränktheit auf durch 4 teilbare Punktmengen (bzw wenn man garnichts ändert nur auf 4 Punkte^^), diskrete Punktmenge als Ergebnis (ich kann nicht einfach sagen, dass ich z.B. 50 Punkte für die neue Kurve will, ich bekomme je nach Iterationsschritt eben so viele wie ich bekomme), usw usw.

    Da ich sowieso noch ein weiteres Beispiel gebraucht habe hab ich noch ein bisschen mehr Spielzeug für UEZ :D

    PS: Die Methode geht in einer pointerbasierten Programmiersprache bestimmt richtig steil, in AutoIt hat man hier ziemlich viel overhead.

    Der Algorithmus ist für beliebige Punktmengen nutzbar, hat aber n² Komplexität (in Bezug auf die Menge der Eingabepunkte) und lineare Komplexität in Bezug zum Output (also wenn man z.B. 100 Punkte statt 50 haben will). Er hat noch tonnenweise weitere Nachteile (z.B. ist "alles" verknüpft, selbst bei 10 Eingabepunkten bewirkt eine Bewegung eines Randpunktes veränderungen an der ganzen Kurve, auch wenn die Veränderungen klein sind), aber das ist schon so geplant ;)

    Wenn jemand Lust hat kann er ja ein Beispiel für B-Splines (via BezierN frei wählbarer Grad) basteln, dann hat man bessere lokale Eigenschaften und bessere Komplexität :)

    Edit: Und noch eine Version mit Pseudo Äquidistanten Punkten (auch O(n²)):

    Die Methodik hier ist:

    1. Berechne die "normalen" Bezier Punkte
    2. Man kennt jetzt zu jedem Punkt den Abstand zum Nachfolger UND das $t welches in der originalen Version äquidistant verteilt wurde
    3. Jetzt berechnet man pi mal Daumen die Gesamtlänge der Kurve (ist natürlich nicht exakt weil man endliche Samples hat)

    4. Man kennt jetzt den Mittleren Abstand und findet ein modifiziertes $t, sodass der Abstand bei jedem Punkt zu seinem Vorgänger gleich ist.

    Da das ganze unter der Annahme ist, dass man die Gesamtlänge der Kurve kennt (die man nicht kennt), sowie das die Kurve lokal eine kleine Änderungsrate hat (was oft nicht stimmt, wir sagen hier immerhin, dass das Integral entlang der Kurve GLEICH dem Abstand 2er Punkte ist. Nur ein Narr glaubt dass das immer geht) funktioniert die Methode nur wenn man hinreichend viele Punkte hat. Im Beispiel kann man z.B. mal eine 5 eintragen und sehen dass die Punkte KEINE gleichmäßige Abstände haben. Verwendbar wenn man genügend Punkte, und eine Kurve ohne zu stark knickende Stellen hat. Verwendungszweck: Wenn man aus irgendwelchen Gründen (z.B. Simulationen) halbwegs gleiche Abstände braucht, in 99% aller anderen Fälle ist der normale Bezier besser.

    lg

    M

  • Mars 16. August 2020 um 15:12

    Hat den Titel des Themas von „[GDI+] Casteljau Beispiel“ zu „[GDI+] Casteljau Beispiel & Bezier Beispiel“ geändert.