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
Ellissi ruotate
imagesetpixel() per disegnare ellissi ruotate di n gradi


e-book
cartaceo
AsseMAX: Asse MIN: theta (0-360):
Cambiare i valori e premere
ellisse ruotata
A volte sembra che i software grafici diano per scontato che le uniche ellissi che gli utilizzatori abbiano necessità di disegnare siano solo orizzontali e verticali.
Con GD queste non sono le sole possibilità, usando un minimo di programmazione ed impostando ogni singolo pixel con imagesetpixel(), possono anche essere disegnate ellissi e spirali ruotate di quanti gradi si desidera.


Le equazioni per l'ellisse sono:
x = a * cos(t) 
y = b * sin(t)
Dove x ed y sono i punti sul piano cartesiano ed a e b gli assi dell'ellisse, quindi se a = b l'ellisse è una circonferenza, mentre il parametro t varia da 0 a 2π radianti.
Per disegnare l'ellisse ruotata occorre introdurre il parametro theta che indica un angolo generico.
Il valore di theta sarà l'angolo di rotazione dell'ellisse rispetto agli assi ortogonali. 


Se x e y sono le coordinate originali, i valori per la rotazione di un angolo theta diventano:
x = a * cos(t + theta)
y = b * sin(t + theta)


Quindi per disegnare un'ellisse ruotata occorre utilizzare: 
x = a*cos(t)*cos(theta) - b*sin(t)*sin(theta)
y = a*cos(t)*sin(theta) + b*sin(t)*cos(theta)


che scritto in PHP diviene:
for($t = 0; $t < M_PI * 2; $t += 0.01){
$x= $CentroX - $AsseMAX * cos($t)* cos($theta) - $AsseMIN * sin($t)* sin($theta);
$y= $CentroY + $AsseMAX * cos($t)* sin($theta) - $AsseMIN * sin($t)* cos($theta);
imagesetpixel ($Immagine , $x , $y , $Colore);
}


Dove variabili e funzioni significano:
$CentroX e $CentroY: distanza dal punto 0,0 delle coordinate cartesiane GD, in alto a sinistra.
$AsseMAX e $AsseMIN: assi dell'ellisse.
$t: valore fra 0 a 2π radianti
$theta: inclinazione dell'ellisse
$x e $y: cordinate x,y sul piano cartesiano di ogni punto dell'ellisse
$Immagine: immagine creata con imagecreate()
$Colore: colore creato con imagecolorallocate()


imagesetpixel: imposta ogni singolo pixel alle coordinate $x , $y


In questo script viene disegnata un'ellisse ruotata di n gradi, in questo caso 30.
Il disegno viene eseguito nella funzione DisegnaEllissi() alla quale vengono passati i seguenti valori:
$Immagine, immagine creata con imagecreate()
$AsseMAX,$AsseMIN, assi dell'ellisse
$theta, inclinazione dell'ellisse, cambiandone il valore l'ellisse è disegnata ruotata.


Un'altra funzione di nome Coordinate(), mostra gli assi inclinati rispetto al piano ortogonale.
Questa funzione è inserita a titolo esplicativo e possone essere cancellate la chiamata alla funzione e la funzione stessa. In questo caso verrà mostrata solo l'ellisse ruotata.


<?php
$AsseMAX = isset($_POST['AsseMAX']) ? $_POST['AsseMAX'] : 200; 
$AsseMIN = isset($_POST['AsseMIN']) ? $_POST['AsseMIN'] : 100; 
$theta = isset($_POST['theta']) ? $_POST['theta'] : 30; 


function Coordinate($Immagine,$Cx,$Cy,$theta,$AsseMAX,$AsseMIN){
$Viola = imagecolorallocate($Immagine,255,0,255); $Nero = imagecolorallocate($Immagine,0,0,0);


// etichette ed assi dell'immagine contenitore
imagestring ($Immagine,4,$Cx-150,$Cy,"A.MAX=$AsseMAX:A.MIN=$AsseMIN",$Nero);
imagestring ($Immagine,4,$Cx-150,$Cy+20,"theta:g=".floor(rad2deg($theta))." rad=$theta",$Nero);
imageline ($Immagine, 0 , $Cy , $Cx *2, $Cy, $Nero );
imageline ($Immagine, $Cx , 0 , $Cx, $Cy * 2, $Nero );


// asseA dell'ellisse
$asseAx1 = $Cx + $AsseMAX * cos($theta);$asseAy1 = $Cy - $AsseMAX * sin($theta);
$asseAx2 = $Cx - $AsseMAX * cos($theta);$asseAy2 = $Cy + $AsseMAX * sin($theta);
imageline ($Immagine, $asseAx1, $asseAy1 , $asseAx2, $asseAy2, $Viola);
imagefilledellipse($Immagine,$asseAx1,$asseAy1,10,10,$Viola);
imagefilledellipse($Immagine,$asseAx2,$asseAy2,10,10,$Viola);


// asseB dell'ellisse
$asseBx1 = $Cx + $AsseMIN * sin($theta);$asseBy1 = $Cy + $AsseMIN * cos($theta);
$asseBx2 = $Cx - $AsseMIN * sin($theta);$asseBy2 = $Cy - $AsseMIN * cos($theta);
imageline ($Immagine, $asseBx1, $asseBy1, $asseBx2, $asseBy2, $Nero);
imagefilledellipse ($Immagine ,  $asseBx1, $asseBy1 , 10 , 10 , $Nero);
imagefilledellipse ($Immagine ,   $asseBx2, $asseBy2 , 10 , 10 , $Nero);
}


function DisegnaEllissi($Immagine,$AsseMAX,$AsseMIN,$Cx,$Cy,$theta,$Rosso){
$theta = deg2rad($theta); // inclinazione, converte gradi in radianti


// disegna ellissi dell'inclinazione theta
for($t = 0; $t <= M_PI * 2; $t += 0.01){
$x = $Cx - $AsseMAX * cos($t)* cos($theta) - $AsseMIN * sin($t)* sin($theta); // posizione x su cartesiano
$y = $Cy + $AsseMAX * cos($t)* sin($theta) - $AsseMIN * sin($t)* cos($theta); // posizione y su cartesiano
imagesetpixel($Immagine,$x,$y,$Rosso ); // imposta il pixel
}


// etichette ed assi questa chiamata e la funzione che invoca possono essere eliminate
Coordinate($Immagine,$Cx,$Cy,$theta,$AsseMAX,$AsseMIN);
}


$Immagine = imagecreate(500,500); // crea immagine
$Cx = 250; $Cy = 250; // coordinate x,y del centro
imagecolorallocate($Immagine,255,255,255); // sfondo
$Rosso = imagecolorallocate($Immagine,255,0,0);// colore ellissi


// assi ed inclinazione dell'ellisse espressa in gradi
DisegnaEllissi($Immagine,$AsseMAX,$AsseMIN,$Cx,$Cy,$theta,$Rosso); // disegna ellisse
imagepng($Immagine,"NomeFile.png");
imagedestroy($Immagine);
?>