Object Oriented PHP 5 Mandelbrot Machine

<?
/*////////////////////////////////////
Notice
Please keep the folowing notice attached to the code in any case
Object Oriented PH5 5 Mandelbrot Machine
François PASCAL 2004-2005, v.1.1
http://www.floconsdepaques.com
Free and Open source but not resellable.
You can download this code, try it, use it, modify it and share it, as long as :
- you don't make money of it (you can not sell it, neither include on anything (web, CD, ...) sold or of access restricted to paying customers ;
- you must not remove the term : "D'apres/From Francois PASCAL, www.floconsdepaques.com", even on modified versions;
- you must give proper credit using the same terms on any support using it (web, CD, ...).
- you must keep this notice attached to the code whatever you do to the code, including modifying it.
End of notice
Feedbak welcome.
This code may be upgraded if I find some time.
This is version 1.1, ISO 2005-04-30.
*/ ///////////////////////////////////

?>

<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=UTF-8">
		<meta NAME="description" CONTENT="PHP 5 Objet-Oriented Mandelbrot Machine">
		<meta NAME="keywords" CONTENT="PHP 5, Mandelbrot set">

		<title>Object-Oriented-Php-Mandelbrot</title>
		<link href="http://www.floconsdepaques.com/easterflakes.css" rel="stylesheet" media="screen">
	</head>

<body>
<div align="center">
	<h1>Object Oriented PHP 5 Mandelbrot Machine</h1>

<?php

/// Bride pour la version Web.
/// Commentez cette section pour débrider.
/// Attention ! Attention ! Si vous débridez les ligne suivantes sur un serveur web public, et qu'un moteur de recherche parse
/// cette page et réclame simultanément le calcul des 100 zooms qu'elle contient, plantage garanti et expulsion certaine !
/// Vous êtes prévenu !
/*
	$fp = fopen("webcontrol.txt", "r");
	$t = fread($fp, 100);

	if ($t + 120 > time()) 			// On limite le nombre de fractales calculées à une toutes les 120 secondes
		{
		?>
		<div style="margin:50px">
			<p><font size="+2" color="red">Attention !</font></p>
			<p>Ce programme est très gourmant en ressources processeur. <br />
			Par mesure de protection technique, la version Web de ce programme est bridée. <br />
			L'intervale de temps minimum entre le calcul de deux fractale est limité à deux minutes. <br /><br />
			Si vous lisez ce message, c'est que vous n'avez pas attendu assez longtemps entre le calcul dela précédente fractale et celui-ci, ou qu'un autre visiteurs a réclamé avant vous le calcul d'une fractale. <br />Retentez votre chance dans quelques minutes ou un autre moment moins encombré de la journée !</p>
		</div>
		</div>
		<?php
		include ("$DOCUMENT_ROOT/zpied.php");
		exit;
		}
	else
		{
		fclose($fp);
		$fp = fopen("webcontrol.txt", "w");
		fwrite($fp, time());
		}
	fclose($fp);
*/
/// Fin de Bride pour la version Web



$SGx = "0";
$SGy = "0";
$Lx  = "200";
$Ly  = "200";

