PHP 7.2.0 Release Candidate 4 Released

imagefilledpolygon

(PHP 4, PHP 5, PHP 7)

imagefilledpolygonDibujar un polígono con relleno

Descripción

bool imagefilledpolygon ( resource $image , array $points , int $num_points , int $color )

imagefilledpolygon() crea un polígono relleno en image.

Parámetros

image

Un recurso image, es devuelto por una de las funciones de creación de imágenes, como imagecreatetruecolor().

points

Una matriz que contiene las coordenadas x e y de los vértices del polígono consecutivamente.

num_points

Número total de vértices, lo que debe ser al menos 3.

color

Un identificador de color creado con imagecolorallocate().

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

Ejemplos

Ejemplo #1 Ejemplo de imagefilledpolygon()

<?php
// establecer una matriz de puntos para el polígono
$valores = array(
            
40,  50,  // Point 1 (x, y)
            
20,  240// Point 2 (x, y)
            
60,  60,  // Point 3 (x, y)
            
24020,  // Point 4 (x, y)
            
50,  40,  // Point 5 (x, y)
            
10,  10   // Point 6 (x, y)
            
);

// crear imagen
$imagen imagecreatetruecolor(250250);

// asignar colores
$fondo   imagecolorallocate($imagen000);
$azul imagecolorallocate($imagen00255);

// rellenar el fondo
imagefilledrectangle($imagen00249249$fondo);

// dibujar un polígono
imagefilledpolygon($imagen$valores6$azul);

// volcar imagen
header('Content-type: image/png');
imagepng($imagen);
imagedestroy($imagen);
?>

El resultado del ejemplo sería algo similar a:

Salida del ejemplo : imagefilledpolygon()

add a note add a note

User Contributed Notes 8 notes

up
3
tatlar at yahoo dot com
11 years ago
<?php function _makeFiveSidedStar( $x, $y, $radius, $shape='polygon', $spiky=NULL ) {
   
// $x, $y co-ords of origin (in pixels), $radius (in pixels), $shape - 'polygon' or 'star', $spikiness - ratio between 0 and 1
   
$point = array() ;                                                                                                                   
   
$angle = 360 / 5 ;                                                                                                                   
   
$point[0]['x'] = $x ;                                                                                                                
   
$point[0]['y'] = $y - $radius ;                                                                                                      
   
$point[2]['x'] = $x + ( $radius * cos( deg2rad( 90 - $angle ) ) ) ;
   
$point[2]['y'] = $y - ( $radius * sin( deg2rad( 90 - $angle ) ) ) ;
   
$point[4]['x'] = $x + ( $radius * sin( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
   
$point[4]['y'] = $y + ( $radius * cos( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
   
$point[6]['x'] = $x - ( $radius * sin( deg2rad( 180 - ( $angle*2 ) ) ) ) ;                                                           
   
$point[6]['y'] = $y + ( $radius * cos( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
   
$point[8]['x'] = $x - ( $radius * cos( deg2rad( 90 - $angle ) ) ) ;                                                                  
   
$point[8]['y'] = $y - ( $radius * sin( deg2rad( 90 - $angle ) ) ) ;
    if(
$shape == 'star' ) {
        if(
$spiky == NULL ) $spiky = 0.5 // default to 0.5
       
$indent = $radius * $spiky ;
       
$point[1]['x'] = $x + ( $indent * cos( deg2rad( 90 - $angle/2 ) ) ) ;                                                            
       
$point[1]['y'] = $y - ( $indent * sin( deg2rad( 90 - $angle/2 ) ) ) ;                                                    
       
$point[3]['x'] = $x + ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;                                                             
       
$point[3]['y'] = $y - ( $indent * cos( deg2rad( 180 - $angle ) ) ) ;
       
$point[5]['x'] = $x ;                                                                                                            
       
$point[5]['y'] = $y + ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
       
$point[7]['x'] = $x - ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;                                                             
       
$point[7]['y'] = $y - ( $indent * cos( deg2rad( 180 - $angle ) ) ) ;                                                             
       
$point[9]['x'] = $x - ( $indent * cos( deg2rad( 90 - $angle/2 ) ) ) ;                                                            
       
$point[9]['y'] = $y - ( $indent * sin( deg2rad( 90 - $angle/2 ) ) ) ;
    }
   
ksort( $point ) ;
   
$coords = array() ;  // new array                                                                                                                
   
foreach( $point as $pKey=>$pVal ) {                                                                                                  
        if(
is_array( $pVal ) ) {                                                                                                        
            foreach(
$pVal as $pSubKey=>$pSubVal ) {                                                                                     
                if( !empty(
$pSubVal ) ) array_push( $coords, $pSubVal ) ;                                                               
            }                                                                                                                            
        }                                                                                                                                
    }
    return
$coords ;
}
$values = _makeFiveSidedStar( 100, 100, 50, 'star' ) ;
// Put values into imagepolygon function. You need to define the $image and $color, and flush it out to an image type.?>
up
2
jylyn at hotmail dot com
11 years ago
In spite of what it says about requiring more than 3 vertices, it is possible to draw a triangle with this function!
up
1
rbenheidorn at gmail dot com
2 years ago
Discovered while working on printing geographical boundaries to an image: if you provide floating point vertices, then the decimal value is automatically truncated. This can cause images drawn with floating point vertices to shift slightly towards the top-left corner. My personal resolution is to round all of the vertices to their nearest whole values, which eliminates this shift.
up
0
Steween
2 months ago
My version of drawStar (with examples)

<?php
header
("Content-type: image/png");

/* drawStar or regular polygon
    $x, $y  -> Position in the image
    $radius -> Radius of the star
    $spikes -> Number of spikes (min 2)
    $ratio  -> Ratio between outer and inner points
    $dir    -> Rotation 270° for having an up spike( with ratio<1)
*/
function drawStar($x, $y, $radius, $spikes=5, $ratio=0.5, $dir=270) {
   
$coordinates = array();
   
$angle = 360 / $spikes ;
    for(
$i=0; $i<$spikes; $i++){
       
$coordinates[] = $x + (       $radius * cos(deg2rad($dir+$angle*$i)));
       
$coordinates[] = $y + (       $radius * sin(deg2rad($dir+$angle*$i)));
       
$coordinates[] = $x + ($ratio*$radius * cos(deg2rad($dir+$angle*$i + $angle/2)));
       
$coordinates[] = $y + ($ratio*$radius * sin(deg2rad($dir+$angle*$i + $angle/2)));
    }
    return
$coordinates ;
}

// 14*20+24*2 = 328 Examples
$im = imagecreate(800,600);
    
imagecolorallocate($im,   0,   0,   0);
$w = imagecolorallocate($im, 255, 255, 255);
$r = imagecolorallocate($im, 255,   0,   0);
for (
$spikes=2; $spikes<16; $spikes++) { //[2-15]
   
for ($ratio=1; $ratio<21; $ratio++) { //[0.1-2.0]
       
$values = drawStar(40*$ratio-20, $spikes*40-60, 10, $spikes, $ratio/10);
       
imagefilledpolygon($im, $values, count($values)/2, ($ratio % 5 == 0) ? $r : $w);
    }
}
for (
$dir=0; $dir<24; $dir++) {