79 lines
2.0 KiB
Plaintext
79 lines
2.0 KiB
Plaintext
/* Mandelbrot integer demo
|
|
* Released under the MIT License
|
|
*/
|
|
|
|
let
|
|
/* Basic types. */
|
|
type bool = int
|
|
type coord = int
|
|
type value = int
|
|
type array2d = array of value
|
|
type image2d = { nrows : coord, ncols : coord, data : array2d }
|
|
|
|
/* Image creation. */
|
|
function image_new (ncols : coord, nrows : coord) : image2d =
|
|
image2d { nrows = nrows, ncols = ncols,
|
|
data = array2d[nrows * ncols] of 0 }
|
|
|
|
function image_set (input : image2d, col : coord, row : coord,
|
|
value : value) =
|
|
(
|
|
input.data[row * input.ncols + col] := value
|
|
)
|
|
|
|
function mandelbrot () =
|
|
let
|
|
type fp = int
|
|
var X : int := 300
|
|
var Y : int := 300
|
|
var ima : image2d := image_new (X, Y)
|
|
var fixsize: int := 16834
|
|
|
|
function mul(a : fp, b : fp) : fp = (a*b)/fixsize
|
|
function frac(n : int, d : int) : fp = (n*fixsize)/d
|
|
|
|
var xcenter : fp := frac(0016, 10000)
|
|
var ycenter : fp := frac(8224, 10000)
|
|
var xmin : fp := xcenter - frac(5,100)
|
|
var ymin : fp := ycenter - frac(5,100)
|
|
var xmax : fp := xcenter + frac(5,100)
|
|
var ymax : fp := ycenter + frac(5,100)
|
|
var xs : fp := (xmax - xmin)/X
|
|
var ys : fp := (ymax - ymin)/Y
|
|
|
|
function iterations(x:int, y:int) : int =
|
|
let
|
|
var i : int := 0
|
|
var p : fp := xmin+x*xs
|
|
var q : fp := ymin+y*ys
|
|
var x0 : fp := 0
|
|
var y0 : fp := 0
|
|
var xn : fp := 0
|
|
var four : fp := frac(4,1)
|
|
var two : fp := frac(2,1)
|
|
in
|
|
while (mul(xn,xn)+mul(y0,y0) < four) & (i < 256) do
|
|
(
|
|
i := i + 1;
|
|
xn := mul((x0+y0),(x0-y0)) + p;
|
|
y0 := mul(two,mul(x0,y0)) + q;
|
|
x0 := xn
|
|
);
|
|
i
|
|
end
|
|
|
|
in
|
|
|
|
(for y := 0 to (Y-1) do
|
|
for x := 0 to (X-1) do
|
|
let
|
|
var i : int := iterations(x,y)
|
|
in
|
|
image_set (ima, x, y, i)
|
|
end);
|
|
end
|
|
in
|
|
print("Mandelbrot demo\n");
|
|
mandelbrot()
|
|
end
|