<?php
/**
 *  「カオスの数学」(東京図書 芹沢浩著)を参考にしてPHPに移植しました
 *  以下のPHPのコードは修正BSDライセンスとして配布します
 *
 *  @author     Nob Funaki <http://zuzara.com/>
 */
header('Content-Type: image/png');
$im imagecreate(400400);
imagecolorallocate($im255255255);
$color imagecolorallocate($im000);

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 cos(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 = -$dx;
$y_min = -$dy;
$x_max $dx;
$y_max $dy;
$A1 = ($x_max $x_min) / ($dsx);
$A2 = ($y_max $y_min) / ($dsy);
$B1 = ($x_max $x_min) / 2;
$B2 = ($y_max $y_min) / 2;

$ksx sqrt(($a) / 2);
$ksy sqrt(($a) / 2);

$x $x0;
$y $y0;
for (
$n 0$n NL$n++) {
    
//  漸化式を解く(与えられた式をあてはめる)
    
$xx $a $x $b $y $c $d / ($x $x);
    
$yy = -$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 = (-* ($x $B1) / $A1 + ($y $B2) / $A2) / sqrt(2.0) * $ksy;
    if (
abs($sx) <= $dsx && abs($sy) <= $dsy) {
        
imagesetpixel($im$sx+200$sy+200$color);
    }
}
?>