imagepolygon

(PHP 4, PHP 5)

imagepolygon多角形を描画する

説明

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

imagepolygon() は、指定した image に多角形を作成します。

パラメータ

image

imagecreatetruecolor() のような画像作成関数が返す画像リソース。

points

多角形の頂点からなる PHP の配列で、 次のようになります。

points[0] = x0
points[1] = y0
points[2] = x1
points[3] = y1

num_points

頂点の総数。

color

imagecolorallocate() で作成した色 ID。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

例1 imagepolygon() の例

<?php
// 空の画像を生成します
$image imagecreatetruecolor(400300);

// 多角形の色を選択します
$col_poly imagecolorallocate($image255255255);

// 多角形を描画します
imagepolygon($image, array(
        
0,   0,
        
100200,
        
300200
    
),
    
3,
    
$col_poly);

// 画像を出力します
header('Content-type: image/png');

imagepng($image);
imagedestroy($image);
?>

上の例の出力は、 たとえば以下のようになります。

出力例 : imagepolygon()

参考

add a note add a note

User Contributed Notes 5 notes

up
1
tatlar at yahoo dot com
8 years ago
Function to get 5-sided polygon (pentagon) or star (pentagram) co-ords.
<?php
function _makeFiveSidedStar( $x, $y, $radius, $shape='polygon', $spiky=NULL ) {
   
$point = array() ; // new 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 // degree of spikiness, 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' ) ;
?>
up
1
glowell at flash dot net
9 years ago
Something to be aware of, ImagePolygon appears to convert the array of points passed to it from whatever format they may have been in originally into integers. This means if you pass it an array of floats (after running a rotation routine for example) the floats will be changed to integers INSIDE THE ORIGINAL ARRAY.

An extreme example: if for some reason you had an unit-sized polygon pt-array ( -1<x|y<1 for easy scaling purpose for instance) and for some reason your code calls imagepolygon on it (why? it'd only be a dot anyway) the array would be unusable after that (all either 1s, 0s or -1s). Scaling a unit-sized array, drawing it and then scaling it again will also may have a different result than expected.

Obviously, if the array in its original state is important to your code, it should use a copy of the original array for this call. If your code draws the same polygon multiple times but resizes it for different cases, you should have each size be created off an original template rather than adjusting a single polygon array.
up
0
licson0729 at gmail dot com
2 years ago
Function to draw a n-sided regular polygon

<?php
$img
= imagecreatetruecolor(1360,768);

function
regularPolygon($img,$x,$y,$radius,$sides,$color)
{
   
$points = array();
    for(
$a = 0;$a <= 360; $a += 360/$sides)
    {
       
$points[] = $x + $radius * cos(deg2rad($a));
       
$points[] = $y + $radius * sin(deg2rad($a));
    }
    return
imagepolygon($img,$points,$sides,$color);
}

regularPolygon($img,1360/2,768/2,300,8,0xffffff);//Test draw

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>
up
0
jsnell at networkninja dot com
13 years ago
Here are some handy routines for rotation and translation of polygons.  Scaling could be added easily as well.

<?php
function translate_point(&$x,&$y,$angle,$about_x,$about_y,$shift_x,$shift_y)
{
   
$x -= $about_x;
   
$y -= $about_y;
   
$angle = ($angle / 180) * M_PI;
/* math:
[x2,y2] = [x,  *  [[cos(a),-sin(a)],
           y]      [sin(a),cos(a)]]
==>
x = x * cos(a) + y*sin(a)
y = x*-sin(a) + y*cos(a)
*/

   
$new_x = $x * cos($angle) - $y * sin($angle);
   
$new_y = $x * sin($angle) + $y * cos($angle);
   
$x = $new_x+ $about_x + $shift_x ;
   
$y = $new_y + $about_y + $shift_y;
}

function
translate_poly($point_array, $angle, $about_x, $about_y,$shift_x,$shift_y)
{
   
$translated_poly = Array();
    while(
count($point_array) > 1)
    {
       
$temp_x = array_shift($point_array);
       
$temp_y = array_shift($point_array);
       
translate_point($temp_x, $temp_y, $angle, $about_x, $about_y,$shift_x, $shift_y);
       
array_push($translated_poly, $temp_x);
       
array_push($translated_poly, $temp_y);
    }
    return
$translated_poly;
}
?>
up
-2
licson0729 at gmail dot com
2 years ago
Here's a function to draw a n-sided star:

<?php
function drawStar($img,$x,$y,$radius,$sides,$color,$spikness=0.5)
{
   
$point =array();
   
$t = 0;
    for(
$a = 0;$a <= 360;$a += 360/($sides*2))
    {
       
$t++;
        if(
$t % 2 == 0)
        {
           
$point[] = $x + ($radius * $spikness) * cos(deg2rad($a));
           
$point[] = $y + ($radius * $spikness) * sin(deg2rad($a));
        }else{
           
$point[] = $x + $radius * cos(deg2rad($a));
           
$point[] = $y + $radius * sin(deg2rad($a));
        }
    }
    return
imagepolygon($img,$point,$sides*2,$color);
}
?>
To Top