生成Mandelbrot集的一些问题

时间:2019-02-10 03:15:19

标签: processing p5.js mandelbrot

我编写了一个用于处理生成mandelbrot集的程序,并成功完成了工作,但是一旦将c更改为恒定的复数,就无法使用程序获取任何模式。我必须有一个盲点,因为我似乎无法调试程序。大家可以给我一些建议吗?谢谢!

在mand函数中注释掉的行是我尝试更改c值的方式,但是到目前为止,除了生成Mandelbrot集之外,我再也无法获得任何类型的模式。

profvis

1 个答案:

答案 0 :(得分:2)

颜色通道的值必须在[0,255]范围内。 Mandelbrot分形函数的结果f是任意数字,大多数结果是1.0以下的数字,但是该函数也返回非常高的数字。
您必须将此值映射到像素的颜色。

我建议计算[0.0,1.0]范围内的颜色值:

cR = Math.min(sqrt(f/100.0), 1);
cG = Math.min(sqrt(f/50.0), 1);
cB = Math.min(sqrt(f/10.0), 1);

最后将它们映射到[0,255]范围:

pixels[(x+y*width)*4]   = cR * 255;
pixels[(x+y*width)*4+1] = cG * 255;
pixels[(x+y*width)*4+2] = cB * 255; 

请参见示例,其中我将更改应用于您的原始代码:

function setup() {
    createCanvas(600, 600);
    background(200);
    noLoop();
}

function draw() {
    translate(width/2, height/2);
    loadPixels();
    for (let x=0; x<=width; x++) {
        for (let y=0; y<=height; y++) {
            a=map(x, 0, width, -2.5, 1);
            b=map(y, 0, height, -1, 1);
            z=new Complex(a, b);
            f = (mand(z))
            //i = map(f,1,100,0,255);

            cR = Math.min(sqrt(f/100.0), 1);
            cG = Math.min(sqrt(f/50.0), 1);
            cB = Math.min(sqrt(f/10.0), 1);
            pixels[(x+y*width)*4]   = cR * 255;
            pixels[(x+y*width)*4+1] = cG * 255;
            pixels[(x+y*width)*4+2] = cB * 255; 
        }
    }
    updatePixels();
}

var Complex = function(a, b) {
    this.re=a;
    this.im=b;
    this.modSq=(a*a+b*b);
}

Complex.prototype.square = function() {
    a=sq(this.re)-sq(this.im);
    b=2*this.re*this.im;
    return new Complex(a, b);
}

function mand(c) {
    oldZ=new Complex(0, 0);
    for (let i=1; i<=100; i++) {
        newZ=oldZ.square();
        newZ.re+=c.re;
        newZ.im+=c.im;
        //newZ.re+= -0.70176;
        //newZ.im+= -0.3842;
        oldZ=newZ;
        if (oldZ.modSq>=4) {
            return i
        }
    }
    return 0
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/p5.js"></script>