该问题当前已解决。 如果有人想看彩色的分形the code is here。
这是先前的问题:
尽管如此,该算法还是很简单的,我似乎有一个很小的错误(有些分形正确绘制,有些则没有)。您可以在jsFiddle中快速检查c = -1,1/4分形正确绘制,但是如果我取c = i,则为0。图像完全错误。
这是实现。
HTML
<canvas id="a" width="400" height="400"></canvas>
JS
function point(pos, canvas){
canvas.fillRect(pos[0], pos[1], 1, 1); // there is no drawpoint in JS, so I simulate it
}
function conversion(x, y, width, R){ // transformation from canvas coordinates to XY plane
var m = R / width;
var x1 = m * (2 * x - width);
var y2 = m * (width - 2 * y);
return [x1, y2];
}
function f(z, c){ // calculate the value of the function with complex arguments.
return [z[0]*z[0] - z[1] * z[1] + c[0], 2 * z[0] * z[1] + c[1]];
}
function abs(z){ // absolute value of a complex number
return Math.sqrt(z[0]*z[0] + z[1]*z[1]);
}
function init(){
var length = 400,
width = 400,
c = [-1, 0], // all complex number are in the form of [x, y] which means x + i*y
maxIterate = 100,
R = (1 + Math.sqrt(1+4*abs(c))) / 2,
z;
var canvas = document.getElementById('a').getContext("2d");
var flag;
for (var x = 0; x < width; x++){
for (var y = 0; y < length; y++){ // for every point in the canvas plane
flag = true;
z = conversion(x, y, width, R); // convert it to XY plane
for (var i = 0; i < maxIterate; i++){ // I know I can change it to while and remove this flag.
z = f(z, c);
if (abs(z) > R){ // if during every one of the iterations we have value bigger then R, do not draw this point.
flag = false;
break;
}
}
// if the
if (flag) point([x, y], canvas);
}
}
}
另外,我花了几分钟的时间来编写它,我花了更多的时间试图找出为什么它不适用于所有情况。知道我搞砸了吗?
最佳答案
好消息! (或坏消息)
您的实现是完全的。正确的。不幸的是,使用c = [0, 1]
,Julia集几乎没有点。我相信它是measure zero(与Mandelbrot集不同)。因此,在该 Julia 集中存在一个随机点的概率为0。
如果将迭代次数减少到15(JSFiddle),则可以看到分形。一百次迭代更“准确”,但是随着迭代次数的增加,分形近似中包含400 x 400网格上的点的机会降低为零。
通常,您会看到Julia分形会具有多种颜色,其中颜色表示它发散的速度(或根本不发散),就像在Flash demonstration中一样。即使在c = i的情况下,这也使Julia分形在某种程度上可见。
您的选择是
(1)减少迭代次数,可能取决于c
。
(2)增加样本(和 Canvas )的大小,可能取决于c
。
(3)根据超出R
的迭代编号为 Canvas 上的点着色。
最后一个选项将为您提供最可靠的结果。
关于javascript - Julia 集的JS Canvas 实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19671543/