Mandelbrot设置无法正确呈现

时间:2015-02-12 22:56:28

标签: php math mandelbrot

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

我不知道我犯了哪些错误。我猜数学中有错误。请你看一下吗?

以下是它现在的样子:Current state

这是我的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);
?>

1 个答案:

答案 0 :(得分:5)

你的复数方块是错误的。在b的计算中,您将覆盖再次需要它的旧值。所以将它保存在一个临时变量中。

此外,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