It's like a image repeated so much that is the same zooming in or out, look the border of the following image, every line become a spike, but it's alway the same image repeated:
Well, science studies mathematically fractals since you may find fractals everywhere around you: leaves, minerals, galaxies.
The following scripts draw a Mandelbrot fractal, one of the best known:
REBOL [
File: %mandelb.r
Date: 19-Jul-2009
Title: "Mandelbrot"
Purpose: "Mandelbrot"
Author: "Lami Gabriele"
Email: koteth@gmail.com
]
x-siz: 400 y-siz: 400
im: to-image layout [origin 0x0 box black to-pair x-siz y-siz]
bg-color: 200.200.210
make-col: func[flo ][
ic: to-integer ( 10 * cosine ( erre * 100 ) )
ip: to-integer ( 10 * ( 1 - cosine ( erre * 100 ) ) )
0.200.0 * ic + ip * 0.0.200 + 120.0.0
]
clear-im: func [im [image!] color [tuple!]][repeat j im/size/x * im/size/y [poke im j color] ]
set-pixel: func [im [image!] x [integer!] y [integer!] color [tuple!] ] [poke im (im/size/y - y * im/size/x + x) color ]
itmax: 30 minXPos: 0.0 minYPos: 0.0 zoom: 100.0 rmax: 3
norma: func[xx yy ] [square-root ((yy ** 2) + (xx ** 2)) ]
rescale: func[coo zoo offs ] [( coo / zoo ) + offs ]
calc-pixel: func [xPixel yPixel] [
xStart: rescale xPixel zoom ( - 3.0 + minXPos ) yStart: rescale yPixel zoom ( - 2.0 + minYPos )
xcic: xStart ycic: yStart count: 0 r: 0.0
while [ r <= rmax and ( count < itmax ) ][
xtem: (xcic ** 2 ) - (ycic ** 2) + xStart ycic: (2.0 * xcic * ycic ) + yStart
r: norma xcic ycic xcic: xtem count: count + 1
]
if (r < rmax)[return r ] return -1
]
view layout [
text "threshold" tresInp: field to-string rmax
text "iterations" iterInp: field to-string itmax
text "zoom" zoomInp: field to-string zoom
text "x position" icsInp: field to-string minXPos
text "y position" ipsInp: field to-string minYPos
pgBar: progress 200x15 coal blue 0.0
button "Draw" [
zoom: to-decimal zoomInp/data itmax: to-integer iterInp/data
minXPos: to-decimal icsInp/data minYPos: to-decimal ipsInp/data
rmax: to-integer tresInp/data clear-im im bg-color
repeat x x-siz [
repeat y y-siz [
erre: calc-pixel x y inrange: ( not-equal? erre -1 )
if inrange[ set-pixel im x y make-col erre ]
]
if ( x // 10 ) == 0 [show img ]
pgBar/data: ( x / x-siz ) show pgBar
]
show img
]
at 240X10 img: image im
]
REBOL [
Title: "Mandelbrot"
Date: 21-Sep-2001
Version: 0.0.1
File: %mandelbrot.r
Author: "Keith Ray"
Purpose: "Create Mandelbrot Set "
Email: %keithray--yahoo--com
]
clear-im: func [im [image!] color [tuple!]][
repeat j im/size/x * im/size/y [poke im j color]
]
set-pixel: func [
im [image!]
x [integer!]
y [integer!]
color [tuple!]
/local x-siz y-siz siz
][
x-siz: im/size/x
y-siz: im/size/y
poke im (y-siz - y * x-siz + x) color
]
calc-pixel: func [xPixel yPixel] [
rmax: 2
itmax: 100
xStart: 0.00
yStart: 0.00
count: 0
r: 0.00
xnew: 0.00
ynew: 0.00
xold: 0.00
yold: 0.00
;convert to real coordinates
;convert it to a value between -2.0 ... 1.0
xStart: ( xPixel / 100.0 ) - 2.0
;convert it to a value between -2.0 ... 2.0
yStart: ( yPixel / 100.0 ) - 2.0
xold: xStart
yold: yStart
count: 0
r: 0.0
flag: 2
while [flag > 1 ][
flag: 0
if ( r <= rmax )[flag: flag + 1 ]
if ( count < itmax ) [flag: flag + 1 ]
xnew: (xold * xold) - (yold * yold) + xStart
ynew: (2.0 * xold * yold) + yStart
r: square-root ((xnew * xnew) + (ynew * ynew))
xold: xnew
yold: ynew
count: count + 1
]
bol: false
if (r < rmax)[bol: true]
return bol
]
x-siz: 300 y-siz: 400
im: make image! 300x400
bg-color: 255.255.220
clear-im im bg-color
view layout [
img: image im
across
pad 50
button "Draw" [
clear-im im bg-color
repeat x x-siz [
repeat y y-siz [
if calc-pixel x y [ set-pixel im x y blue ]
]
show img
]
show img
]
button "Quit" [quit]
]
REBOL [
Title: "Mandelbrot II"
Date: 23-Sep-2001
Version: 0.0.1
File: %mandelbrot2.r
Author: "Keith Ray"
Purpose: "Create Mandelbrot Set with colors "
Email: %keithray--yahoo--com
]
start-x: 2.0
start-y: 1.5
global-color: 0
clear-im: func [im [image!] color [tuple!]][
repeat j im/size/x * im/size/y [poke im j color]
]
set-color: func [c ][
switch c [
1 [z: 0.0.0]
2 [z: 20.0.0]
3 [z: 40.0.0]
4 [z: 60.0.0]
5 [z: 80.0.0]
6 [z: 100.0.0]
7 [z: 120.0.0]
8 [z: 140.0.0]
9 [z: 160.0.0]
10 [z: 180.0.0]
12 [z: 180.20.0]
22 [z: 180.40.0]
13 [z: 180.60.0]
14 [z: 180.80.0]
15 [z: 180.100.0]
16 [z: 180.120.0]
17 [z: 180.140.0]
18 [z: 180.160.0]
19 [z: 180.180.0]
20 [z: 160.180.0]
21 [z: 140.180.0]
22 [z: 120.180.0]
23 [z: 100.180.0]
24 [z: 80.180.0]
25 [z: 60.180.0]
26 [z: 40.180.0]
]
return z
]
set-outside-pixel: func [
im [image!]
x [integer!]
y [integer!]
colr [integer!]
/local x-siz y-siz siz
][
x-siz: im/size/x
y-siz: im/size/y
color: set-color global-color
poke im (y-siz - y * x-siz + x) color
]
set-pixel: func [
im [image!]
x [integer!]
y [integer!]
color [tuple!]
/local x-siz y-siz siz
][
x-siz: im/size/x
y-siz: im/size/y
poke im (y-siz - y * x-siz + x) color
]
calc-pixel: func [xPixel yPixel] [
rmax: 2
itmax: 26
xStart: 0.00
yStart: 0.00
count: 0
r: 0.00
xnew: 0.00
ynew: 0.00
xold: 0.00
yold: 0.00
;convert to real coordinates
;convert it to a value between -2.0 ... 1.0
xStart: ( xPixel / 100.0 ) - start-x
;convert it to a value between -2.0 ... 2.0
yStart: ( yPixel / 100.0 ) - start-y
xold: xStart
yold: yStart
count: 0
r: 0.0
flag: 2
while [flag > 1 ][
flag: 0
if ( r <= rmax )[flag: flag + 1 ]
if ( count < itmax ) [flag: flag + 1 ]
xnew: (xold * xold) - (yold * yold) + xStart
ynew: (2.0 * xold * yold) + yStart
r: square-root ((xnew * xnew) + (ynew * ynew))
xold: xnew
yold: ynew
count: count + 1
]
bol: false
if (r > rmax)[global-color: to-integer r]
if (r < rmax)[bol: true]
return bol
]
x-siz: 300 y-siz: 300
im: make image! 300x300
bg-color: 255.255.220
clear-im im bg-color
view layout [
img: image im
across
pad 50
button "Draw" [
clear-im im bg-color
repeat x x-siz [
repeat y y-siz [
either calc-pixel x y [ set-pixel im x y black ][set-outside-pixel im x y y]
]
show img
]
show img
]
button "Quit" [quit]
]
No comments:
Post a Comment