PHP et GD ==> Camembert !

Fermé
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 - 20 avril 2009 à 05:22
 le père - 20 avril 2009 à 09:41
Bonjour,

je n'arrive pas à faire fonctionner correctement un algorithme pour faire un camembert en PHP via la bibliothèque GD !
L'algorithme que j'utilise est celui-là : http://www.manuelphp.com/php/function.imagefilledarc.php
Voici tout de suite un lien qui montre le résultat de mon code : http://ns5.freeheberg.com/~infotuto//GD/image.php?ordre=0&type=2&ga=null&go=null&quadrillage=null&valeurs=1,2,3,4,5,6,7,8,9,10

Comme vous pouvez le voir, il y a un problème au niveau du 3D ! :(

Voici mon algo :

foreach($arrListe as $value){ // On lit les valeurs une par une
	$moyenne_valeur = ($value * 100)/$somme; // Moyenne de chaque valeurs par rapport au total des valeurs
	$arclen = (360 * $moyenne_valeur) / 100; // Grandeurs de la portion correspondant à la valeur courrante
			
	if($pourcentage <= 180)
		for ($i = 260; $i > 230; $i--) imagefilledarc($image, 400, $i, 425, 225, $last_angle, ($last_angle + $arclen) , $sombre, IMG_ARC_PIE); 
	imagefilledarc($image, 400, 231, 425, 225, $last_angle, ($last_angle + $arclen) , $clair, IMG_ARC_PIE);
	$last_angle += $arclen;
	$pourcentage += $arclen;
	}
}


Bon, j'ai mis juste l'essentiel à l'algo, j'ai pas mis tout ce qui est la gestion des couleurs ($clair et $sombre).

Si quelqu'un pouvait m'aider/aiguiller un peu !

Merci à tous

A+

Gaerebut
A voir également:

2 réponses

Re-

Je n'avais pas bien regardé l'algorithme du lien que tu as donné, en fait il marche à tous les coups et il est très simple.
Il consiste à dessiner tout le camembert en couleurs sombres, de bas en haut.
Puis on redessine le dessus en couleurs claires

Or toi tu dessines part par part. Et de plus, dans le dessin de chaque couche, tu alternes couleur sombre/couleur claire.

Donc tu ne respectes pas du tout l'aglorithme de l'exemple.

Ça devrait donner quelque chose du genre :
function unecouche ($image,$posy,$couleur,$arrliste,$somme) {

  $last_angle=0;
  foreach($arrListe as $value){ // On lit les valeurs une par une
	  $moyenne_valeur = ($value * 100)/$somme; // Moyenne de chaque valeurs par rapport au total des valeurs
	  $arclen = (360 * $moyenne_valeur) / 100; // Grandeurs de la portion correspondant à la valeur courante
    imagefilledarc($image, 400, $posy, 425, 225, $last_angle, ($last_angle + $arclen) , $couleur, IMG_ARC_PIE); 
    $last_angle+=$arclen;

} // function unecouche ($couleur,$arrliste) {

// traçage de l'épaisseur
	for ($i = 260; $i > 230; $i--) unecouche( $image,$i,$sombre,$arrliste,$somme);

// traçage de la surface
  unecouche( $image,230,$clair,$arrliste,$somme);
1
Bonjour

Pas très évident. Il faudrait commencer par dessiner les parts de camembert qui sont dans le fond, et terminer par celle qui est face à l'observateur. Comme je ne suis pas sûr d'imaginer tous les cas de figure, je ne suis même pas tout à fait sûr du résultat.

Si j'avais à le faire, je tenterais une approche 2D sur une ellipse, beaucoup plus simple, puis je tracerais des segments qui "descendent" du bord de l'ellipse pour faire l'épaisseur du camembert, sur la plage d'angles située face à l'observateur (de 180 à 360 degrés ? ça dépend de ton repère). Ça ne doit pas être très simple non plus, mais on est sûr du résultat comme ça.
0