require ./grafik.fs : fix* ( fix1 fix2 -- fix3 ) \ Festkomma-Multiplikation; Komma liegt zwischen Bit 15 und 16. M* 16 lshift swap 16 rshift or ; : mandel-pixel ( xc yc N -- iter ) \ Berechne ein Pixel des Mandelbrot-Fraktals am Punkt (xc,yc) mit bis zu N \ Iterationen; Rückgabewert ist -1 für Punkte, die zur Mandelbrot-Menge \ gehören, ansonsten liefern wir die Iteration zurück, ab der die Reihe \ divergiert { xc yc N } \ Parameter in lokale Variablen übernehmen 0 0 N 0 do ( s: x y ) over dup fix* over dup fix* ( s: x y x² y² ) 2dup + $40000 > if 2drop 2drop I unloop exit then - xc + ( s: x y x_new ) -rot fix* 2* yc + ( s: x_new y_new ) loop 2drop -1 ; \ Der Bereich des Mandelbrot-Fraktals, der dargestellt wird. \ Alles Festkommazahlen in hexadezimal -$18000 value x0 \ = -1.5 $08000 value x1 \ = 0.5 -$0C000 value y0 \ = -0.75 $0C000 value y1 \ = 0.75 50 value N \ Anzahl der Iterationen : mandelbr ( -- ) \ Mandelbrot-Fraktal berechnen und zeichnen (320x240 Punkte) 240 0 do 320 0 do I x1 x0 - 320 */ x0 + ( x ) J y1 y0 - 240 */ y0 + ( y ) N mandel-pixel dup 0< if drop $FFFFFF \ weiße Farbe für Punkte in der Mandelbrot-Menge else \ ansonsten Farbe aus einem rot-blau Farbverlauf dup 16 * 255 and 16 lshift swap 100 swap - 255 and or then \ schreibe 4-byte Farbwert direkt in den Grafikspeicher: video-mem J 320 * I + 4 * + ! loop loop ; +grafik mandelbr \ Grafikmodus aktivieren und Fraktal zeichnen EKEY DROP \ Auf Eingabe warten, danach Grafikmodus und gForth beenden -grafik BYE