class PlanCartesien
	{
	var $SGx;		// partie réelle du point supérieur gauche
	var $SGy;		// partie imaginaire du point supérieur gauche
	var $Long; 		// interval réel de gauche à droite (et de haut en bas, l'image étant supposée carrée)
	var $NbrePix;	// nombre de pixels pour chaque largeur de l'image (supposée carrée)
	var $r;			// réel calculé
	var $i;			// imaginaire calculé
	var $kolor;		// couleur calculée

	function __construct()				// Initialisation - Attribue des valeurs par défaut
		{
		$this->SGx 		= -2.2;
		$this->SGy 		= 1.5;
		$this->Long		= 3;
		$this->NbrePix	= 200;
		$this->BailOut	= 30;
		$this->NbreIter	= 32;
		}

	function initialise($a, $b, $c, $d, $e, $f, $g, $h)	// Remplace les valeurs par défaut
		{
	   	$this->SGx 		= $c;
		$this->SGy 		= $d;
		$this->Long		= $e;
	 	$this->SGx 		= $this->SGx + $b*$this->Long/10;
		$this->SGy 		= $this->SGy - $a*$this->Long/10;
		$this->Long		= $this->Long/10;
		$this->NbrePix	= $f;
		$this->BailOut		= $g;
		if ($h <= 32) { $h = 32; }				// Au minimum, 32 itérations
		if ($h > 32 AND $h <= 64) { $h = 64; }	// ... puis multiples de 32 pour les zones externes
		if ($h > 64 AND $h <= 128) { $h = 128; }
		if ($h > 128 AND $h <= 255) { $h = 255; }
		$this->NbreIter	= $h;
		}

	function pixel2point($a, $b)		// Calcul un point à partir de ses coordonnées en pixels par rapport au bord supérieur gauche
		{
	 	$this->r = $this->SGx + ($this->Long/$this->NbrePix)*$a;
		$this->i = $this->SGy - ($this->Long/$this->NbrePix)*$b;
		}

	function r() 		{ return $this->r; }		// Retourne le réel du point passé
	function i()		{ return $this->i; }		// Retourne l'imaginaire du point passé
	function SGx()		{ return $this->SGx; }		// Retourne le réel du point passé
	function SGy()		{ return $this->SGy; }		// Retourne l'imaginaire du point passé
	function Long()		{ return $this->Long; }		// Retourne le réel du point passé
	function NbrePix()	{ return $this->NbrePix; }	// Retourne le nombre de pixels de l'image
	function BailOut()	{ return $this->BailOut; }	// Retourne l'infini
	function NbreIter()	{ return $this->NbreIter; }	// Retourne le nombre d'itérations

	function calcul($t, $x, $y, $bailO, $multip, $iters)
		{


		$X = $x*$x - $y*$y + $this->r;
		$Y = 2*$x*$y + $this->i;
		$t++;

		$r = $X*$X + $Y*$Y;
		// echo round($r,0)." ";	// Debug
		if ($r > $bailO)
			{
			$n = $t*$multip;
			if ($n > 255)
				{
			//    	$sn = round(fmod($sn,128)*128+127), 0);	// Trop long pour le web ; OK en local
				$n = 255;								// A utiliser pour le web
				}
			$this->kolor = $n;
			}
		elseif ($t >= $iters)
			{
			echo ""; 	// Debug
			$this->kolor = 0;
			}
		else
			{
			$this->calcul($t, $X, $Y, $bailO, $multip, $iters);
			}
		}

	function couleur()
		{
		$k = 0;
		$x = 0;
		$y = 0;

		// Pour les petites valeurs de NbreIter on rassemble les couleurs par bandes
		if ($this->NbreIter == 32) { $multiplicande = 8; }
		if ($this->NbreIter == 64) { $multiplicande = 4; }
		if ($this->NbreIter == 128) { $multiplicande = 2; }
		if ($this->NbreIter >= 255) { $multiplicande = 1; }

		$this->calcul($k, $x, $y, $this->BailOut, $multiplicande, $this->NbreIter);
		return $this->kolor;
		}

	}


$plan = new PlanCartesien();

if ($_GET["HV"] != "") 				// C'est-à-dire si ce n'est pas le premier appel de la page
	{
			// A finir
	$H = substr($_GET["HV"],0,1);
	$V = substr($_GET["HV"],1,1);
	$SGx = $_GET["SGx"];
	$SGy = $_GET["SGy"];
	$long = $_GET["Long"];
	$sizeDoMatter = $_GET["sizeDoMatter"];
	$infini = $_GET["infini"];
	$iterations = $_GET["iterations"];

	// Bride web
	// Pour supprimer la bride, commentez les trois lignes qui suivent, ou l'une ou l'autre
		// $sizeDoMatter = 200;
		// $infini = 30;
		// $iterations = 32;
	// Fin de : bride web

	$plan->initialise($H, $V, $SGx, $SGy, $long, $sizeDoMatter, $infini, $iterations);
	}
else
	{
	$sizeDoMatter = 200;
	$infini = 30;
	$iterations = 32;
	}


$ligne = 0;
while($ligne < 10)			// On dessine ligne par ligne ...
	{
	$colonne = 0;
	while($colonne < 10)		// ... et de gauche à droite
		{

		$image = imagecreatetruecolor($plan->NbrePix()/10,$plan->NbrePix()/10);

		$y = 0;
		while($y < $plan->NbrePix()/10)			// On dessine ligne par ligne ...
			{
			$x = 0;
			while($x < $plan->NbrePix()/10)		// ... et de gauche à droite
				{
				$plan->pixel2point(($colonne*$plan->NbrePix()/10)+$x, ($ligne*$plan->NbrePix()/10)+$y);
				$couleur = $plan->couleur();

				// On tire les traits de separation des carreaux
				if ($x == $plan->NbrePix()/10-1 OR $y == $plan->NbrePix()/10-1)
					{
					if ($couleur < 235)
						{
						$couleur = $couleur + 20;
						}
					}

				$color = imagecolorallocate($image, $couleur, $couleur, $couleur);
				imagesetpixel($image, $x, $y, $color);
				$x++;
				}
			$y++;
			}
		imagepng($image,$ligne.$colonne.".png");

		$colonne++;
		}
	$ligne++;
	}


