| 
<?php
 // mandelbrot generation class v1.0
 // (c) copyright 2006 positive blue <[email protected]>
 // some rights reserved
 
 class Mandelbrot
 {
 // thats where all step coordinates are stored
 public $coArray = array();
 public $maxiter = 256;
 
 // picture width and height
 public $width = 800;
 public $height = 600;
 
 // palette and colors
 public $palette = array();
 public $colors = 64; // number of colors
 public $set_colors = false;
 
 // steps config
 private $steps;
 
 // this function loads coordinates from the file
 public function loadConfigFile($filename)
 {
 if (file_exists($filename))
 {
 $co = file($filename);
 
 // loop through each line and add coordinates
 foreach ($co as $n => $line)
 {
 // explode
 if (!empty($line))
 $this->coArray[] = explode(" ", trim($line));
 }
 
 $this->steps = count($this->coArray);
 return $this->steps;
 } else {
 // could not load file
 return false;
 }
 }
 
 // prepare image object
 private function initImage()
 {
 return imagecreatetruecolor($this->width, $this->height);
 }
 
 // this allocates palette in image object
 private function createPalette($img)
 {
 for ($i = 0; $i != $this->colors; $i++)
 {
 if (is_array($this->set_colors))
 {
 eval('$c1 = $i' . $this->set_colors[0] . ';');
 eval('$c2 = $i' . $this->set_colors[1] . ';');
 eval('$c3 = $i' . $this->set_colors[2] . ';');
 } else {
 $c1 = $i * 5;
 $c2 = $i + 3;
 $c3 = $i + 6;
 }
 
 $c1 = $c1 > 255 ? 255 : $c1; $c1 = $c1 < 1 ? 1 : $c1;
 $c2 = $c2 > 255 ? 255 : $c2; $c2 = $c2 < 1 ? 1 : $c2;
 $c3 = $c3 > 255 ? 255 : $c3; $c3 = $c3 < 1 ? 1 : $c3;
 
 $this->palette[$i] = imagecolorallocate($img, round($c1), round($c2), round($c3));
 $this->palette[($this->maxiter / 2 + 1) - $i] = $this->palette[$i];
 }
 return $palette;
 }
 
 // this function draws a step
 public function doStep($pic, $step = 0)
 {
 // set our vars
 $xmin = (float) $this->coArray[$step][0];
 $xmax = (float) $this->coArray[$step][1];
 $ymin = (float) $this->coArray[$step][2];
 $ymax = (float) $this->coArray[$step][3];
 
 $dx = ($xmax - $xmin) / $this->width;
 $dy = ($ymax - $ymin) / $this->height;
 
 $py = 0;
 $y = $ymin;
 
 while ($py < $this->height)
 {
 $px = 0;
 $x = $xmin;
 $py++;
 
 while ($px < $this->width)
 {
 $px++;
 
 $fx = 0;
 $fy = 0;
 $m = 0;
 
 while ((($fx * $fx + $fy * $fy) < 4) && ($m < $this->maxiter))
 {
 $old_x = $fx;
 $fx = ($fx * $fx) - ($fy * $fy) + $x;
 $fy = 2 * $old_x * $fy + $y;
 $m++;
 }
 
 $color = ($m == $this->maxiter + 1) ? 0 : $this->palette[$m % ($this->maxiter / 2 + 1)];
 
 imagesetpixel($pic, $px, $py, $color);
 
 $x += $dx;
 }
 
 $y += $dy;
 }
 }
 
 public function run($output_dir = '.')
 {
 for($i = 0; $i < count($this->coArray); $i++)
 {
 $img = $this->initImage();
 $this->createPalette(& $img);
 $this->doStep(& $img, $i);
 
 imagepng($img, $output_dir . '/img' . ($i + 1) . ".png");
 }
 }
 }
 
 ?>
 |