[RISOLTO] [PHP - GD2] aiuto per un grafico di flusso utenza...

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
elegos
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1308
Iscrizione: sabato 14 ottobre 2006, 18:34
Contatti:

[RISOLTO] [PHP - GD2] aiuto per un grafico di flusso utenza...

Messaggio da elegos »

Salve a tutti!

Ho un server di gioco nel quale registro il numero di persone online ogni 5 minuti... li salvo in questo formato (tabella MySQL)...

Codice: Seleziona tutto

CREATE TABLE IF NOT EXISTS `online` (
  `id` int(10) NOT NULL auto_increment,
  `date` date NOT NULL,
  `hour` varchar(15) NOT NULL,
  `online` int(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=69 ;
id = primario auto-increment
date = AAAA-MM-GG
hour = HH:MM
online = N

ora vorrei che il grafico visualizzasse i dati di un dato giorno... considerando che sono circa 300 dati li vorrei mettere con:

Y = frequenza
X = 5 minuti in 5 minuti

mettere quindi tante colonne da 1px quanti sono i dati raccolti, con un grafico millimetrato... uhm... capito? Magari metterci anche delle didascalie sempre nell'immagine... quindi in ultima analisi vorrei chiedere come:

1. creare il grafico 'vuoto' con tanto di didascalie
2. aggiungere 'colonne' da 1px di larghezza e TOTpx di altezza che rappresenta l'utenza al minuto X

Grazie :)
Ultima modifica di elegos il martedì 18 marzo 2008, 14:26, modificato 1 volta in totale.
Avatar utente
hds619
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 352
Iscrizione: domenica 15 aprile 2007, 20:23
Località: Ferrara
Contatti:

Re: [PHP - GD2] aiuto per un grafico di flusso utenza...

Messaggio da hds619 »

Dunque... con quel poco che ho capito del grafico potresti fare il seguente schema:

-> Calcoli il numero di pixel in larghezza che ti servono e la massima altezza ( numero di utenti collegati ).. ci aggiungi anche qualche pixel in più...
-> Crei l'immagine :
    $immagine = imagecreatetruecolor($x, $y + $extra );
-> Tracci una linea diciamo a 10 pixel iniziando dal basso:
    imageLine($immagine, inizio_x, ( $y + $extra ) - 10, fine_x, ( $y + $extra ) - 10, $white);
    dove $white  = imageColorAllocate($immagine, 255, 255, 255);
-> Ti scrivi quello che vuoi e te lo posizione con un imageString:
      imageString($immagine, $font, $x, $y, $testo, $white);
-> Recuperi ad una ad una tutti i campi delle tabelle e tracci la prima linea da: ($y + $extra) - 12 fino a $dato_corrente
    e poi $dato_precedente = $dato_corrente, inizio $dato_precedente fine $dato_corrente.
    il tutto finchè non finisco i dati. ( ogni volta che passi al dato successivo aumenti di 1px l'$x )

Ciauz  ;)
Ultima modifica di hds619 il martedì 18 marzo 2008, 8:12, modificato 1 volta in totale.
Avatar utente
elegos
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1308
Iscrizione: sabato 14 ottobre 2006, 18:34
Contatti:

Re: [PHP - GD2] aiuto per un grafico di flusso utenza...

Messaggio da elegos »

uhm... ho fatto un qualcosina di più complicato (solo per complicarmi la vita :P )... lo posto perché mi sembra giusto chiudere senza una soluzione :)

today.php <-- puro grafico dell'andamento di oggi

Codice: Seleziona tutto

<?php

//DATA
$date = date("Y-m-d");
$conn = mysql_connect("localhost","****","****");
$db = mysql_select_db("****",$conn);
$query = mysql_query("SELECT `online` FROM `online` WHERE `date` = '$date' ORDER BY `id` ASC");
$nrows = mysql_affected_rows();

$i=1;
while($row = mysql_fetch_array($query))
        $Values[$i++]['n'] = $row['online'];
mysql_close($conn);
//DATA

Header("Content-type: image/png");
$Multi=2; // Multi è la quantità di pixel per ogni dato... in questo caso io faccio un grafico che equivale a 2px quadrati per ogni punto
$Width=288*$Multi;
$Height=100*$Multi;

$img = ImageCreateTrueColor($Width, $Height);

$bg = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $bg);

$grid = imagecolorallocate($img, 225, 150, 150);
$lines = imagecolorallocate($img, 0, 100, 200);

imagesetstyle($img, array($bg, $grid));
imagegrid($img, $Width, $Height, $Width/24, $Height/10, IMG_COLOR_STYLED);
fillGrid($img, $Height, $Multi, $Values, $lines);

ImagePNG($img,"images/today.png"); // creo un'immagine temporanea nella subdirectory 'images'

function imagegrid($image, $w, $h, $s, $s2, $color)
{
    for($iw=1; $iw<$w/$s; $iw++){imageline($image, $iw*$s, 0, $iw*$s, $w, $color);}
    for($ih=1; $ih<$h/$s2; $ih++){imageline($image, 0, $ih*$s2, $w, $ih*$s2, $color);}
}
function fillGrid($image, $height, $multi, $array, $color)
{
        $x1=$x2=0;
        $y1=$y2=$height;
        foreach($array as $ar)
        {
                $x1 = $x2;
                $y1 = $y2;

                $x2 = $x2+1*$multi;
                $y2 = (100-$ar['n'])*$multi;
                if($y1 == $height && $x1 == 0) $y1 = $y2;

                if($y1 != 0) imageline($image, $x1, $y1, $x2, $y2, $color);
        }
}
?>
index.php <-- aggiungo al grafico una veste con gli indici

Codice: Seleziona tutto

<?php
// index.php?t=tipo <-- per ora solo t=today
$type = (array_key_exists('t',$_GET)) ? $_GET['t'] : null;
if($type == "today")
{
        if(!$img = @imagecreatefrompng("images/background_100_24.png")) // carico l'immagine di background con le quotazioni
                die("Impossibile creare l'immagine (1)!\n<br />Processo annullato.\n");

        shell_exec("php5 today.php"); // faccio eseguire in CLI il file today.php in modo da generare l'immagine png.
                                                 // questo perché imagecreatefrompng non ammette file php che generano file png.
        if(!$ovr_img = @imagecreatefrompng("images/today.png"))
                die("Impossibile creare l'immagine (2)!\n<br />Processo annullato.\n");

        if(!@imagecopymerge($img,$ovr_img,24,27,0,0,576,200,50)) // faccio un merge con alpha 50% (estetica).
                                                                                         // 24 e 27 sono i px dove l'immagine viene incollata (bordo top-left)
                                                                                         // 576 e 200 sono la larghezza e la lunghezza del grafico (today.png)
                 die("Impossibile fondere le immagini (3)!\n<br />Processo annullato.\n");

        // IMAGE CREATION
        Header("Content-type: image/png");
        ImagePNG($img);
        ImageDestroy($img);

        shell_exec("rm images/today.png -f"); // cancello l'immagine today.png perché non serve più
}
?>
risultato finale: http://www.dawnofelegy.org/mangos_utils ... hp?t=today
Ultima modifica di elegos il martedì 18 marzo 2008, 14:27, modificato 1 volta in totale.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti