Paste: mandel.factor

Author: slava
Mode: factor
Date: Thu, 1 Oct 2009 05:53:13
Plain Text |
USING: accessors byte-arrays colors colors.hsv fry io
io.encodings io.encodings.ascii io.encodings.binary io.files
io.files.temp kernel math math.functions math.order prettyprint
sequences tools.time values ;
IN: mandel

CONSTANT: max-color       360
CONSTANT: zoom-fact       0.8
CONSTANT: width           640
CONSTANT: height          480
CONSTANT: max-iterations  40
CONSTANT: center         -0.65

: scale-component ( x -- y ) 255 * >fixnum ; inline

: scale-rgb ( rgba -- n )
    [ red>> scale-component ]
    [ green>> scale-component ]
    [ blue>> scale-component ] tri 3byte-array ;

CONSTANT: sat 0.85
CONSTANT: val 0.85

: <color-map> ( nb-cols -- map )
    [ iota ] keep '[
        360 * _ 1 + / sat val
        1 <hsva> >rgba scale-rgb
    ] map ;

VALUE: color-map

: compute-color-map ( -- map ) max-iterations max-color min <color-map> ;

compute-color-map to: color-map

: x-scale ( -- x ) width  200000 zoom-fact * / ; inline
: y-scale ( -- y ) height 150000 zoom-fact * / ; inline

: scale ( x y -- z ) [ x-scale * ] [ y-scale * ] bi* rect> ; inline

: c ( i j -- c ) scale center width height scale 2 / - + ; inline

: count-iterations ( z max-iterations step-quot test-quot -- #iters )
    '[ drop @ dup @ ] find-last-integer nip ; inline

: pixel ( c -- iterations )
    [ C{ 0.0 0.0 } max-iterations ] dip
    '[ sq _ + ] [ absq 4.0 >= ] count-iterations ; inline

: color ( iterations -- color )
    [ color-map [ length mod ] keep nth ] [ B{ 0 0 0 } ] if* ; inline

: render ( -- )
    height iota [ width iota swap '[ _ c pixel color write ] each ] each ;

: ppm-header ( -- )
    ascii encode-output
    "P6\n" write width pprint " " write height pprint "\n255\n" write
    binary encode-output ;

: mandel-main ( -- )
    "mandel.ppm" temp-file binary [ ppm-header render ] with-file-writer ;

[ mandel-main ] time

New Annotation

Summary:
Author:
Mode:
Body: