100 likes | 268 Views
Fraktale in PostScript. Sebastian Redl Manuel Pöter Helmut Petritsch. Fraktale. Künstliche oder natürliche Gebilde, geometrische Muster Erzeugt durch rekursive Ersetzungen z.B. Drachenkurve: F → R oder F → L R → + R - - L + L → - R + + L – Daraus resultiert + R - - L +
E N D
Fraktale in PostScript Sebastian Redl Manuel Pöter Helmut Petritsch
Fraktale • Künstliche oder natürliche Gebilde, geometrische Muster • Erzeugt durch rekursive Ersetzungen • z.B. Drachenkurve: F → R oder F → L R → + R - - L + L → - R + + L – • Daraus resultiert + R - - L + + ( + R - - L + ) - - ( - R + + L - ) +
Verbesserungen • Stack Overflow Exception bei der 13. Iteration • Ersetzungsregeln generisch durch Verwendung von HashTable • Optimierung bei der Verwendung von Winkelfunktionen /+ { ang rotate } def /- { ang neg rotate } def
Lösung 1 – Rekursives Ersetzen • Problem: • Stacktiefe beschränkt (~ 60.000 Elemente) • Arrays beschränkt (max. 65.536 Elemente)
Lösung 1 – Rekursives Ersetzen • Ersetzung von R und L im Array durch Sub-Arrays statt einem Array mit vielen Element - viele Arrays mit wenig Elementen
Ersetzungsfunktion /replaceDict << /R { [ /+ /R /- /- /L /+ ] } /L { [ /- /R /+ /+ /L /- ] } /+ { /+ } /- { /- } >> def /replFunc { << /arraytype { replFunc } /nametype { cvx exec } >> begin [ exch { dup type exec } forall ] end } def
Lösung 2 – Direktes Zeichnen • R und L sind rekursive Funktionsaufrufe. • Für die letzte Rekursion wird ein Dictionary verwendet, in dem R und L Zeichenbefehle sind. /recurseDict << … >> def /drawDict << … >> def
Generieren der Dictionaries /LSystem_Dict << /R { + R - - L + } /L { - R + + L - } >> def /recurseDict << LSystem_Dict { [ exch /drawRecurse cvx ] cvx } forall >> def /drawDict << /F { Zeichenbefehle } def LSystem_Dict { pop { F } } forall >> def
Rekursion /drawRecurse { exch dup 0 eq { drawDict begin } if dup 1 sub 3 2 roll exec pop dup 0 eq { end } if } def /start { L } def recurseDict begin start end
Danke für die Aufmerksamkeit Fragen?