factor/contrib/mandel.factor

101 lines
1.9 KiB
Factor
Raw Normal View History

2004-10-17 19:10:22 -04:00
! Graphical mandelbrot fractal renderer.
! To run this code, start your interpreter like so:
!
! ./f -library:sdl=libSDL.so -library:sdl-gfx=libSDL_gfx.so
!
! Then, enter this at the interpreter prompt:
!
! "contrib/mandel.factor" run-file
2004-08-26 20:10:25 -04:00
2004-10-17 19:10:22 -04:00
IN: mandel
USE: alien
2004-08-26 20:10:25 -04:00
USE: combinators
2004-10-17 19:10:22 -04:00
USE: errors
USE: kernel
USE: lists
USE: logic
2004-08-26 20:10:25 -04:00
USE: math
2004-10-17 19:10:22 -04:00
USE: namespaces
USE: sdl
2004-08-26 20:10:25 -04:00
USE: stack
2004-10-17 19:10:22 -04:00
USE: vectors
USE: prettyprint
2004-08-26 20:10:25 -04:00
USE: stdio
2004-10-17 19:10:22 -04:00
USE: test
: scale 255 * >fixnum ;
: scale-rgba ( r g b -- n )
scale
swap scale 8 shift bitor
swap scale 16 shift bitor
swap scale 24 shift bitor ;
: sat 0.85 ;
: val 0.85 ;
: <color-map> ( nb-cols -- map )
[,
dup [
360 * over succ / 360 / sat val
hsv>rgb 1.0 scale-rgba ,
] times*
,] list>vector nip ;
2004-08-26 20:10:25 -04:00
2004-10-17 19:10:22 -04:00
: absq >rect swap sq swap sq + ;
: iter ( c z nb-iter -- x )
over absq 4 >= over 0 = or [
nip nip
2004-08-26 20:10:25 -04:00
] [
2004-10-17 19:10:22 -04:00
pred >r sq dupd + r> iter
2004-08-26 20:10:25 -04:00
] ifte ;
2004-10-17 19:10:22 -04:00
: max-color 360 ;
SYMBOL: zoom-fact
SYMBOL: x-inc
SYMBOL: y-inc
SYMBOL: nb-iter
SYMBOL: cols
SYMBOL: center
: init-mandel ( -- )
width get 200000 zoom-fact get * / x-inc set
height get 150000 zoom-fact get * / y-inc set
nb-iter get max-color min <color-map> cols set ;
2004-08-26 20:13:44 -04:00
2004-10-17 19:10:22 -04:00
: c ( #{ i j } -- c )
>rect >r
x-inc get * center get real x-inc get width get 2 / * - + >float
r>
y-inc get * center get imaginary y-inc get height get 2 / * - + >float
rect> ;
2004-08-26 20:10:25 -04:00
2004-10-17 19:10:22 -04:00
: render ( -- )
init-mandel
width get height get [
c 0 nb-iter get iter dup 0 = [
drop 0
] [
cols get [ vector-length mod ] keep vector-nth
] ifte
] with-pixels ;
2004-08-26 20:10:25 -04:00
: mandel ( -- )
1280 1024 32 SDL_HWSURFACE SDL_FULLSCREEN bitor SDL_SetVideoMode drop
2004-10-17 19:10:22 -04:00
[
3 zoom-fact set
2004-10-17 19:10:22 -04:00
-0.65 center set
50 nb-iter set
[ render ] time
"Done." print flush
] with-surface
<event> event-loop
SDL_Quit ;
mandel