Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生成Mandelbrot集的几个问题_Javascript_Processing_P5.js_Mandelbrot - Fatal编程技术网

Javascript 生成Mandelbrot集的几个问题

Javascript 生成Mandelbrot集的几个问题,javascript,processing,p5.js,mandelbrot,Javascript,Processing,P5.js,Mandelbrot,我编写了一个处理程序来生成mandelbrot集,并取得了成功,但一旦我将c更改为常数复数,我就无法用我的程序获得任何模式。我一定是有一个盲点,因为我似乎无法调试我的程序。大家能给我一些建议吗?谢谢 在mand函数中注释掉的行是我试图改变c值的方式,但到目前为止,除了生成Mandelbrot集之外,我从未获得任何类型的模式 function setup() { createCanvas(600, 600); background(200); noLoop(); } function

我编写了一个处理程序来生成mandelbrot集,并取得了成功,但一旦我将c更改为常数复数,我就无法用我的程序获得任何模式。我一定是有一个盲点,因为我似乎无法调试我的程序。大家能给我一些建议吗?谢谢

在mand函数中注释掉的行是我试图改变c值的方式,但到目前为止,除了生成Mandelbrot集之外,我从未获得任何类型的模式

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);
      pixels[(x+y*width)*4]=sqrt(f/100);
      pixels[(x+y*width)*4+1]=255;
      pixels[(x+y*width)*4+2]=150;

    }
  }
  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
}
函数设置(){
createCanvas(600600);
背景(200);
noLoop();
}
函数绘图(){
平移(宽度/2,高度/2);
loadPixels();

对于(设x=0;x颜色通道的值必须在[0255]的范围内)。分形函数的结果
f
是任意数字,大多数结果是低于1.0的数字,但函数返回的数字也非常高。
您必须将该值映射到像素颜色的颜色

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

cR=Math.min(sqrt(f/100.0),1);
cG=数学最小值(sqrt(f/50.0),1);
cB=数学最小值(sqrt(f/10.0),1);
最后将它们映射到范围[0255]:

像素[(x+y*宽度)*4]=cR*255;
像素[(x+y*宽度)*4+1]=cG*255;
像素[(x+y*宽度)*4+2]=cB*255;
请参见示例,其中我将更改应用于原始代码:

函数设置(){
createCanvas(600600);
背景(200);
noLoop();
}
函数绘图(){
平移(宽度/2,高度/2);
loadPixels();

对于(设x=0;x目前,每个像素颜色之间的变化是不可察觉的,因为mand()的返回值是1或0,因此,最终,像素的红色值只能是0或0.1。我们还缺少其他代码吗?@Julian No.
mad
的结果是任何数字。大多数数字都在[0,1]范围内土地的结果是0到100,然后除以100,再除以sqrt.Sri,最后的颜色是修饰语0或1@HimChan你说得对!这是一个i,我以为是一个1。尽管如此,这一点仍然成立。这是一个很好的答案,具体涵盖了所问的问题。我认为值得指出的是,为了在场景中使用像素阵列如果像素密度大于1,则在每个x y坐标上也必须考虑1个以上的像素。例如,如果像素密度为2,则如果我们将高度和宽度乘以2,则上述代码将正常工作。