Pages :
Bonjour, je dois dessiner un graphique sous forme d'image générée en PHP. J'ai a ma disposition une classe Image, et je dois modifier la classe enfant Graph qui permet de créer la représentation graphique d'un ensemble de point que nous lui communiquerons. Pour se faire il faut faire la méthode addVals($tabs).
L'image est générée via le fichier graph.img.php, dans lequel on instancie le Graph et on renseigne les point dans un tableau pour la méthode addVals.
Je dois faire la méthode addVals. J'ai fait ceci mais ça ne fonctionne pas :

public function addVals($tabs)
	{
		for ($i=0; $i <= 3; $i++) { 
			$vals = array($i*100, $tabs[$i], ($i+1)*100, $tabs[$i+1]);
		}
		
		return $vals;
	}


Si quelqu'un a une idée? merci
Salut,

qu'est ce qui ne fonctionne ?
Je suppose que ton $vals est faux.
Je me demande si ta boucle n'est pas fausse aussi, pourquoi est ce qu'elle s’arrête à 3 ?

Regarde comment évolue tes variables (celles d'entrées et de sorties) en rajoutant des affichages / logs / debugs..

Bon courage
Merci pour ta réponse, ma boucle et mon $vals sont faux en effet.
En entrée j'ai un tableau de 4 valeurs positives pour $tabs. Et en sortie ça doit dessiner ces 4 valeurs positives qui représentent des points sur un graphique, reliés entre eux par une ligne. Et je ne vois pas du tout ce qu'il faut mettre à l'intérieur de addVals pour a partir d'un tableau de 4 valeurs sortir les 4 points sur le graphique.
Je précise que le graph est instancié et que les axes abscisse et ordonné sont déjà visibles.
Il faut donc ajouter les valeurs de mon tableau a ce graph.
Pas vraiment d'infos mais bon :
- Pour essayer de faire un truc vaguement générique, il ne faut sans doute pas partir du fait que tu reçois un tableau qui contient 4 points mais un tableau qui contient des points peut importe le nombre ? Je te laisse voir comment tu peux trouver la taille de $tabs et faire une boucle qui va jusqu'à cette valeur exclus plutôt que jusqu'à 3 inclus.
- La à chaque tour de boucle tu écrases $vals alors qu'a priori tu dois y ajouter des trucs dedans. Même chose je te laisse chercher comment on insert des éléments dans un tableau.

public function addVals($tabs)
	{
		$i=0;
		foreach ($tabs as $value) {
			$result[$i] = $value[$i];
			$i++;
		}
		return $result;
	}

	/**
	 * Définit les valeurs du graph
	 * @param array $tabs tableau de valeur
	 */
	public function afficher() {

		/** --------------EXEMPLE-------------- **/

		
		// Définition des couleurs
		$this->ajouterCouleur(255,0,0,	'rouge');
		$this->ajouterCouleur(0,0,0,	'noir');

		// On trace les traits
		$j=0;
		for ($i=0; $i < count($result); $i++) { 
			//taille du graph = 500, 500. Divisé par 4(4 valeurs du tableau) = 125
			$this->tracerTrait($j*125, $result[$i], $j*125, $result[$i], 'rouge');
			$j++;
		}


J'en suis arrivé à quelque chose comme ça, je n'ai pas de message d'erreur mais mon graph fond gris avec l'abscisse et l'ordonné disparait pour laisser place à un tout petit blanc aux contours noirs.
Salut,

bon il y a un peu plus de code, mais cela ne m'a pas l'air mieux Smiley ohwell

J'ai l'impression que la fonction addVals ne fait absolument rien : elle prends un tableau en entrée et retourne en sortie un autre tableau qui m'a l'air identique au tableau en entrée...
Autant faire directement un return $tabs. Bref je suppose qu'ici c'est faux.

Ensuite dans ta fonction afficher, tu utilises $result partout alors qu'il n'a pas l'air d’être défini Smiley ohwell

Vu qu'il y a des $this je suppose que tu es dans une classe et que ces fonctions sont des méthodes de ta classe ? Edit : Je viens de tilter qu'il y aussi la visibilité public qui indique que c'est des méthodes ^^ '

Si c'est bien le cas, il faudrait voir le constructeur et regarder si tu n'as pas un attribut tableau qui est censé contenir les points du graph, ce qui te permettrait dans ta fonction addVals de faire un ajout des points à ton objet via $this puis de la même façon dans afficher d'utiliser ce tableau via $this au lieu de $result.

Bon courage,
Mathieu
Modifié par Mathieuu (22 Sep 2021 - 10:12)
Effectivement je suis ici dans une sous class Graph de la classe Image. Voici les constructeurs :

class Image
{
        protected $img;
        protected $couleurs;
        protected $w,$h;

        
       /**
       * Constructeur 
       * @param int $w largeur
       * @param int $h hauteur
       */
        public function __construct($w,$h)
        {
            $this->w = $w;
            $this->h = $h;
            $this->img=imagecreate($w,$h);
            imagecolorallocate($this->img, 255,255,255);

            $this->couleurs = array();
        }


et dans la class enfant Graph :

class Graph extends Image 
{
    protected $vals;
    protected $padding=5;

	/**
	 * Définit les valeurs du graph
	 * @param array $tabs tableau de valeur
	 */


Je ne comprends pas vraiment à quel moment utiliser les $this. Est ce que ces précisions t'aident?
Merci de ton aide
Hello Mathieu a raison,

Dans ta fonction afficher() à aucun moment $result est définie. donc ça devrait te péter une erreur.
Et la fonction addVals ne sert à rien car elle te renvoie le même tableau qu'en entré.

le $this-> fait référence au contexte courant, en l'occurrence ta classe. tu peux accéder aux méthodes / variables etc..
Salut,

a priori il faudrait que tu suives un cours de Programmation Orienté Objet (POO) pour comprendre ce que tu fais Smiley ohwell

En gros $this cela fait référence à l'objet que tu as instancié et qui va te permettre d’accéder aux méthodes ou attributs de ton objets.

A priori dans ta fonction addVals, il faudra que tu fasses du push de tes valeurs dans $this->vals (même si je trouve bizarre qu'il ne soit pas définit comme un tableau mais bon)
Du coup j'ai ça:

public function addVals($tabs)
	{
		$i=0;
		foreach ($tabs as $value) {
			this->$vals[$i] = $value[$i];
			$i++;
		}
		return this->$vals;
	}

	/**
	 * Définit les valeurs du graph
	 * @param array $tabs tableau de valeur
	 */
	public function afficher() {

		/** --------------EXEMPLE-------------- **/

		
		// Définition des couleurs
		$this->ajouterCouleur(255,0,0,	'rouge');
		$this->ajouterCouleur(0,0,0,	'noir');

		// On trace les traits
		$j=0;
		for ($i=0; $i < count($vals); $i++) { 
			//taille du graph = 500, 500. Divisé par 4(4 valeurs du tableau) = 125
			$this->tracerTrait($j*125, $vals[$i], $j*125, $vals[$i], 'rouge');
			$j++;
		}
		/*
		$this->tracerTrait(0, 21, 0, 21, 'rouge');
		$this->tracerTrait(125, 42, 125, 42, 'rouge');
		$this->tracerTrait(250, 35, 250, 35, 'rouge');
		$this->tracerTrait(375, 0, 375, 0, 'rouge');*/

		$this->tracerTrait(0+5,500-5,0+5,10-5,'noir');
		$this->tracerTrait(0+5,500-5,490+5,500-5,'noir');

		/** ---------------------------------- **/

		// Affichage de l'image
		parent::afficher();
	}
}


et ça me met une erreur à cause du this->$vals
j'ai fait la même sans le this->, pas d'erreurs mais ça ne fonctionne pas pour autant
Modérateur
Bonjour,

Quel est le message d'erreur exact que ton script retourne ?

Est tu certain du nommage de tes couleurs ?

Peut tu partager ta class image et ton script complet ? Éventuellement ta version de php?

Un max d'informations aidera à mieux cerner ton problème.

Cdt
L'erreur :
upload/1632418145-82440-erreur.png
La classe image :

<?php

/**
 * A NE PAS MODIFIER
 * image.class.php
 */

class Image
{
        protected $img;
        protected $couleurs;
        protected $w,$h;

        
       /**
       * Constructeur 
       * @param int $w largeur
       * @param int $h hauteur
       */
        public function __construct($w,$h)
        {
            $this->w = $w;
            $this->h = $h;
            $this->img=imagecreate($w,$h);
            imagecolorallocate($this->img, 255,255,255);

            $this->couleurs = array();
        }
        
        /**
         * Affiche l'image lorsqu'on est pas en mode DEBUG
         */
        public function afficher() 
        {
			if (!constant('DEBUG')) {
				header("Content-type: image/png");
				imagepng($this->img);
				imagedestroy($this->img);
			} else {
				echo '<hr/>DEBUG MODE<hr/>';
			}
        }
        

		/**
		 * Ajoute une couleur au panel de l'image sous le nom saisi en entrée
		 * @param int $r composante r
		 * @param int $v composante v
		 * @param int $b composante b
		 * @param string $nom le nom de la couleur
		 */
        public function ajouterCouleur($r,$v,$b,$nom) 
        {
                $this->couleurs[$nom] = imagecolorallocate($this->img, $r,$v,$b);
        }
        

        /**
         * Définit la couleur de fond de l'image (la couleur doit être présente dans le panel de l'image)
         * @param string $couleur nom de la couleur dans le panel
         */
        public function couleurFond($couleur) {
                imagefill($this->img,0,0,$this->couleurs[$couleur]);
        }
        
      
        /**
         * Dessine un trait sur l'image (la couleur doit être présente dans le panelde l'image)
         * @param int $x1 abscisse du point premier point
         * @param int $y1 ordonnée du premier point
         * @param int $x2 abscisse du point second point
         * @param int $y2 ordonnée du second point
         * @param string $couleur nom de la couleur dans le panel
         */
        public function tracerTrait($x1,$y1,$x2,$y2,$couleur) {
                imageline($this->img,$x1,$y1,$x2,$y2,$this->couleurs[$couleur]);
        }
        
        //
        /**
         * Ecrit un texte sur l'image (la couleur doit être présente dans le panel de l'image)
         * @param int $x coordonnée X du coin en haut, à gauche
         * @param int $y coordonnée Y du coin en haut, à gauche.
         * @param int $font 1, 2, 3, 4, 5 pour les polices internes (+ d'info sur la doc de imagestring )
         * @param string $texte la chaîne de caractères à écrire. 
         * @param string $couleur
         */
        public function ecrireTexte($x,$y,$font,$texte,$couleur)
        {
                imagestring($this->img,$font,$x,$y,$texte,$this->couleurs[$couleur]);
        }
        
        /**
         * Dessine un rectangle sur l'image (la couleur doit être présente dans le panel de l'image)
         * @param int $x1 abscisse du point haut, à gauche
         * @param int $y1 ordonnée du haut, à gauche
         * @param int $x2 abscisse du point bas, à droite
         * @param int $y2 ordonnée du point bas, à droite
         * @param string $couleur nom de la couleur dans le panel
         */
        public function tracerRectangle($x1,$y1,$x2,$y2,$couleur)
        {
                imagefilledrectangle($this->img,$x1,$y1,$x2,$y2,$this->couleurs[$couleur]);
        }
        
}


?>


Fichier qui instancie mon graph:

<?php

/**
 * A NE PAS MODIFIER
 * graph.img.php
 */

//**GESTION DU DEBUG MODE **//

//Gestion automatisé de l'affichage d'erreurs
error_reporting(E_ALL);
ini_set('display_errors', 'On');
set_error_handler("customError",E_ALL);
function customError($errno, $errstr)
{
	$GLOBALS['debug'] = true;
	echo "<b>Error:</b> [$errno] $errstr<br>";


}

//On peut forcer le debug avec un $_GET['debug'] non vide à l'appel du script
$debug = (!empty($_GET['debug']));


//**INCLUSIONS**//

//La classe Image sur laquelle s'appuiera votre travail (à ne pas modifier)
include 'image.class.php';

//La classe Graph que vous aurez à modifier (elle hérite de la class Image)
include 'graph.class.php';


//**CREATION DU GRAPH**//

//On définit les valeurs
$tab = array(21,42,35,0);

//On instancie un graph
$obj = new Graph(500,500);


//On lui ajoute les valeurs renseignées dans $tab
$obj->addVals($tab);


//**PERSONNALISATION**//

//On ajoute un gris au panel de couleurs du graph
$obj->ajouterCouleur(200,200,200,'gris');

//on applique un fond gris au graph
$obj->couleurFond('gris');


//**IMPRESSION**//

//la constante DEBUG commiquera avec la classe Image
define ('DEBUG',$debug);

//on lance l'affichage du graph
$obj->afficher();


?>


Et ma version de PHP est 5.6.25
Modérateur
Bonsoir,

Whaou , ton message d'erreur fait référence à la ligne
imagecolorallocate($this->img, 255,255,255);

dans class.image.php si je compte bien. mais le message d'erreur parle du fichier graph.class.php et $tabs a aussi disparu de l’horizon !?

je n'arrive pas à te suivre ni a reproduire ton soucis, c'est comme regarder au travers d'un trou de serrure ... on voit pas tout Smiley cligne

Bonne soirée.
Le fichier graph.class.php est visible dans le message précédent je voulais éviter de le ré-envoyer. Les autres fichiers sont fournis et ne sont pas à modifier.
euh... dans addval (qui ne sert à rien du coup)


return this->$vals;

ça ça n'existe pas. "this"

$this c'est pour accèder au variables/function de ta classe.
Pages :