RosettaCodeData/Task/Mandelbrot-set/JavaScript/mandelbrot-set-1.js

70 lines
1.6 KiB
JavaScript
Raw Permalink Normal View History

2017-09-23 10:01:46 +02:00
function mandelIter(cx, cy, maxIter) {
2013-04-10 21:29:02 -07:00
var x = 0.0;
var y = 0.0;
2017-09-23 10:01:46 +02:00
var xx = 0;
var yy = 0;
var xy = 0;
var i = maxIter;
while (i-- && xx + yy <= 4) {
xy = x * y;
xx = x * x;
yy = y * y;
x = xx - yy + cx;
y = xy + xy + cy;
2013-04-10 21:29:02 -07:00
}
2017-09-23 10:01:46 +02:00
return maxIter - i;
2013-04-10 21:29:02 -07:00
}
2017-09-23 10:01:46 +02:00
function mandelbrot(canvas, xmin, xmax, ymin, ymax, iterations) {
var width = canvas.width;
var height = canvas.height;
var ctx = canvas.getContext('2d');
2013-04-10 21:29:02 -07:00
var img = ctx.getImageData(0, 0, width, height);
var pix = img.data;
2017-09-23 10:01:46 +02:00
for (var ix = 0; ix < width; ++ix) {
for (var iy = 0; iy < height; ++iy) {
var x = xmin + (xmax - xmin) * ix / (width - 1);
var y = ymin + (ymax - ymin) * iy / (height - 1);
var i = mandelIter(x, y, iterations);
var ppos = 4 * (width * iy + ix);
if (i > iterations) {
2013-04-10 21:29:02 -07:00
pix[ppos] = 0;
2017-09-23 10:01:46 +02:00
pix[ppos + 1] = 0;
pix[ppos + 2] = 0;
} else {
var c = 3 * Math.log(i) / Math.log(iterations - 1.0);
if (c < 1) {
pix[ppos] = 255 * c;
pix[ppos + 1] = 0;
pix[ppos + 2] = 0;
2013-04-10 21:29:02 -07:00
}
2017-09-23 10:01:46 +02:00
else if ( c < 2 ) {
2013-04-10 21:29:02 -07:00
pix[ppos] = 255;
2017-09-23 10:01:46 +02:00
pix[ppos + 1] = 255 * (c - 1);
pix[ppos + 2] = 0;
} else {
2013-04-10 21:29:02 -07:00
pix[ppos] = 255;
2017-09-23 10:01:46 +02:00
pix[ppos + 1] = 255;
pix[ppos + 2] = 255 * (c - 2);
2013-04-10 21:29:02 -07:00
}
}
2017-09-23 10:01:46 +02:00
pix[ppos + 3] = 255;
2013-04-10 21:29:02 -07:00
}
2017-09-23 10:01:46 +02:00
}
ctx.putImageData(img, 0, 0);
2013-04-10 21:29:02 -07:00
}
2017-09-23 10:01:46 +02:00
var canvas = document.createElement('canvas');
canvas.width = 900;
canvas.height = 600;
document.body.insertBefore(canvas, document.body.childNodes[0]);
mandelbrot(canvas, -2, 1, -1, 1, 1000);