*/ header('Content-Type: image/png'); $im = imagecreate(400, 400); imagecolorallocate($im, 255, 255, 255); $color = imagecolorallocate($im, 0, 0, 0); define('NL', 60000); // 点列計算の繰り返し回数 // 画面描画領域の半幅 $sx = 0; $sy = 0; $dsx = 192; $dsy = 192; $x_min = 0; $y_min = 0; $x_max = 0; $y_max = 0; // 数字が小さいほど拡大 $dx = 16.0; $dy = 16.0; // パラメーター(これらを変化させることで違う模様が描かれる) $p = array_key_exists('p', $_GET) ? $_GET['p'] : false; $q = array_key_exists('q', $_GET) ? $_GET['q'] : false; if ($p !== false && $q !== false) { $a = 2 * cos(2 * M_PI * $p / $q); } else { $a = array_key_exists('a', $_GET) ? $_GET['a'] : 1; } $b = array_key_exists('b', $_GET) ? $_GET['b'] : 1; $c = array_key_exists('c', $_GET) ? $_GET['c'] : 0; $d = array_key_exists('d', $_GET) ? $_GET['d'] : 15.0; // 初期値 $x0 = array_key_exists('x0', $_GET) ? $_GET['x0'] : 0.1; $y0 = 0.0; // 座標変換係数の取得 $x_min = -1 * $dx; $y_min = -1 * $dy; $x_max = $dx; $y_max = $dy; $A1 = ($x_max - $x_min) / (2 * $dsx); $A2 = ($y_max - $y_min) / (2 * $dsy); $B1 = ($x_max + $x_min) / 2; $B2 = ($y_max + $y_min) / 2; $ksx = sqrt((2 + $a) / 2); $ksy = sqrt((2 - $a) / 2); $x = $x0; $y = $y0; for ($n = 0; $n < NL; $n++) { // 漸化式を解く(与えられた式をあてはめる) $xx = $a * $x + $b * $y + $c + $d / (1 + $x * $x); $yy = -1 * $x; plot($xx, $yy); $x = $xx; $y = $yy; } imagepng($im); exit; function plot($x, $y) { global $im, $color, $A1, $B1, $A2, $B2, $ksx, $ksy, $dsx, $dsy; $sx = (($x - $B1) / $A1 + ($y - $B2) / $A2) / sqrt(2.0) * $ksx; $sy = (-1 * ($x - $B1) / $A1 + ($y - $B2) / $A2) / sqrt(2.0) * $ksy; if (abs($sx) <= $dsx && abs($sy) <= $dsy) { imagesetpixel($im, $sx+200, $sy+200, $color); } } ?>