?>



	<h2>Mode d'emploi</h2>
	<p>Au premier lancement, le script calcul une image de départ.</p>
	<p>A) Cliquez sur l'un des carreaux pour  zoomer sur la portion correspondante.<br>B) Infini : permet d'accroître la limite utilisée pour évaluer si un point diverge vers l'infini. Max : 256<br>
	C) Itérations : plus ce nombre est élevé, plus les contours de l'ensemble de Mandelbrot sont fin.<br>D) Taille de l'image (en pixels). L'image est carrée.</p>
	<p>Dans la version  Web, les paramètres B, C et D sont bridés.<br />
	En outre, vous devez attendre deux minutes entre deux recalculs, et un seul visiteur peut, simultanément, réclamer un calcul.</p>
	<p></p>
	<div align="center">
		<table width="<?= $plan->NbrePix() ?>" border="0" cellspacing="0" cellpadding="0" height="<?= $plan->NbrePix() ?>">

		<?php

		$ligne = 0;
		while($ligne < 10)			// On dessine ligne par ligne ...
			{
			?>
			<tr>
			<?php
			$colonne = 0;
			while($colonne < 10)		// ... et de gauche à droite
				{
				?>
				<td>
					<a href="mandel2005prog.php?&sizeDoMatter=<?= $sizeDoMatter ?>&infini=<?= $infini ?>&iterations=<?= $iterations ?>&HV=<?= $ligne.$colonne ?>&SGx=<?= $plan->SGx() ?>&SGy=<?= $plan->SGy() ?>&Long=<?= $plan->Long() ?>">
					<img src="<?= $ligne.$colonne ?>.png" border="0" width="<?= $plan->NbrePix()/10 ?>" height="<?= $plan->NbrePix()/10 ?>">	</a>
				</td>
				<?php
				$colonne++;
				}
			?>
			</tr>
			<?php
			$ligne++;
			}

		?>

		</table>
			<br>
			<form action="" method="get" name="FormName">
			<div align="center">
				<p>Infini : <input type="text" name="infini" size="5" maxlength="5" value="<?= $infini ?>"> Itérations* :
					<select name="iterations" size="1">
						<option value="32"></option>
						<option value="32" <? if ( $iterations == 32) echo "selected"; ?>>32</option>
						<option value="64" <? if ( $iterations == 64) echo "selected"; ?>>64</option>
						<option value="128" <? if ( $iterations == 128) echo "selected"; ?>>128</option>
						<option value="255" <? if ( $iterations == 256) echo "selected"; ?>>256</option>
					</select> Taille de l'image** :
					<select name="sizeDoMatter" size="1">
						<option value="200"></option>
						<option value="100" <? if ( $plan->NbrePix() == 100) echo "selected"; ?>>100</option>
						<option value="200" <? if ( $plan->NbrePix() == 200) echo "selected"; ?>>200</option>
						<option value="300" <? if ( $plan->NbrePix() == 300) echo "selected"; ?>>300</option>
						<option value="400" <? if ( $plan->NbrePix() == 400) echo "selected"; ?>>400</option>
						<option value="750" <? if ( $plan->NbrePix() == 750) echo "selected"; ?>>750</option>
						<option value="1000" <? if ( $plan->NbrePix() == 1000) echo "selected"; ?>>1000</option>
					</select>
				<input type="hidden" name="HV" value="<? if ( $H.$V == "") { echo "00"; } else { echo $H.$V; } ?>">
				<input type="hidden" name="SGx" value="<?= $SGx ?>">
				<input type="hidden" name="SGy" value="<?= $SGy ?>">
				<input type="hidden" name="Long" value="<?= $plan->long()*10 ?>"> <input type="submit" name="submitButtonName" value="Envoyer"></p>
			</div>
		</form>
		</div>

		<p>* minimum 32<br>
			** doit être un multiple de 10.<br>
			<br>
			D'apres / From : François PASCAL, <a href="http://www.floconsdepaques.com">www.floconsdepaques.com</a></p>

</div>
</body>
</html>

Cette page utilise le script Syntax Highlighter © 2011 Dream Projections sous license MIT

Easter Flakes • Flocons de Pâques | Nous contacter
© Easter Flakes - 2007. Tous droits réservés sur toutes images, textes et codes. Valid XHTML 1.0 Transitional