javascript - Julia 集合的 JS canvas 实现

标签 javascript canvas fractals

问题目前已解决。如果有人想看彩色分形,the code is here .

这是前一个问题:

尽管算法很简单,但我似乎有一个小错误(有些分形绘制正确,有些则不正确)。可以在jsFiddle中快速查看c = -1, 1/4 分形绘制正确但如果我将 c = i;图片完全错误。

这里是实现。

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。 .这使得 Julia 分形即使在像 c = i 这样的情况下也能有些可见。

你的选择是

(1) 减少迭代次数,可能取决于 c

(2) 增加采样(和 Canvas )的大小,可能取决于 c

(3) 根据超过 R 的迭代次数为 Canvas 的点着色。

最后一个选项将为您提供最可靠的结果。

关于javascript - Julia 集合的 JS canvas 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19671543/

相关文章:

javascript - 语法错误: Unexpected end of input at Module._compile

android - 如何使用 cubicTo 在 Android 中绘制带动画的贝塞尔曲线?

linux - 函数和分形 - 递归树 - Bash!逻辑问题

javascript - 如何在 Javascript 中实现调整大小?

javascript - jQuery .height 方法无法在 iOS Safari 中设置高度

javascript - 为什么我的 jQuery 事件处理程序在附加到多个元素时会失败?

javascript - 是否可以使文本在 Canvas 中从左到右消失?

javascript - 响应式设计中使用 Canvas 或 SVG 进行图像屏蔽

python - 在Mandelbrot中实现平滑着色

fractals - 具有一般指数的 OpenGL ES GLSL Mandelbrot