gpt4 book ai didi

php - 分形解释

转载 作者:可可西里 更新时间:2023-11-01 13:36:03 28 4
gpt4 key购买 nike

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

我真的想不出如何将数学公式映射到一段绘制图片的代码。
给定 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;
}

代码并不完整,为简洁起见,只展示了主要的迭代部分。

所以问题是:有人可以向我解释数学与代码的比较吗?

编辑:明确地说,我找到了很多解释数学的资源,还有很多显示代码的资源,但我找不到对这两者结合的很好的解释。

最佳答案

免责声明。我以前对分形一无所知,但一直想知道,所以我读了 wikipedia article并决定写下我在这里找到的东西。正如他们所说,如果您想了解某事,请尝试向其他人解释。 ;)

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

    /// Construct a complex number from two reals
function cpl($re, $im) {
return array($re, $im);
}

现在我们需要告诉 php 如何对我们的复数进行算术运算。我们需要加法、乘法和 mod(“范数”)运算符。 (有关详细信息,请参阅 http://mathworld.wolfram.com/topics/ComplexNumbers.html)。

    /// Add two complex numbers.
function cadd($p, $q) {
return cpl(
$p[0] + $q[0],
$p[1] + $q[1]);
}

/// Multiply two complex numbers.
function cmul($p, $q) {
return cpl(
$p[0] * $q[0] - $p[1] * $q[1],
$p[0] * $q[1] + $p[1] * $q[0]);
}

/// Return the norm of the complex number.
function cmod($p) {
return sqrt($p[0] * $p[0] + $p[1] * $p[1]);
}

现在我们编写一个函数,如果给定的(复数)点 $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));

结果

alt text

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

关于php - 分形解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725522/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com