Utilizzo di cookies
Script GD libray con PHP Modelli Creare immagine Colore e trasparenza Disegnare Pennelli Misurare Filtri Testo Copy Salvare Miscellanea
GD library con PHP
Generatore di stelle
imagearc() e imagepolygon() per generare dinamicamente stelle e cornici


e-book
cartaceo
Asse Esterno X: Asse Esterno Y: Asse Interno X: Asse Interno Y:
VerticiQuantita: VerticiInizio: Angoli: Circonferenze:
Cambiare i valori e premere
generatore di stelle
Mattiamo che su pagine di un sito web si abbia la necessità di disegnare stelle di fatture diverse sia come dimensioni che come quantità di punte.
Per esempio una stella che aumenta come quantità di punte o si ingrandisce per un certo risultato o classifica, e nello stesso tempo essere sicuri che le stelle siano sempre conformate alle necessità?
Occorre allora generarle dinamicamente con le funzioni GD imagearc() e imagepolygon().


Analisi del progetto:
Se consideriamo un pentagono regolare inscritto in una circonferenza, i vertici del pentagono possono anche essere considerati vertici dei raggi di una stella a 5 punte.
Consideriamo adesso una circonferenza interna a questa, sempre con un pentagono regolare inscritto.
Ruotiamo la circonferenza interna in modo che ciascun vertice del pentagono inscritto sia equidistante dai 2 vertici più prossimi del pentagono esterno.
Unendo alternativamente vertici del pentagono esterno ed i vertici del pentagono interno avremo una perfetta stella a 5 punte.
Ma non solo, inscrivendo poligoni con n lati potremo disegnare stelle con n punte, e variando il raggio delle circonferenze cambieranno la lunghezza dei raggi dalle stelle.
Se poi, invece di usare circonferenze usiamo ellissi, anche inclinate (ellisse ruotata), potremo avere cornici da utilizzare per evidenziare testi e immagini, nonché maschere  per la modifica di disegni e foto (vedi estrae trasferisce figura ovale) ed un'ottima base per gradienti stellari. 


Creazione dello script:
Lo script si compone di 3 parti, 
1. Aquiesisce i valori da assegnare alle variabili, crea l'immagine e alloca i colori.
2. Funzione DeterminaValori(), individua, sul piano cartesiano, i valori dei punti necessari
3. Funzione DisegnaStella(), con i valori di ritorno dalla funzione precedente disegna la stella. 

Funzione DeterminaValori() viene invocate 2 volte, alla quale vengono passati i seguenti valori.
$Immagine, l'immagine creata con imagecreate()
$AsseX, $AsseY, assi della circonferenza
$VerticiQuantita, quantità delle punte della stella
$Start, valore in gradi, posizione della prima punta disegnata
$Angoli,$Circonferenze, non necessari al disegno, servono a mostrare vertici e maschere
Ritornano ripettivamente, per le 2 chiamate, $PuntiXYa e $PuntiXYb con i valori X,Y dei vertici.


Funzione DisegnaStella(), viene invocata passandole i valori ritornati dalla funzione DeterminaValori().
Si occupa di disegnare la stella secondo quanto ricevuto.
Le vengono passati i seguenti valori:
$Immagine, l'immagine creata con imagecreate()
$PuntiXYa, $PuntiXYb, array dei punti x,y del piano cartesiano individuati sulle 2 circonferenze
$Rosso, colore con il quale disegnare la stella.


<?php 
$AsseEsternoX = isset($_POST['AsseEsternoX']) ? $_POST['AsseEsternoX'] : 250; 
$AsseEsternoY = isset($_POST['AsseEsternoY']) ? $_POST['AsseEsternoY'] : 250; 
$AsseInternoX = isset($_POST['AsseInternoX']) ? $_POST['AsseInternoX'] : 70; 
$AsseInternoY = isset($_POST['AsseInternoY']) ? $_POST['AsseInternoY'] : 70; 
$VerticiQuantita = isset($_POST['VerticiQuantita']) ? $_POST['VerticiQuantita'] : 7; 
$VerticiInizio = isset($_POST['VerticiInizio']) ? $_POST['VerticiInizio'] : 0; 
$Angoli = isset($_POST['Angoli']) ? $_POST['Angoli'] : "No"; 
$Circonferenze = isset($_POST['Circonferenze']) ? $_POST['Circonferenze'] : "No"; 


