Graafinen kuvaaja. Kolme eri tapaa näyttää kuvaaja: viivakuvaaja+pystyviivat+täyttäjutska, pelkät viivat, ja palkkimoodi. Automaattinen skaalausjärjestelmä korkeuden perusteella((tm) :P). Ainakin kommentoitua on joten pitäisi ymmärtää edes jotenkin tota... koodi on tuolla: http://sooda.dy.fi/foo/graph.php
<?php $staili=$_GET['staili']; //0=normaali(käyrä+pystyviivat), 1=pelkkä käyräviiva, 2=palkit $dats=array(10,20,30,20,10,20,40,100,20,10); //esimerkkitaulukko, foreach($dats as $i) { if ($maksimuumi<$i) $maksimuumi=$i; //tarkistetaan maksimiarvo } $datat_yht=10; header("Content-Type: image/png"); //tämä on kuva $sz=15; //koko jutska, muuta niin tajuat $mar=20; //reunuksen koko $koko=400; //korkeus(ilman reunuksia) if ($staili==2) $jutska=$sz; //jos staili on 2 niin tarvitsee yhden pystyrivin lisää $lev=2*$mar +$sz*$datat_yht+$sz+$jutska; //leveys: marginaalit + graafialue + reunaa $kork=2*$mar+$sz +$koko; //korkeus: marginaalit + reunusta ylös + korkeus $kuva=imagecreate($lev,$kork);//uus kuva $reuna=imagecolorallocate($kuva,100,100,100); //reunojen väri $p=imagecolorallocate($kuva,0,0,0);//yleinen piirtoväri $filli[0]=imagecolorallocate($kuva,153,153,153);//näitä kahta käytetään palkkien värjäämiseen $filli[1]=imagecolorallocate($kuva,183,183,183);//... $tausta=imagecolorallocate($kuva,255,255,255);//taustaväri imagefilledrectangle($kuva,$mar,$mar,$lev-$mar,$kork-$mar,$tausta); //piirretään graafialue $fillikolor=1; //värjäys juttu $kerroin=$maksimuumi/$koko;//erikoislaskentaa $x=$mar+$sz; for($i=0;$i<$datat_yht;$i++){ //piirretään joka palkki $y=$dats[$i]/$kerroin; //yy sijainti $y=$kork-$y-$mar; //käännetään yy oikein päin ja pistetään se alkamaan pohjamarginaalin päältä if ($i==0){$lastx=$x;$lasty=$y;} //edellisen viivan sijainti tarkistus jutska ettei sekoa if ($dats[$i]==0) $dats[$i]="0"; //jos se on nolla niin se todellakin on nolla(mulla jos se oli nolla niin se ei ollut mitään...) if ($staili<2) { //ei palkkityyli imageline($kuva,$lastx,$lasty,$x,$y,$p); //käyräviiva imagestring($kuva,0,$x-2,$kork-$mar+1,$i,$p); //monesko jutska menossa ilmoitus imagestring($kuva,0,$x-2,$y-$sz,$dats[$i],$p); //käyrän päälle tarkka arvo if($staili==0) { //piirretään pystyviivat imageline($kuva,$x,$kork-$mar,$x,$y,$p); //pirrä se if (($i>0)and($y<$kork-$mar-1)) imagefill($kuva,$x-$sz/2,$kork-$mar-1,$filli[$fillikolor]); // ja täytetään palkkikset } }elseif ($staili==2) {//palkkityyli imageline($kuva,$x,$kork-$mar,$x,$y,$p); //palkin vasen pystyviiva imageline($kuva,$x+$sz,$kork-$mar,$x+$sz,$y,$p); //palkin oikea pystyviiva imageline($kuva,$x,$y,$x+$sz,$y,$p); //palkin yläviiva imagestring($kuva,0,$x+3,$kork-$mar+1,$i,$p); //monesko jutska menossa ilmoitus imagestring($kuva,0,$x+3,$y-$sz,$dats[$i],$p); //palkin yläpuolelle tarkka arvo if (($i>0)and($y<$kork-$mar-1)) imagefill($kuva,$x-$sz/2,$kork-$mar-1,$filli[$fillikolor]); //ja täytetään se } $lastx=$x; //viime koordinaatit $lasty=$y; //... $fillikolor=1-$fillikolor; //väriswappi $x+=$sz;//mennään eteenpäin } if (($staili==2)and($y<$kork-$mar-1)) imagefill($kuva,$x-$sz/2,$kork-$mar-1,$filli[$fillikolor]); //ja täytetään viimeisen kerran... for($y=$kork-$mar;$y>$mar;$y-=$sz){ //havainnollistavat vaakaviivat imageline($kuva,$mar,$y,$lev-$mar,$y,$reuna); //viiva $luku=(int)(($kork-$y-$mar)*$kerroin); //lasketaan missä mennään... imagestring($kuva,0,$mar/2,$y-2,$luku,$p); //ja kerrotaan se } imagepng($kuva); //tehdään kuva... imagedestroy($kuva); //ja vapautellaan palvelimen muistia ?>
Koodi on jotenkin ahtaan näköinen, mutta lopputulos on hieno.
kiitos :)
Hyvä!!! Kerrankin jotain hyödyllistä ;)
Näyttäis paljon ilmavammalta, jos ottais kommentit pois :)
Tyhjät rivit auttais kummasti...
no on tossa heikille tyhjä rivi ennen viimestä for-silmukkaa ;)
Antti on kyllä oikeessa että ahdasta on :) Mutta silti hienoa jälkeä. Nuo poikkiviivat sekoittavat vähän palkistoa.
Noi kommentit on vaan siksi että siitä saisi selvää että mikä tekee mitäkin, nehän voi itse napata pois.
Vähän sekanen mutta lopputulos on kyllä sen arvonen! toi on todella hieno!!
Hieno!
Eikös tuossa olussa olevan kohdan:
$datat_yht=10;
Voisi muuttaa näin:
$datat_yht=count($dats);
Silloin ei tarvitse itse sitä muutella...
Mutta mistä toi muutetaan palkkityyliksi?
laitat $staili:n 2:ksi. lue nyt sorsaa hyvä ihminen! löytyy tollainen: }elseif ($staili==2) {//palkkityyli
onnistuiskohan tätä tekeen kahteen osaan.. ?
Tosi hyvä! Pienellä hiomisella sain tästä itselle kävijälaskuriini kuvaajan. Olin juuri alkamassa itse tekemään vastaavaa, mutta nyt sekin aika tuli säästettyä. Kiitokset tekijälle.
lainaus:
Ainakin kommentoitua on joten pitäisi ymmärtää edes jotenkin tota...
Tosiaan :D Pistä hei jatkossa useampia rivinvaihtoja niin se selkeyttää kansa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.