Php 分形解释

Php 分形解释,php,fractals,mandelbrot,Php,Fractals,Mandelbrot,一段时间以来,我一直对分形、分形背后的数学以及分形产生的视觉效果感兴趣 我真的搞不懂如何将数学公式映射到一段代码来绘制图片。 对于mandelbrot集,给出以下公式:Pc(z)=z*z+c 这与以下代码相比如何: $outer_adder = ($MaxIm - $MinIm) / $Lines; $inner_adder = ($MaxRe - $MinRe) / $Cols; for($Im = $MinIm; $Im <= $MaxIm; $Im += $outer_adder)

一段时间以来,我一直对分形、分形背后的数学以及分形产生的视觉效果感兴趣

我真的搞不懂如何将数学公式映射到一段代码来绘制图片。
对于mandelbrot集,给出以下公式:
Pc(z)=z*z+c

这与以下代码相比如何:

$outer_adder = ($MaxIm - $MinIm) / $Lines;
$inner_adder = ($MaxRe - $MinRe) / $Cols;
for($Im = $MinIm; $Im <= $MaxIm; $Im += $outer_adder)
{
  $x=0;
  for($Re = $MinRe; $Re <= $MaxRe; $Re += $inner_adder)
  {
    $zr = $Re;
    $zi = $Im;
    for($n = 0; $n < $MaxIter; ++$n)
    {
      $a = $zr * $zr;
      $b = $zi * $zi;
      if($a + $b > 2) break;
      $zi = 2 * $zr * $zi + $Im;
      $zr = $a - $b + $Re;
    }
    $n = ($n >= $MaxIter ? $MaxIter - 1 : $n);
    ImageFilledRectangle($img, $x, $y, $x, $y, $c[$n]);
    ++$x;
  }
  ++$y;
}
$outer_adder=($MaxIm-$MinIm)/$line;
$inner_adder=($MaxRe-$MinRe)/$Cols;
对于($Im=$MinIm;$Im=$MaxIter?$MaxIter-1:$n);
ImageFilledRectangle($img,$x,$y,$x,$y,$c[$n]);
++$x;
}
++$y;
}
代码并不完整,只是为了简洁起见显示了主要的迭代部分

所以问题是:有人能给我解释一下数学和代码的比较吗


编辑:要清楚,我已经找到了几十个解释数学的资源,还有几十个显示代码的资源,但我找不到对两者结合的好解释。

免责声明。我以前对分形一无所知,但我一直想知道,所以我读了这本书,决定写下我在这里发现的东西。 正如他们所说,如果你想理解某件事,试着向别人解释

好的,我们将对复数进行运算。复数实际上是一对(实数)数,因此,对于我们php程序员来说,让它成为两个元素的数组

    /// Construct a complex number from two reals
    function cpl($re, $im) {
        return array($re, $im);
    }
现在我们需要告诉php如何对复数进行算术运算。我们需要加法、乘法和mod(“norm”)运算符。(有关更多详细信息,请参阅)

现在我们编写一个函数,如果给定的(复数)点$c属于mandelbrot集,则返回true

如果所有点
z=z^2+c
位于半径为2的圆内,则点
c
属于集合

  • 我们从复数z=(0,0)开始
  • 每一步我们计算z=z*z+c
  • 如果z的模
    为2-也就是说,我们不在圆内-点不在集合中
  • 否则,重复该步骤
要防止循环无限,请限制最大迭代次数

    function is_in_mandelbrot_set($c, $iterations) {
        $z = cpl(0, 0);
        do {
            if(cmod($z) >= 2)
                return false;
            $z = cadd(cmul($z, $z), $c);
        } while($iterations--);
        return true;
    }
其余的与数学无关,这是显而易见的

    function mandelbrot($img, $w, $h) {
        $color = imagecolorallocate($img, 0xFF, 0, 0);
        $zoom = 50;
        $iters = 30;

        for($x = 0; $x < $w; $x++) {
            for($y = 0; $y < $h; $y++) {

                // scale our integer points 
                // to be small real numbers around 0

                $px = ($x - $w / 2) / $zoom;
                $py = ($y - $h / 2) / $zoom;

                $c = cpl($px, $py);

                if(is_in_mandelbrot_set($c, $iters))
                    imagesetpixel($img, $x, $y, $color);
            }
        }

        return $img;
    }

    $w = 200;
    $h = 200;

    header("Content-type: image/png");
    imagepng(
        mandelbrot(
            imagecreatetruecolor($w, $h), $w, $h));
函数mandelbrot($img,$w,$h){
$color=imagecolorallocate($img,0xFF,0,0);
$zoom=50;
$iters=30;
对于($x=0;$x<$w;$x++){
对于($y=0;$y<$h;$y++){
//调整我们的整数点
//是0左右的小实数
$px=($x-$w/2)/$zoom;
$py=($y-$h/2)/$zoom;
$c=cpl($px,$py);
如果(是否为mandelbrot集合($c$iters))
imagesetpixel($img,$x,$y,$color);
}
}
返回$img;
}
$w=200;
$h=200;
标题(“内容类型:图像/png”);
图像PNG(
曼德布罗特(
ImageCreateTureColor($w,$h),$w,$h));
结果

当然,这个代码是无效的到了极点。它的唯一目的是理解数学概念

    function mandelbrot($img, $w, $h) {
        $color = imagecolorallocate($img, 0xFF, 0, 0);
        $zoom = 50;
        $iters = 30;

        for($x = 0; $x < $w; $x++) {
            for($y = 0; $y < $h; $y++) {

                // scale our integer points 
                // to be small real numbers around 0

                $px = ($x - $w / 2) / $zoom;
                $py = ($y - $h / 2) / $zoom;

                $c = cpl($px, $py);

                if(is_in_mandelbrot_set($c, $iters))
                    imagesetpixel($img, $x, $y, $color);
            }
        }

        return $img;
    }

    $w = 200;
    $h = 200;

    header("Content-type: image/png");
    imagepng(
        mandelbrot(
            imagecreatetruecolor($w, $h), $w, $h));