Кривая Минковского — классический геометрический фрактал, предложенный Минковским. Инициатором является отрезок, а генератором является ломаная из восьми звеньев (два равных звена продолжают друг друга) — см. рис.
<?php
$i = 2;
$image = imagecreatetruecolor(600, 400);
imagefilledrectangle($image, 0, 0, imagesx($image) - 1, imagesy($image) - 1,
imagecolorresolve($image, 255, 255, 255));
$color = imagecolorresolve($image, 0, 0, 0);
drawMinkowski($image, 0, imagesy($image) / 2, imagesx($image), imagesy($image) / 2, $i, $color);
/**
* Draws minkowski curve between two points.
* @return void
*/
function drawMinkowski($image, $xa, $ya, $xi, $yi, $i, $color) {
if($i == 0)
imageline($image, $xa, $ya, $xi, $yi, $color);
else {
// C---D
// | |
// A---B E H---I
// | |
// F---G
$xb = $xa + ($xi - $xa) * 1/4;
$yb = $ya + ($yi - $ya) * 1/4;
$xe = $xa + ($xi - $xa) * 2/4;
$ye = $ya + ($yi - $ya) * 2/4;
$xh = $xa + ($xi - $xa) * 3/4;
$yh = $ya + ($yi - $ya) * 3/4;
$cos90 = 0;
$sin90 = -1;
$xc = $xb + ($xe - $xb) * $cos90 - $sin90 * ($ye - $yb);
$yc = $yb + ($xe - $xb) * $sin90 + $cos90 * ($ye - $yb);
$xd = $xc + ($xe - $xb);
$yd = $yc + ($ye - $yb);
$sin90 = 1;
$xf = $xe + ($xh - $xe) * $cos90 - $sin90 * ($yh - $ye);
$yf = $ye + ($xh - $xe) * $sin90 + $cos90 * ($yh - $ye);
$xg = $xf + ($xh - $xe);
$yg = $yf + ($yh - $ye);
drawMinkowski($image, $xa, $ya, $xb, $yb, $i - 1, $color);
drawMinkowski($image, $xb, $yb, $xc, $yc, $i - 1, $color);
drawMinkowski($image, $xc, $yc, $xd, $yd, $i - 1, $color);
drawMinkowski($image, $xd, $yd, $xe, $ye, $i - 1, $color);
drawMinkowski($image, $xe, $ye, $xf, $yf, $i - 1, $color);
drawMinkowski($image, $xf, $yf, $xg, $yg, $i - 1, $color);
drawMinkowski($image, $xg, $yg, $xh, $yh, $i - 1, $color);
drawMinkowski($image, $xh, $yh, $xi, $yi, $i - 1, $color);
}
}
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>