lunedì 2 dicembre 2013

La OOP in PHP spiegata in un esempio - Parte 5 - Le Classi al Lavoro


Non resta che implementare una classe concreta per aAreaDiDisegno che chiameremo cAreaDiDisegnoHTML. Tale classe non deve fare altro che implementare il metodo output lasciato astratto dalla genitrice.

A tal fine, volendo implementare il sistema che faccia uso di un * per rappresentare un punto e il tag PRE per popolare l'area di disegno, potremo scrivere:

<?php

require_once './aAreaDiDisegno.php';

class cAreaDiDisegnoHTML extends aAreaDiDisegno {

    public function output() {
        $output = '<pre style="font-size:12px;line-height:7px;">';
        for ($y = 1; $y <= $this->getAltezza(); $y++) {
            for ($x = 1; $x <= $this->getLarghezza(); $x++)
                $output.=(isset($this->puntiDisegnati[$x][$y])) ? "<span style=\"color:rgb({$this->puntiDisegnati[$x][$y]->getR()},{$this->puntiDisegnati[$x][$y]->getG()},{$this->puntiDisegnati[$x][$y]->getB()})\">*</span>" : ' ';
            $output.="\n";
        }
        return $output . "</pre>";
    }

}

?>

E' ora possibile scriver e il primo script di test che disegni testualmente facendo uso delle classi fin qui definite.

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Forme Geometriche</title>
    </head>
    <body>
        <?php
            require_once './cAreaDiDisegnoHTML.php';
            require_once './cPoligono.php';
            require_once './cColore.php';
            require_once './cCoordinate.php';
            require_once './cPunto.php';
          
            $tavolozza = [
                'rosso'  => new cColore(255, 0, 0),
                'verde'  => new cColore(0, 255, 0),
                'blu'    => new cColore(0, 0, 255),
                'grigio' => new cColore(127, 127, 127),
                'nero'   => new cColore(0,0,0)
            ];
          
            $ad = new cAreaDiDisegnoHTML(100, 100);
          
            $puntoA=new cPunto(new cCoordinate(1, 1), $tavolozza['verde']);
            $puntoB=new cPunto(new cCoordinate(1, 50), $tavolozza['verde']);
            $puntoC=new cPunto(new cCoordinate(50, 50), $tavolozza['verde']);
            $puntoD=new cPunto(new cCoordinate(50, 1), $tavolozza['verde']);
          
                                  
            $poligono = new cPoligono($tavolozza['grigio']);
            $poligono->setVertice($puntoA);
            $poligono->setVertice($puntoB);
            $poligono->setVertice($puntoC);
            $poligono->setVertice($puntoD);
            $poligono->disegna($ad);
          
            $ad->tracciaSegmento($puntoA, $puntoC, $puntoA);
            $ad->tracciaSegmento($puntoB, $puntoD, $tavolozza['rosso']);
          
            $ad->tracciaPunto($puntoA, $tavolozza['blu']);
            $ad->tracciaPunto($puntoB, $tavolozza['blu']);
            $ad->tracciaPunto($puntoC, $tavolozza['blu']);
            $ad->tracciaPunto($puntoD, $tavolozza['blu']);
                                  
            echo $ad->output();
        ?>
    </body>
</html>

La pagina di test non fa altro che definire una array $tavolozza con alcuni oggetto colori pronti all'uso, creare una nuova istanza di un'area di disegno HTML, definire 4 punti e un poligono grigio (un quadrato tenendo conto che i caratteri hanno una altezza doppia rispetto alla propria larghezza). I vertici del poligono sono popolati con i punti creati precedentemente, quindi si disegna il poligono sull'area di disegno, poi sono tracciati direttamente sull'area di disegno i 4 punti e due segmenti che congiungono i punti opposti. Il risultato dello script è quello in figura.

L'output prodotto dallo script di test