miércoles, 25 de febrero de 2009

Manual de PHP 54. Imágenes: Diagramas de sectores

Diagramas de sectores

Esta posibilidad gráfica de tratamiento de información estadística la proporciona la función imagefilledarc() que requiere -por el orden que se indica- los parámetros:

Xc y Yc que son las coordenadas del centro de la elipse cuyo arco (o porción) tratamos de representar.

A y B que son las longitudes (expresadas en pixels) de los ejes horizontal y vertical de la elipse. Si ambos fueran iguales el resultado sería circular.

Pi y Pf son las posiciones (en grados sexagesimales) de los radios (inicial y final) que delimitan el sector que se trata de representar.

Los cero grados coinciden con el semieje horizontal positivo y el sentido del recorrido angular es el de las agujas del reloj.

$color es la variable -ha de ser definida previamente mediante imagecolorallocate- que indica el color que ha de utilizarse en el gráfico.

El último parámetro es un constante PHP que puede tomar uno de los siguientes valores:

IMG_ARC_PIE
IMG_ARC_NOFILL
IMG_ARC_EDGED
IMG_ARC_CHORD

Con la primera de las constantes dibuja el sector de elipse delimitado por los radios indicados relleno con el color especificado.

El segundo (IM_ARC_NOFILL) únicamente dibuja la porción de arco, pero no incluye los radios en el dibujo.

La opcion IMG_ARC_EDGED se comporta de forma idéntica a IMG_ARC_PIE cuando se utiliza de forma aislada aunque tiene una opción muy interesante que veremos un poco más abajo.

Con IMG_ARC_CHORD el resultado es un triángulo -relleno con el color indicado-formado por los dos radios y la cuerda correspondiente al arco que delimitan.

Combinar dos constantes

Cuando utilizamos como último parámetro de la función imagefilledarc() una expresión del tipo:
IMG_ARC_NOFILL|IMG_ARC_EDGED (fíjate en el signo | que separa ambas constantes) lo que obtenemos es la representación gráfica del contorno del sector (incluye los radios que lo delimitan). Mediante esta opción -con dos llamadas a la función- tenemos la posibilidad de representar el sector con un color de relleno (usando IMG_ARC_PIE) y, luego, superponerle un contorno de distinto color. Puedes verlo en los ejemplos.

Efecto tridimensional

Tal como puedes ver en los ejemplos, resulta fácil lograr un efecto tridimensional en el dibujo de los sectores. Basta con crear un bucle que dibuje arcos sucesivos (separados verticalmente por un pixel) y posteriormente superponer un sector relleno con un color distinto.

Diagramas de sectores

<?
$im = imagecreate (400, 400);
$fondo = imagecolorallocate($im, 226, 226, 226);
$col1=imagecolorallocate($im,255,255,0);
$col2=imagecolorallocate($im,255,0,0);
imagefilledarc($im, 200, 200, 350, 300, 20, 240, $col1, IMG_ARC_PIE);
imagefilledarc($im, 200, 200, 350, 300, 10, 150, $col2, IMG_ARC_NOFILL)
;
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>


<?
$im = imagecreate (400, 400);
$fondo = imagecolorallocate($im, 226, 226, 226);
$col1=imagecolorallocate($im,255,255,0);
$col2=imagecolorallocate($im,255,0,0);
imagefilledarc($im, 200, 200, 350, 300, 20, 240, $col1, IMG_ARC_EDGED);
imagefilledarc($im, 200, 200, 350, 300, 10, 150, $col2, IMG_ARC_NOFILL)
;
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>


<?
$im = imagecreate (400, 400);
$fondo = imagecolorallocate($im, 226, 226, 226);
$color1=imagecolorallocate($im,255,0,0);
imagefilledarc ($im, 200, 200, 350, 300, 20, 240, $color1,
IMG_ARC_NOFILL|IMG_ARC_EDGED)
;
header('Content-type: image/gif');
imagegif($im);
imagedestroy($im);
?>



<?
$im = imagecreate (400, 400);
$fondo = imagecolorallocate($im, 226, 226, 226);
$color1=imagecolorallocate($im,255,0,0);
imagefilledarc ($im, 200, 200, 350, 300, 50, 200, $color1, IMG_ARC_CHORD);
header('Content-type: image/gif');
imagegif($im);
imagedestroy($im);
?>



<?
$im = imagecreate (400, 400);
$fondo = imagecolorallocate($im, 226, 226, 226);
$color1=imagecolorallocate($im,200,0,0);
$color2=imagecolorallocate($im,255,0,0);
$color3=imagecolorallocate($im,255,255,255);
for($i=200;$i<225;$i++){
imagefilledarc($im, 200, $i, 370, 270, 50, 330, $color1,
IMG_ARC_NOFILL|IMG_ARC_EDGED);

}

imagefilledarc($im, 200, 200, 370, 270, 50, 330, $color2, IMG_ARC_EDGED);
imagefilledarc($im, 200,200, 370, 270, 50, 330, $color3,
IMG_ARC_NOFILL|IMG_ARC_EDGED);


header('Content-type: image/gif');
imagegif($im);
imagedestroy($im);
?>



No hay comentarios: