Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Diagrammi luokka

odys [28.05.2003 22:07:55]

#

Tällä hetkellä saa vain tehtyä ympyrädiagrammeja, mutta tarkoitus olisi
tehdä pylväs -ja viivadiagrammit kunhan ehtii. Kommentteja on runsaan
puoleisesti ja jotkut niistä ehkä hieman turhiakin :)

<?php

  /*
   *  Tämä on luokka, jolla voit luoda erilaisia diagrammeja
   *  Koodannut Joni Järvinen (Jope) <jope@psykoosi.org>
   *
   *  Koodi on vapaasti käytettävissä ja muokattavissa kunhan
   *  tekijän nimi säilyy.
   *
   */

  class diagram {
    // Funktio, joka lähettää headerin
    function Headers () {
      header ("Content-type: image/png");
    }

    // Random luku funktio
    function RandomNum ($min, $max) {
      // Alustetaan random luku generaattori
      mt_srand((double) microtime() * 1000000 ^ getmypid());
      // Arvotaan luku
      $number = mt_rand($min, $max);
      // Palautetaan luku
      return $number;
    }

    /*
     *  Funktio, joka luo ymprädiagrammin ja tulostaa sen haluttaessa
     *
     *  function CreatePie (Array data, String otsikko, String yksikkö [, Bool tulostus])
     *
     *  Funktion ensimmäinen parametri sisältää datan muodossa:
     *
     *    Array (
     *      [0] => Array (
     *        String asia1, Float arvo [, Int red [, Int green [, Int Blue]]]
     *      ),
     *      [1] => Array (
     *        String asia2, Float arvo [, Int red [, Int green [, Int Blue]]]
     *      )
     *    )
     *
     *  Toinen parametri sisältää Ympyrädiagrammin otsikon
     *
     *  Kolmas parametri on yksikkö. Esim "%", "kg" tai " €"
     *
     *  Neljäs parametri ei ole pakollinen, mutta jos arvoksi on laitettu
     *  TRUE tulostetaan diagrammi suoraan; muuten palautetaan vain kuva
     *  recource muuttujana.
     *
     *  Data arrayssä kohtaan 'arvo' tulee esim 500 tai 45.9 ja sen jälkeen
     *  voit määritellä RGB valuen minkä värinen asia on diagrammissa. Se
     *  ei ole välttämätöntä, mutta suositeltavaa, sillä RGB valuet arvotaan
     *  jos niitä ei ole määritelty, joka saattaa johtaa melkein samoihin
     *  tai jopa täysin samoihin väreihin.
     *
     */

    function CreatePie($data, $topic, $unit, $print = FALSE) {
      // Tarkistetaan, että tarvittava data on annettu
      if (is_array($data) AND sizeof($data) >= 1 AND $topic AND $unit) {
        // Luodaan kuva
        $image = ImageCreate(500, 300) or die("Asenna GD kirjasto!");

        // Asetetaan taustaksi valkoinen
        $white = ImageColorAllocate ($image, 255, 255, 255);

        // Määritetään musta väri
        $black = ImageColorAllocate ($image, 0, 0, 0);

        // Määritetään harmaa väri
        $gray = ImageColorAllocate ($image, 221, 221, 221);

        // Piirretään kuvalle kehykset
        ImageRectangle ($image, 1, 1, ImageSX($image) - 1, ImageSY($image) - 1, $black);

        // Loopataan data läpi
        while (list($key, $val) = each($data)) {
          // Tarkastetaan onko $val array
          if (is_array($val)) {
            // Lasketaan kaikki arvot yhteen kulman laskemista varten
            $values += $val[1];
            // Tarkastetaan onko käyttäjä määritellyt itse värin
            if (($val[2] >= 0 AND $val[2] <= 255 AND $val[2] != "") AND
                ($val[3] >= 0 AND $val[3] <= 255 AND $val[3] != "") AND
                ($val[4] >= 0 AND $val[4] <= 255 AND $val[4] != ""))
{
              // Jos on määritellään uusi väri
              $data[$key][5] = ImageColorAllocate ($image, $val[2], $val[3], $val[4]);
            } else {
              // Jos ei niin määritellään random väri
              $data[$key][5] = ImageColorAllocate ($image, $this->RandomNum(0, 255),
                                                           $this->RandomNum(0, 255),
                                                           $this->RandomNum(0, 255));

            }

          } else {
            // Jos $val ei ole array niin tulee virheilmoitus
            die ("Data taulukon arvon tyyppi ei kelpaa!");
          }
        }

        // Piirretään otsikko
        ImageString ($image, 5, floor((ImageSX($image) / 2) - ((ImageFontWidth(5) * strlen($topic)) / 2)),
                     10, $topic, $black);

        // Piirretään boksi minne selitykset tulevat
        ImageRectangle ($image, ImageSX($image) - 230, 60, ImageSX($image) - 20,
                        60 + (sizeof($data) * ImageFontHeight(2)) + 16, $black);

        // Täytetään boksi harmaalla
        ImageFilledRectangle ($image, ImageSX($image) - 229, 61, ImageSX($image) - 21,
                              60 + (sizeof($data) * ImageFontHeight(2)) + 15, $gray);

        // Loopataan data läpi ja piirretään ympyrän osat ja selitykset väreille
        for ($i = 0; $i < sizeof($data); $i++) {
          // Lasketaan loppu kulma
          $end_angle = $data[$i][1] / $values * 360;

          // Piirretään slaissi lisää tietoja funktiosta: https://www.php.net/ImageFilledArc
          ImageFilledArc ($image, 125, 155, 200, 200, $start_angle,
                          $start_angle + $end_angle, $data[$i][5], IMG_ARC_PIE);

          // Lisätään aloitus kulmaan lopetus kulma
          $start_angle += $end_angle;

          // Piirretään neliö, ja sen viereen selitys, mitä se väri tarkoittaa
          ImageRectangle ($image, ImageSX($image) - 221,
                          ImageFontHeight(2) * $i + 5 + 66, ImageSX($image) - 214,
                          ImageFontHeight(2) * $i + 10 + 68, $black);

          ImageFilledRectangle ($image, ImageSX($image) - 220,
                                ImageFontHeight(2) * $i + 5 + 67, ImageSX($image) - 215,
                                ImageFontHeight(2) * $i + 10 + 67, $data[$i][5]);

          ImageString ($image, 2, ImageSX($image) - 210,
                       ImageFontHeight(2) * $i + 5 + 63,
                       $data[$i][0] . " (" . $data[$i][1] . $unit . ")", $black);
        }

        // Piirretään ääriviivat ympyrälle
        ImageArc ($image, 125, 155, 200, 200, 0, 360, $black);

        // Piirretään yhteensä teksti
        ImageString ($image, 2,
                     floor((ImageSX($image) / 2) - ((ImageFontWidth(2) * strlen("Yhteensä: " . $values . $unit)) / 2)),
                     ImageSY($image) - 25, "Yhteensä: " . $values . $unit, $black);

        // Tarkastetaan haluaako käyttäjä tulostaa kuvan suoraan
        if (!$print) {
          // Jos ei, pelautetaan kuva vain resource muuttujana
          return $image;
        }

        // Jos haluaa niin lähetetään headerit
        $this->Headers();

        // Tulostetaan kuva
        ImagePng ($image);
        // Ja vapautetaan muistia tuhoamalla kuva
        ImageDestroy ($image);

      } else {
        die ("Ei tarpeeksi parametrejä");
      }
    }
  }
?>

Esimerkki:

  <?php
    $data = Array ( // RGB valuet voi jättää pois, mutta silloin värit arvotaan
      Array ("Assembly", 11, 190, 200, 250),
      Array ("C", 44, 190, 250, 200),
      Array ("C++", 37, 70, 110, 70),
      Array ("Delphi", 51, 240, 170, 240),
      Array ("Java", 16, 100, 50, 100),
      Array ("Perl", 17, 240, 250, 180),
      Array ("PHP", 152, 90, 100, 150),
      Array ("Visual Basic", 17, 250, 170, 170),
      Array ("Muut", 35, 120, 120, 120)
    );
    $img = new diagram;
    $img->CreatePie($data, "Koodikirjaston jakauma", " kpl", TRUE);
  ?>

  Esimerkkiä voi tarkastella täällä: http://koti.mbnet.fi/jonij/Diagrammi%20luokka.php

mikaelh [29.05.2003 16:36:39]

#

Hmm.. Ei sitä satunnaislukugeneraattoria sentään joka kerta tarvitse alustaa. ;-)

thefox [30.05.2003 13:12:03]

#

Juu, ei tarvitse, eikä saa. Vähentää satunnaisuutta.

thefox [30.05.2003 13:12:34]

#

Unohtui sanoa, että muuten ihan ok vinkki.

kala [06.06.2003 17:06:26]

#

Satunnaislukugeneraattori kannattaisi varmaan alustaa aina samalla arvolla, muutoin peräkkäin piirretty sama kuva vaihtaa värejä joka latauskerralla!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta