Bonjour,
je souhaite adapter ce script qui additionne 2 valeurs pour générer un camembert dynamique en un script qui additionne 3 valeurs.
le fichier source du script sort d'ici:
http://www.software-ds.com/PHP/Camembert-2D-3D/demo-camembert.php
voici les trois fichiers du script :
Modifié par jeromei (17 Jun 2008 - 21:49)
je souhaite adapter ce script qui additionne 2 valeurs pour générer un camembert dynamique en un script qui additionne 3 valeurs.
le fichier source du script sort d'ici:
http://www.software-ds.com/PHP/Camembert-2D-3D/demo-camembert.php
voici les trois fichiers du script :
a écrit :
le premier: camembert.php
<?php
class camembert {
var $dim; # dim de position dans le tableau
var $tabVal; # tableau des valeurs
var $tabNom; # tableau des noms
var $tot; # total des valeurs
### camembert : constructeur / initialisation
function camembert() {
$this->dim = 0;
$this->tot = 0;
$this->tabVal=array();
$this->tabNom=array();
} # fin camembert
### add_tab : ajoute une donnee au tableau (valeur + libelle)
function add_tab($val, $nom) {
if ($val > 0) {
$this->tabVal[$this->dim] = $val;
$this->tabNom[$this->dim] = $nom;
$this->tot = $this->tot + $val; # calcul du total
$this->dim++; # MAJ de l'dim
}
} # fin add_tab
### trier_tab : trie le tableau par ordre decroissant
function trier_tab() {
if ($this->dim > 1) { # tri necessaire ?
for($i=0;$i<$this->dim-1;$i++) {
$maxi = $this->tabVal[$i];
for($j=$i+1;$j<$this->dim;$j++) {
if ($maxi < $this->tabVal[$j]) { # on echange les positions dans le tableau
$maxi = $this->tabVal[$j];
$inter = $this->tabNom[$j];
$this->tabVal[$j] = $this->tabVal[$i];
$this->tabNom[$j] = $this->tabNom[$i];
$this->tabVal[$i] = $maxi;
$this->tabNom[$i] = $inter;
}
} # for j
} # for i
} # if
} # fin trier_tab
### affiche_tab : affiche les donnees du tableau, utile pour utile Debug
function affiche_tab() {
for($i=0; $i<$this->dim; $i++) {
echo $this->tabNom[$i].' '.$this->tabVal[$i].'<br />';
} # for
} # fin affiche_tab
### stat2png : genere une image camembert au format PNG
function stat2png($mode, $hauteur_effet_3D) {
$width = 370; # largeur de l'image
$height = 220; # hauteur de l'image
$centre_x = 110; # poisition X du centre du camembert
$centre_y = 110; # poisition Y du centre du camembert
$cam_largeur = 200; # largeur du camembert
$cam_hauteur = 160; # hauteur du camembert
# declaration/initialisation de l'image
$img = imagecreatetruecolor($width, $height) or die("Probleme : Chargement de la lib GD impossible");
# declaration des couleurs
$noir = imagecolorallocate($img,0,0,0);
$vert = imagecolorallocate($img,90,160,90);
$blanc = imagecolorallocate($img,255,255,255);
ImageFill( $img, 0, 0, $blanc ); # couleur de fond de l'image (blanc)
if ($mode<>2 && $mode<>3) { # controle du mode
$mode = 2;
}
if ($mode == 2) {
$cam_largeur = $cam_hauteur; # pour la 2D on veut un cercle et pas une ellipse
}
$tot_angle = -90; # on commence a afficher les donnees a partir de midi
# variables pour generer les couleurs du camembert
$v2 = 185;
$v1 = 75;
$c = 0;
for($i=0; $i<$this->dim; $i++) { # pour chaque morceau du camembert, on calcul la couleur et les angles
# on genere une couleur differente a chaque iteration et on la memorise
if ($c==0) {
$tab_couleurs[$i][0][0] = $v1; # R
$tab_couleurs[$i][0][1] = $v2; # G
$tab_couleurs[$i][0][2] = $v2; # B
}
else if ($c==1) {
$tab_couleurs[$i][0][0] = $v2; # R
$tab_couleurs[$i][0][1] = $v1; # G
$tab_couleurs[$i][0][2] = $v2; # B
}
else if ($c==2) {
$tab_couleurs[$i][0][0] = $v2; # R
$tab_couleurs[$i][0][1] = $v2; # G
$tab_couleurs[$i][0][2] = $v1; # B
}
$c++;
# calcul complexe pour changer de couleur
if ($c==3) {
$c = 0;
$v1 += 60;
$v2 -= 40;
if (abs($v1-$v2) < 40) {
$v1 += 30;
$v2 -= 30;
} # if
} # if
# on assombrit la couleur et on la memorise
$dark = 35; # modifier cette valeur pour modifier l'assombrissement des couleurs
for($k=0; $k<3; $k++) { # R G B
if ($tab_couleurs[$i][0][$k] - $dark > 0)
$tab_couleurs[$i][1][$k] = $tab_couleurs[$i][0][$k] - $dark;
else
$tab_couleurs[$i][1][$k] = 0;
} # for($k=0; k<3; k++)
# on calcul et memorise l'angle
$tab_angle[$i] = $tot_angle;
$angle = ($this->tabVal[$i] * 360) / $this->tot;
$tot_angle += $angle;
} # for($i=0; $i<$this->dim; $i++)
$tab_angle[$this->dim] = $tot_angle; # on n'oublie pas de memoriser le dernier angle [cligne]
# on peut commencer a afficher les morceaux de camemberts
if ($mode == 3) { # Effet 3D
for($k=$centre_y + $hauteur_effet_3D; $k > $centre_y; $k--) { # pour avoir un effet 3D de 10 pixels
for($i=0; $i<$this->dim; $i++) { # pour chaque morceau du camembert
# creation de la couleur sombre
$color = imagecolorallocate( $img, $tab_couleurs[$i][1][0], $tab_couleurs[$i][1][1], $tab_couleurs[$i][1][2] ); # R G B
# on affiche le morceau de camembert
imagefilledarc($img, $centre_x, $k, $cam_largeur, $cam_hauteur, $tab_angle[$i], $tab_angle[$i+1], $color, IMG_ARC_PIE);
} # for($i=0; $i<$this->dim; $i++)
} # for($k=120; $k>110; $k--)
} # if ($mode == 3)
# on affiche les morceaux "clairs" du camembert (partie commune 2D/3D)
for($i=0; $i<$this->dim; $i++) { # pour chaque morceau du camembert
# creation de la couleur claire
$color = imagecolorallocate( $img, $tab_couleurs[$i][0][0], $tab_couleurs[$i][0][1], $tab_couleurs[$i][0][2] ); # R G B
# on affiche le morceau de camembert
imagefilledarc($img, $centre_x, $centre_y, $cam_largeur, $cam_hauteur, $tab_angle[$i], $tab_angle[$i+1], $color, IMG_ARC_PIE);
# on affiche la legende
$x = 235;
$y = 15 + $i*16;
imagefilledrectangle($img, $x, $y, $x+9, $y+9, $color); # petit carre de couleur
imagestring($img, 2, $x+15, $y-2, $this->tabNom[$i]. ' ('.floor(($this->tabVal[$i] * 100) / $this->tot).'%)', $noir); # texte
} # for($i=0; $i<$this->dim; $i++)
# finalisation de l'image
imagestring( $img, 2, 175, 195, "(C)2008 www.Software-DS.com", $vert); # vous pouvez mettre votre site internet
header("Content-type: image/png"); # declaration du Header, pour pouvoir afficher l'image
imagepng($img); # creation de l'image
imagedestroy($img); # nettoyage des ressources
} # fin stat2png
} # fin de la classe camembert
?>
a écrit :
fichier demo-camembert.php
<?php
$cpt_txt = 0;
if ( isset($_POST["t1"]) ) {
$t1 = $_POST["t1"];
if (strlen($t1) > 13) { # si c'est trop long, on coupe !
$t1 = substr($t1, 0, 13);
}
$cpt_txt++;
}
else {
$t1= ' ';
}
if ( isset($_POST["t2"]) ) {
$t2 = $_POST["t2"];
if (strlen($t2) > 13) { # si c'est trop long, on coupe !
$t2 = substr($t2, 0, 13);
}
$cpt_txt++;
}
else {
$t2= ' ';
}
$cpt_val = 0;
if ( ! is_numeric($_POST["v1"]) ) { $v1 = 0; } else { $v1 = $_POST["v1"]; $cpt_val++; }
if ( ! is_numeric($_POST["v2"]) ) { $v2 = 0; } else { $v2 = $_POST["v2"]; $cpt_val++; }
if (isset($code) && isset($_POST["app"])) {
$app = $_POST["app"];
if (strlen($app) > 4) {
$app = 'a2D';
}
}
?>
a écrit :
<br />
<table cellpadding="2" cellspacing="2" bgcolor="#996633" width="735">
<tr>
<td bgcolor="#FFCC99" align="center">
<h2>Générateur PHP de Camembert en 2D/3D</h2>
</td>
</tr>
<tr>
<td bgcolor="#FFFFDD" class="tM">
Ci-dessous une démo en ligne du script.
<br />
</td>
</tr>
<tr>
<td bgcolor="#FFFFC0" class="tM" align="center">
<form method ="post" action ="<?php echo $PHP_SELF; ?>">
Saisir les données pour générer un Camembert :<br />
<br />
<table width="190" cellpadding="2" cellspacing="1" bgcolor="#FF9900">
<tr bgcolor="#FFCC99"><td align="center">Valeur</td><td align="center">Libelle</td></tr>
<tr bgcolor="#FFFFCC"><td align="center">
<input type="text" name="v1" id="v1" size="6" value="<?php if (isset($v1) && ($v1 != 0) ) echo $v1; ?>" /></td><td align="center">
<input type="text" name="t1" id="t1" size="12" value="<?php if (isset($t1) && ($t1 != ' ') ) echo $t1; ?>" />
</td></tr>
<tr bgcolor="#FFFFCC"><td align="center">
<input type="text" name="v2" id="v2" size="6" value="<?php if (isset($v2) && ($v2 != 0) ) echo $v2; ?>" /></td><td align="center">
<input type="text" name="t2" id="t2" size="12" value="<?php if (isset($t2) && ($t2 != ' ') ) echo $t2; ?>" />
</td></tr>
</table>
<br />
Apparence:
<input type="radio" name="app" id="a2D" value="a2D" <?php if ( $app == "a2D" ) echo 'checked="checked"'; ?> /> 2D
<input type="radio" name="app" id="a3D" value="a3D" <?php if ( (!isset($app)) || ($app == "a3D") ) echo 'checked="checked"'; ?> /> 3D
<input type="image" name="envoyer" id="envoyer" src="../images/valider.gif" alt="Valider" />
</form>
<?php ### generation de l image du code barre si necessaire ###
if ( ($cpt_txt > 0) && ($cpt_val > 0) ) { # on peut generer une image
echo '<div class="tM" align="center">Image camembert :<br />';
if ($app == "a2D")
$mode = 2;
else
$mode = 3;
#on rentre les donnees
$url = '';
if ($v1 > 0) { if ( ($t1 == ' ') || strlen($t1)<1 ) $t1 = $v1; $url .= '&v1='.$v1.'&t1='.$t1; }
if ($v2 > 0) { if ( ($t2 == ' ') || strlen($t2)<1 ) $t2 = $v2; $url .= '&v2='.$v2.'&t2='.$t2; }
echo '<img src="cam.php?mode='.$mode.$url.'" border="1" alt="" /><br /><br />';
echo '</div>';
} #if ( ($cpt_txt > 0) && ($cpt_val > 0) )
?>
a écrit :
le fichier cam.php
<?php
# 03/05/2008 Didier STRAUS.fr #
require("camembert.php");
if ( ! is_numeric($_GET["mode"]) ) { $mode = 2; } else { $mode = $_GET["mode"]; }
$cpt_txt = 0;
if ( isset($_GET["t1"]) ) {
$t1 = $_GET["t1"];
if (strlen($t1) > 13) { # si c'est trop long, on coupe !
$t1 = substr($t1, 0, 13);
}
$cpt_txt++;
}
else {
$t1= ' ';
}
if ( isset($_GET["t2"]) ) {
$t2 = $_GET["t2"];
if (strlen($t2) > 13) { # si c'est trop long, on coupe !
$t2 = substr($t2, 0, 13);
}
$cpt_txt++;
}
else {
$t2= ' ';
}
$cpt_val = 0;
if ( ! is_numeric($_GET["v1"]) ) { $v1 = 0; } else { $v1 = $_GET["v1"]; $cpt_val++; }
if ( ! is_numeric($_GET["v2"]) ) { $v2 = 0; } else { $v2 = $_GET["v2"]; $cpt_val++; }
# ##### FIN - on empeche les pirates de faire des betises ##### #
if ($mode == 2)
$mode = 2;
else
$mode = 3;
if ( ($cpt_txt > 0) && ($cpt_val == $cpt_txt) ) { # on peut generer une image
$camembert = new camembert(); # initialisation
#on rentre les donnees
if ($v1 > 0) { if (strlen($t1) < 1) $t1 = $v1; $camembert->add_tab( $v1, $t1 ); }
if ($v2 > 0) { if (strlen($t2) < 1) $t2 = $v2; $camembert->add_tab( $v2, $t2 ); }
$camembert->trier_tab(); # Facultatif, les donnees sont triees dans l'ordre decroissant
$camembert->stat2png($mode, 15);
} # FIN on peut generer l'image
}
else { # acces non autorise
echo '<br /><br /><h1 align="center">©2008 <a href="http://www.software-ds.com">www.Software-DS.com</a></h1>';
}
?>
Modifié par jeromei (17 Jun 2008 - 21:49)