Mandelbrot 集无法正确呈现

Mandelbrot set won't render correctly

我目前正在尝试制作动画 Mandelbrot 集合可视化。但现在它甚至无法正确渲染单个帧。

我不知道我哪里弄错了。我想 math.Will 中有错误请您看一下?

这是现在的样子:

这是我的 mandelbrot 函数:

function mandelbrot($a, $b, $limit) {
  $a_orig = $a;
  $b_orig = $b;
  $count = 0;

  while(($count < $limit) && (sqrt(($a * $a) + ($b * $b)) <= 2)) {
    $a = ($a * $a) - ($b * $b) + $a_orig;
    $b = (2 * $a * $b) + $b_orig;

    $count++;
  }

  return $count;
}

这是完整的代码:

<?php

function HSVtoRGB(array $hsv) {
    list($H,$S,$V) = $hsv;
    //1
    $H *= 6;
    //2
    $I = floor($H);
    $F = $H - $I;
    //3
    $M = $V * (1 - $S);
    $N = $V * (1 - $S * $F);
    $K = $V * (1 - $S * (1 - $F));
    //4
    switch ($I) {
        case 0:
            list($R,$G,$B) = array($V,$K,$M);
            break;
        case 1:
            list($R,$G,$B) = array($N,$V,$M);
            break;
        case 2:
            list($R,$G,$B) = array($M,$V,$K);
            break;
        case 3:
            list($R,$G,$B) = array($M,$N,$V);
            break;
        case 4:
            list($R,$G,$B) = array($K,$M,$V);
            break;
        case 5:
        case 6: //for when $H=1 is given
            list($R,$G,$B) = array($V,$M,$N);
            break;
    }
    return array($R, $G, $B);
}

function mandelbrot($a, $b, $limit) {
  $a_orig = $a;
  $b_orig = $b;
  $count = 0;

  while(($count < $limit) && (sqrt(($a * $a) + ($b * $b)) <= 2)) {
    $a = ($a * $a) - ($b * $b) + $a_orig;
    $b = (2 * $a * $b) + $b_orig;

    $count++;
  }

  return $count;
}

ini_set("max_execution_time", 0);

header ("Content-Type: image/gif");

$num_frames = 60;
$size = 1024;
$points = array($size);

$image = imagecreate($size, $size);

for($j = 0; $j <= $num_frames; $j++) {
  $tmp_color = HSVtoRGB(array(($j + 1) / ($num_frames + 1), 1, 1));
  $color[$j] = imagecolorallocate($image, $tmp_color[0] * 255, $tmp_color[1] * 255, $tmp_color[2] * 255);
}

for($x = 0; $x < $size; $x++) {
  for($y = 0; $y < $size; $y++) {
    imagesetpixel($image, $x, $y, $color[mandelbrot(-2 + ($x * 2.7 / ($size - 1)), -1.35 + ($y * 2.7 / ($size - 1)), $num_frames)]);
  }
}

imagegif($image);

imagedestroy($image);
?>

你的复数平方是错误的。在计算 b 时,您正在覆盖 a 的旧值。所以把它保存在一个临时变量中。

此外,60次迭代的救助值很小,200次更适合这个规模,对于更详细的图像,应该合理快速增加。

使用a*a+b*b < 4代替不必要的平方根。可以重新使用 a*ab*b 的值,这也可以解决临时变量的问题。

norm=10
while ... and norm < 4
    a2=a*a
    b2=b*b
    norm=a2+b2
    b=2*a*b+b_orig
    a=a2-b2+a_orig
end