<?php 
// Julia set visualiser - a quick and dirty way of producing an image
// of a Julia set on the complex plane.

// Note that complex numbers are represented as arrays with two elements:
// array(x,y) means the complex number x+iy

if (magic_type() != 'direct') die;
set_time_limit(600);

// Constants to be used
define('WIDTH'500);
define('HEIGHT'500);

// Collect the variable c, should be in the form x+yi (or just x+y).
// The + is replaced by a space in URI decoding.
if (!empty($uri[1])) $c explode(' 'rtrim($uri[1], 'i/'));
else 
$c = array(-1,0); // Default point c=-1

// Calculate the radius
$r max(mod($c), 2);

// This is the function f_c for the given c above.
function f($z)
{
    global 
$c;
    
$x $z[0];
    
$y $z[1];
    
    return array(
$x*$x $y*$y $c[0], 2*$x*$y $c[1]);
}

// Simple function to calculate the modulus of a complex number
function mod($z)
{
    return 
sqrt($z[0]*$z[0] + $z[1]*$z[1]);
}

// Create an image template
$img = @imagecreatetruecolor(WIDTHHEIGHT);

// Iterate through all possible co-ordinates (x,y).
// Note that in PHP (0,0) corresponds to the top left corner, so we need
// to mod this out to get a proper axis.
for ($x 0$x <= WIDTH$x++)
{
    for (
$y 0$y <= HEIGHT$y++)
    {
        
// Set the value z depending on the region on the graph
        
$z = array((2*$r*$x)/WIDTH $r, (2*$r*$y)/HEIGHT $r);
        
        if (
mod($z) >= $r)
        {
            
            
$col imagecolorallocate($img25500);
            
imagesetpixel($img$x$y$col);
        }
        else for (
$i 1$zz $z$i <= 10$i++) // Iterate f(z) ten times
        
{
            
$zz f($zz);
            
            if (
mod($zz) >= $r// z is in the escape set, we're done
            
{
                
$col imagecolorallocate($imground((10-$i)*25.5),($i/10)*255,0); // Pretty colours
                
imagesetpixel($img$x$y$col);
                break;
            }
        }
    }
}

// Finally, produce the finished image
header('Content-type: image/png');
imagepng($img);