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);
?>