function DeterminaValori($Immagine,$AsseX,$AsseY,$VerticiQuantita, $Start,$Angoli,$Circonferenze){
$PuntiXY = array(); // Inizializza l'array vertici su piano cartesiano
$Corda = 360/ $VerticiQuantita; // distanza fra i vertici del poligono inscritto


for($V = 0; $V < $VerticiQuantita; $V ++){ // scorre corde calcolando X,Y su piano cartesiano
$VerticeCorrente = ($Start + $Corda);
$sin = sin(deg2rad($VerticeCorrente)); $cos = cos(deg2rad($VerticeCorrente)); // valori in radianti
$RadX =  round($cos*(0) - $sin*($AsseX * .5 * -1)); // Vertice corrente, X su cartesiano
$RadY =  round($sin*(0) + $cos*($AsseY * .5 * -1)); // Vertice corrente, Y su cartesiano


// Spinge il valore nella matrice base/vertice dei raggi della stella
array_push($PuntiXY, Cx + $RadX); array_push($PuntiXY, Cy + $RadY); 


// se $Angoli == "Si" disegna $Angoli e punti sui quali è costruita la stella
$Giallo = imagecolorallocate($Immagine, 255, 255, 0);
if($Angoli == "Si"){imagefilledellipse ($Immagine , Cx + $RadX , Cy + $RadY , 10 , 10 , $Giallo );}


// se $Circonferenze == "Si" disegna Circonferenze meschera della stella
if($Circonferenze == "Si"){
imagearc($Immagine,
Cx, Cy, //  coordinate x,y del centro
$AsseX, $AsseY, 
$Start, // inizio corda
$Start + $Corda, // fine corda 
$Giallo
}
$Start += $Corda; // nuovo vertice
}
return $PuntiXY; // punti xy sul paino cartesiano dei vertici
}
function DisegnaStella($Immagine, $PuntiXYa, $PuntiXYb,$Colore){
$VerticiQuantita = count($PuntiXYa) / 2; // quantità raggi della stella
$Vertici = array(); // quntità punti fra i quali tracciare la stella
for($z = 0; $z<$VerticiQuantita * 2; $z+=2){ //inserisce alternati punti interni/esterni in array $Vertici
array_push($Vertici, $PuntiXYa[$z]);array_push($Vertici, $PuntiXYa[$z+1]);// esterni
array_push($Vertici, $PuntiXYb[$z]);array_push($Vertici, $PuntiXYb[$z+1]);// interni
}
imagepolygon($Immagine, $Vertici, $VerticiQuantita * 2 , $Colore ); // disegna la stella
}


//*** inizio creazione stelle ***
$Immagine = imagecreate(300, 300); // crea immagine
define('Cx', 150); define('Cy', 150); // centro immagine
imagecolorallocate($Immagine, 0, 255, 0); // colore sfondo 
$Rosso = imagecolorallocate($Immagine, 255, 0, 0);


//Cx = $Larghezza * .5; Cy = Cx; // centro immagine,Circonferenze e posizione in gradi primo arco 
$AsseX = $AsseEsternoX; $AsseY = $AsseEsternoY;


// circonferenza esterna
$Start = $VerticiInizio; 
$PuntiXYa = DeterminaValori($Immagine,$AsseX,$AsseY,$VerticiQuantita,$Start,$Angoli,$Circonferenze);


// circonferenza interna
$Start = $VerticiInizio + 180 / $VerticiQuantita; // vertici ruotati con raggi sincronizzati al 50%
$AsseX = $AsseInternoX; $AsseY = $AsseInternoY; 
$PuntiXYb = DeterminaValori($Immagine,$AsseX,$AsseY,$VerticiQuantita,$Start,$Angoli,$Circonferenze);


DisegnaStella($Immagine, $PuntiXYa, $PuntiXYb,$Rosso);


imagepng($Immagine,"NomeFile.png"); // salva immagine
imagedestroy($Immagine); // libera memoria
?>