<? /*//////////////////////////////////// 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.