Mandelbrot设置无法正确呈现

Bra*_*one 1 php math mandelbrot

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

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

以下是它现在的样子: 当前状态

这是我的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;
}
Run Code Online (Sandbox Code Playgroud)

这是整个代码:

<?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);
?>
Run Code Online (Sandbox Code Playgroud)

Dr.*_*ann 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 
Run Code Online (Sandbox Code Playgroud)