2004-11-09 12:25:13 -05:00
|
|
|
! Graphical mandelbrot fractal renderer.
|
|
|
|
! To run this code, start your interpreter like so:
|
|
|
|
!
|
2004-12-18 19:06:10 -05:00
|
|
|
! ./f -libraries:sdl:name=libSDL.so -libraries:sdl-gfx:name=libSDL_gfx.so
|
2004-11-09 12:25:13 -05:00
|
|
|
!
|
|
|
|
! Then, enter this at the interpreter prompt:
|
|
|
|
!
|
2004-11-20 16:57:01 -05:00
|
|
|
! "examples/mandel.factor" run-file
|
2004-11-09 12:25:13 -05:00
|
|
|
|
|
|
|
IN: mandel
|
2004-12-17 21:46:19 -05:00
|
|
|
USE: compiler
|
2004-11-09 12:25:13 -05:00
|
|
|
USE: alien
|
|
|
|
USE: errors
|
|
|
|
USE: kernel
|
|
|
|
USE: lists
|
|
|
|
USE: math
|
|
|
|
USE: namespaces
|
|
|
|
USE: sdl
|
2004-11-09 21:51:43 -05:00
|
|
|
USE: sdl-event
|
|
|
|
USE: sdl-gfx
|
|
|
|
USE: sdl-video
|
2004-11-09 12:25:13 -05:00
|
|
|
USE: vectors
|
|
|
|
USE: prettyprint
|
|
|
|
USE: stdio
|
|
|
|
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 )
|
2004-11-11 15:15:43 -05:00
|
|
|
[
|
2004-11-09 12:25:13 -05:00
|
|
|
dup [
|
|
|
|
360 * over succ / 360 / sat val
|
|
|
|
hsv>rgb 1.0 scale-rgba ,
|
|
|
|
] times*
|
2004-11-11 15:15:43 -05:00
|
|
|
] make-list list>vector nip ;
|
2004-11-09 12:25:13 -05:00
|
|
|
|
2004-12-17 21:46:19 -05:00
|
|
|
: absq >rect swap sq swap sq + ; inline
|
2004-11-09 12:25:13 -05:00
|
|
|
|
|
|
|
: iter ( c z nb-iter -- x )
|
|
|
|
over absq 4 >= over 0 = or [
|
|
|
|
nip nip
|
|
|
|
] [
|
|
|
|
pred >r sq dupd + r> iter
|
2004-12-17 21:46:19 -05:00
|
|
|
] ifte ; compiled
|
2004-11-09 12:25:13 -05: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 ;
|
|
|
|
|
|
|
|
: 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
|
2004-12-17 21:46:19 -05:00
|
|
|
rect> ; compiled
|
2004-11-09 12:25:13 -05: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 ;
|
|
|
|
|
|
|
|
: mandel ( -- )
|
|
|
|
640 480 32 SDL_HWSURFACE [
|
|
|
|
[
|
|
|
|
0.8 zoom-fact set
|
|
|
|
-0.65 center set
|
|
|
|
100 nb-iter set
|
|
|
|
[ render ] time
|
|
|
|
"Done." print flush
|
|
|
|
] with-surface
|
|
|
|
|
|
|
|
<event> event-loop
|
|
|
|
SDL_Quit
|
|
|
|
] with-screen ;
|
|
|
|
|
|
|
|
mandel
|