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