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