免责声明。我以前对分形一无所知,但一直想知道,所以我阅读了维基百科的文章并决定写下我在这里找到的内容。正如他们所说,如果您想了解某事,请尝试向其他人解释。;)
好的,我们将对复数进行运算。复数实际上是一对(实)数,因此,对于我们 php 程序员来说,让它成为一个二元素数组。
/// Construct a complex number from two reals
function cpl($re, $im) {
return array($re, $im);
}
现在我们需要告诉 php 如何对我们的复数进行算术运算。我们需要加法、乘法和 mod(“norm”)运算符。(有关详细信息,请参阅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
如果所有点都位于半径为 2 的圆内,则该点c
属于该集合。z = z^2 + c
- 我们从复数 z = (0, 0) 开始。
- 在每一步,我们计算 z = z * z + c。
- 如果
modulus of 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));
结果
当然,这段代码无效到了极点。它的唯一目的是理解数学概念。