var precision = 10.0; var realUnit = precision; fun zmagsq(c) { var r = c.1; var i = c.2; (r*.r +. i*.i) /. precision } fun zsquare(c) { var r = c.1; var i = c.2; ((r *. r -. i *. i)/.precision, (2.0 *. r *. i)/.precision) } #fun zplus((r1, i1), (r2, i2)) { # (r1 + r2, i1 + i2) #} fun zplus(z1, z2) { (z1.1 +. z2.1, z1.2 +. z2.2) } var the_limit = 16.0; fun mandelloop(c, z, i) { if (zmagsq(c) > precision) { i } else if (i >= the_limit) { i } else { mandelloop(zplus(z, zsquare(c)), z, i+.1.0) } } fun mandelbrot(r, i, limit) { # c <- z + c^2 var c = (0.0, 0.0); var z = (r, i); mandelloop(c, z, 0.0) } fun mandelmatrix(r, i, result, minr, maxr, mini, maxi) { if (i >= maxi) { result } else { if (r >= maxr) { if (i+.1.0 >= maxi) result else mandelmatrix(minr, i+.1.0, []::result, minr, maxr, mini, maxi) } else { var point = mandelbrot(r, i, the_limit); var result = (point :: hd(result)) :: tl(result); mandelmatrix(r+.1.0, i, result, minr, maxr, mini, maxi) } } } fun mandelregion(minr, maxr, mini, maxi) { mandelmatrix(minr, mini, [[]], minr, maxr, mini, maxi) } fun hexdigit(i) { switch (floatToInt(i)) { case 0 -> "0" case 1 -> "1" case 2 -> "2" case 3 -> "3" case 4 -> "4" case 5 -> "5" case 6 -> "6" case 7 -> "7" case 8 -> "8" case 9 -> "9" case 10 -> "a" case 11 -> "b" case 12 -> "c" case 13 -> "d" case 14 -> "e" case _ -> "f" } } fun redshade(i, max) { if (i == max) "#000" else "#" ^^ hexdigit(16.0*.i/.max) ^^ "33" } fun pixeldiv(x, y, size, color) { var size = intToString(floatToInt(size)); var x = intToString(floatToInt(x)); var y = intToString(floatToInt(y));
} fun numbers(start, l) { if (l == []) [] else (start, hd(l)) :: numbers(start+.1.0, tl(l)) } sig mandelBlock : (Float, Float, Float, Float, Float, Float) ~> Xml fun mandelBlock(pixSize, x, y, regionSize, r, i) { var halfPixSize = pixSize /. 2.0; pixeldiv(x, y, halfPixSize, mandelbrot(r, i, the_limit)) ++ pixeldiv(x+.(halfPixSize), y, halfPixSize, mandelbrot(r+.regionSize, i, the_limit)) ++ pixeldiv(x, y+.(halfPixSize), halfPixSize, mandelbrot(r, i+.regionSize, the_limit)) ++ pixeldiv(x+.(halfPixSize), y+.(halfPixSize), halfPixSize, mandelbrot(r+.regionSize, i+.regionSize, the_limit)) } fun dilation(mina, minb, maxa, maxb, minc, mind, maxc, maxd) { ((maxc -. minc) /. (maxa -. mina), (maxd -. mind) /. (maxb -. minb)) } fun mandelMadness(x, y, r, i, pixSize, minx, miny, maxx, maxy, mini, minr, maxi, maxr) { var (xdil, ydil) = dilation(minx, miny, maxx, maxy, mini, minr, maxi, maxr); var regionSize = pixSize *. xdil; if (x >= maxx) { if (y >= maxy) { if (pixSize <= 1.0) { () } else { mandelMadness(minx, miny, minr, mini, pixSize/.2.0, minx, miny, maxx, maxy, mini, minr, maxi, maxr) } } else { mandelMadness(minx, y+.pixSize, minr, i+.regionSize, pixSize, minx, miny, maxx, maxy, mini, minr, maxi, maxr); } } else { if (y >= maxy) { mandelMadness(minx, miny, minr, mini, pixSize/.2.0, minx, miny, maxx, maxy, mini, minr, maxi, maxr) } else { var docElt = getDocumentNode(); appendChildren(mandelBlock(pixSize, x, y, regionSize, r, i), docElt); mandelMadness(x+.pixSize, y, r+.regionSize, i, pixSize, minx, miny, maxx, maxy, mini, minr, maxi, maxr); } } } fun goMandelMadness(mini, minr, maxi, maxr, pixelWidth) { mandelMadness(0.0, 0.0, minr, mini, pixelWidth, 0.0, 0.0, pixelWidth, pixelWidth, mini, minr, maxi, maxr) } fun main() { var p = spawnClient {goMandelMadness(-.1.0 *. realUnit, -.1.0 *. realUnit, realUnit, realUnit, 512.0)}; page
} main()