• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imagepolygon()

    (PHP 4, PHP 5, PHP 7)

    画一个多边形

    说明

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

    imagepolygon()在图像中创建一个多边形。$points是一个 PHP 数组,包含了多边形的各个顶点坐标,即 points[0]= x0,points[1]= y0,points[2]= x1,points[3]= y1,以此类推。$num_points是顶点的总数。

    imagepolygon()例子

    <?php
    // create a blank image
    $image = imagecreatetruecolor(400, 300);
    // fill the background color
    $bg = imagecolorallocate($image, 0, 0, 0);
    // choose a color for the polygon
    $col_poly = imagecolorallocate($image, 255, 255, 255);
    // draw the polygon
    imagepolygon($image,
                 array (
                        0, 0,
                        100, 200,
                        300, 200
                 ),
                 3,
                 $col_poly);
    // output the picture
    header("Content-type: image/png");
    imagepng($image);
    ?>
    

    参见imagecreate()和imagecreatetruecolor()。

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

    上篇:imagepng()

    下篇:imagepsbbox()