|
|
imagefilledarc (PHP 4 >= 4.0.6, PHP 5) imagefilledarc -- Draw a partial ellipse and fill it Описаниеbool imagefilledarc ( resource image, int cx, int cy, int width, int height, int start, int end, int color, int style )
Draws a partial ellipse centered at the specified coordinate in the
given image.
Список параметров
imageAn image resource, returned by one of the image creation functions,
such as imagecreatetruecolor(). cx
x-coordinate of the center
cy
y-coordinate of the center
width
The arc width
height
The arc height
start
The arc start angle, in degrees.
end
The arc end angle, in degrees.
0° is located at the three-o'clock position, and the arc is drawn
clockwise.
color
A color identifier created with
imagecolorallocate()
style
A bitwise OR of the following possibilities:
IMG_ARC_PIE IMG_ARC_CHORD IMG_ARC_NOFILL IMG_ARC_EDGED
IMG_ARC_PIE and IMG_ARC_CHORD are
mutually exclusive; IMG_ARC_CHORD just
connects the starting and ending angles with a straight line, while
IMG_ARC_PIE produces a rounded edge.
IMG_ARC_NOFILL indicates that the arc
or chord should be outlined, not filled. IMG_ARC_EDGED,
used together with IMG_ARC_NOFILL, indicates that the
beginning and ending angles should be connected to the center - this is a
good way to outline (rather than fill) a 'pie slice'.
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Примеры
Пример 1. Creating a 3D looking pie |
<?php
$image = imagecreatetruecolor(100, 100);
$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$gray = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);
$darkgray = imagecolorallocate($image, 0x90, 0x90, 0x90);
$navy = imagecolorallocate($image, 0x00, 0x00, 0x80);
$darknavy = imagecolorallocate($image, 0x00, 0x00, 0x50);
$red = imagecolorallocate($image, 0xFF, 0x00, 0x00);
$darkred = imagecolorallocate($image, 0x90, 0x00, 0x00);
for ($i = 60; $i > 50; $i--) {
imagefilledarc($image, 50, $i, 100, 50, 0, 45, $darknavy, IMG_ARC_PIE);
imagefilledarc($image, 50, $i, 100, 50, 45, 75 , $darkgray, IMG_ARC_PIE);
imagefilledarc($image, 50, $i, 100, 50, 75, 360 , $darkred, IMG_ARC_PIE);
}
imagefilledarc($image, 50, 50, 100, 50, 0, 45, $navy, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 45, 75 , $gray, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 75, 360 , $red, IMG_ARC_PIE);
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>
|
Результатом выполнения данного примера
будет что-то подобное: 
|
ПримечанияЗамечание: Эта функция нуждается в GD версии 2.0.1 или выше.
Mike
14-Aug-2007 12:43
The previous example does not work well. This is much better and faster:
<?php
$Randomized = rand(1,20);
for($i=0;$i<=$Randomized;$i++){$data[$i]=rand(2,20);};$imgx='600';$imgy='400';$cx = '300';$cy ='150'; $sx = '600';$sy='300';$sz ='100';$data_sum = array_sum($data);
for($i=0;$i<=$Randomized;$i++){
$angle[$i] = (($data[$i] / $data_sum) * 360);
$angle_sum[$i] = array_sum($angle);
};
$im = imagecreate ($imgx,$imgy);
$background = imagecolorallocate($im, 255, 255, 255);
for($i=0;$i<=$Randomized;$i++){
$r=rand(100,255);$g=rand(100,255);$b=rand(100,255);
$colors[$i] = imagecolorallocate($im,$r,$g,$b);
$colord[$i] = imagecolorallocate($im,($r/1.5),($g/1.5),($b/1.5));
}
for($z=1;$z<=$sz;$z++){
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,0
,$angle_sum[0],$colord[0],IMG_ARC_EDGED);
for($i=1;$i<=$Randomized;$i++){
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,$angle_sum[$i-1]
,$angle_sum[$i],$colord[$i],IMG_ARC_NOFILL);
};
};
imagefilledarc($im,$cx,$cy,$sx,$sy,0 ,$angle_sum[0], $colors[0], IMG_ARC_PIE);
for($i=1;$i<=$Randomized;$i++){
imagefilledarc($im,$cx,$cy,$sx,$sy,$angle_sum[$i-1] ,$angle_sum[$i], $colors[$i], IMG_ARC_PIE);
};
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
imazir at gmail dot com
31-Jan-2006 02:53
The previous example does not work. Try those modifications and you will have the expected results :
<?
$Randomized = rand(1,20);
for($i=0;$i<=$Randomized;$i++){$data[$i]=rand(2,20);};//full array with garbage.
$imgx='200';$imgy='200';//Set Image Size. ImageX,ImageY
$cx = '100';$cy ='50'; //Set Pie Postition. CenterX,CenterY
$sx = '200';$sy='100';$sz ='20';// Set Size-dimensions. SizeX,SizeY,SizeZ
$data_sum = array_sum($data);
//convert to angles.
for($i=0;$i<=$Randomized;$i++){
$angle[$i] = (($data[$i] / $data_sum) * 360);
$angle_sum[$i] = array_sum($angle);
};
$im = imagecreate ($imgx,$imgy);
$background = imagecolorallocate($im, 255, 255, 255);
//Random colors.
for($i=0;$i<=$Randomized;$i++){
$r=rand(100,255);$g=rand(100,255);$b=rand(100,255);
$colors[$i] = imagecolorallocate($im,$r,$g,$b);
$colord[$i] = imagecolorallocate($im,($r/2),($g/2),($b/2));
}
//3D effect.
for($z=1;$z<=$sz;$z++){
for($i=1;$i<=$Randomized;$i++){
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,$angle_sum[$i-1]
,$angle_sum[$i],$colord[$i],IMG_ARC_PIE);
};
};
//Top pie.
for($i=1;$i<=$Randomized;$i++){
imagefilledarc($im,$cx,$cy,$sx,$sy,$angle_sum[$i-1] ,$angle_sum[$i], $colors[$i], IMG_ARC_PIE);
};
//Output.
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
Byron at theworks dot net dot nz
10-Oct-2005 11:52
try this,
<?
$Randomized = rand(1,20);
for($i=0;$i<=$Randomized;$i++){$data[$i]=rand(2,20);};//full array with garbage.
$imgx='200';$imgy='200';//Set Image Size. ImageX,ImageY
$cx = '100';$cy ='50'; //Set Pie Postition. CenterX,CenterY
$sx = '200';$sy='100';$sz ='20';// Set Size-dimensions. SizeX,SizeY,SizeZ
$data_sum = array_sum($data);
//convert to angles.
for($i=0;$i<=$Randomized;$i++){
$angle[$i] = (($data[$i] / $data_sum) * 360);
$angle_sum[$i] = array_sum($angle);
};
$im = imagecreate ($imgx,$imgy);
$background = imagecolorallocate($im, 255, 255, 255);
//Random colors.
for($i=0;$i<=$Randomized;$i++){
$r=rand(100,255);$g=rand(100,255);$b=rand(100,255);
$colors[$i] = imagecolorallocate($im,$r,$g,$b);
$colord[$i] = imagecolorallocate($im,($r/2),($g/2),($b/2));
}
//3D effect.
for($i=0;$z<=$sz;$z++){
for($i=0;$i<=$Randomized;$i++){
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,$angle_sum[$i-1]
,$angle_sum[$i],$colord[$i],IMG_ARC_PIE);
};
};
//Top pie.
for($i=0;$i<=$Randomized;$i++){
imagefilledarc($im,$cx,$cy,$sx,$sy,$angle_sum[$i-1] ,$angle_sum[$i], $colors[$i], IMG_ARC_PIE);
};
//Output.
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
paulcharltonthomson at hotmail dot com
01-Jul-2005 11:00
Here's a slightly better way to get the colours for the pie chart shaded wall as posted by double-zonk at wp dot pl
<?php
$rgb0 = array (255, 153, 204);
$rgb1 = array (255, 153, 0);
$rgb2 = array (153, 204, 0);
$rgb3 = array (51, 153, 102);
$rgb4 = array (51, 204, 204);
$rgb5 = array (51, 102, 255);
$rgb6 = array (128, 0, 128);
$rgb7 = array (150, 150, 150);
for ($r = 0; $r < 8; ++$r)
{
if(${"rgb" . $r}[0] < 50) $shadowr = 0; else $shadowr = ${"rgb" . $r}[0] - 50;
if(${"rgb" . $r}[1] < 50) $shadowg = 0; else $shadowg = ${"rgb" . $r}[1] - 50;
if(${"rgb" . $r}[2] < 50) $shadowb = 0; else $shadowb = ${"rgb" . $r}[2] - 50;
${"wall" . $r} = array ($shadowr, $shadowg, $shadowb);
}
for ($s = 0; $s < 8; ++$s)
{
$kolor[$s] = imagecolorallocate($image, ${"rgb" . $s}[0], ${"rgb" . $s}[1], ${"rgb" . $s}[2]);
$cien[$s] = imagecolorallocate($image, ${"wall" . $s}[0], ${"wall" . $s}[1], ${"wall" . $s}[2]);
}
?>
04-Jun-2005 12:25
For 3D-graphs you will want to have a nice shadow. Here is an easy wat to calculate a good matching shadow to a color.
$color is the color for the pie-piece above, $shadow_color is the shadow under it.
<?php
$mask = 0; $percent = 0.70; $R = rand(0, 124); $G = rand(0, 124); $B = rand(0, 124); $RS = round($R * $percent) + round($mask * (1-$percent));
$GS = round($G * $percent) + round($mask * (1-$percent));
$BS = round($B * $percent) + round($mask * (1-$percent));
$color = imagecolorallocate( $im, $R, $G, $B);
$shadow_color = imagecolorallocate( $im, $RS, $GS, $BS);
?>
double-zonk at wp dot pl
08-Apr-2005 12:25
<?
$width = 300;
$height = 200;
$dane[] = 1;
$dane[] = 2;
$dane[] = 3;
$dane[] = 4;
$dane[] = 5;
$dane[] = 6;
$dane[] = 7;
$dane[] = 8;
$dane[] = 9;
$dane[] = 10;
$dane[] = 11;
// Kolory
$image = imageCreate($width, $height);
$background = imageColorAllocate($image, 205, 205, 205);
$kolor[0] = imageColorAllocate($image, 255, 203, 3);
$kolor[1] = imageColorAllocate($image, 220, 101, 29);
$kolor[2] = imageColorAllocate($image, 189, 24, 51);
$kolor[3] = imageColorAllocate($image, 214, 0, 127);
$kolor[4] = imageColorAllocate($image, 98, 1, 96);
$kolor[5] = imageColorAllocate($image, 0, 62, 136);
$kolor[6] = imageColorAllocate($image, 0, 102, 179);
$kolor[7] = imageColorAllocate($image, 0, 145, 195);
$kolor[8] = imageColorAllocate($image, 0, 115, 106);
$kolor[9] = imageColorAllocate($image, 178, 210, 52);
$kolor[10] = imageColorAllocate($image, 137, 91, 74);
$kolor[11] = imageColorAllocate($image, 82, 56, 47);
$cien[0] = imagecolorallocate($image, 205, 153, 0);
$cien[1] = imagecolorallocate($image, 170, 51, 0);
$cien[2] = imagecolorallocate($image, 139, 0, 1);
$cien[3] = imagecolorallocate($image, 164, 0, 77);
$cien[4] = imagecolorallocate($image, 48, 0, 46);
$cien[5] = imagecolorallocate($image, 0, 12, 86);
$cien[6] = imagecolorallocate($image, 0, 52, 129);
$cien[7] = imagecolorallocate($image, 0, 95, 145);
$cien[8] = imagecolorallocate($image, 0, 65, 56);
$cien[9] = imagecolorallocate($image, 128, 160, 2);
$cien[10] = imagecolorallocate($image, 87, 41, 24);
$cien[11] = imagecolorallocate($image, 32, 6, 0);
// Oblicznia
$suma = array_sum($dane);
$stopnie = 0;
for($i = 0; $i < count($dane); $i++){
$start[$i]= $stopnie;
$stop[$i] = $stopnie + round(($dane[$i] / $suma) * 360, 0);
$stopnie = $stop[$i];
}
$x = $width / 2;
$size = $width / 10;
$y = $height / 2 - $size / 2 - 1;
// Wyswietlanie
for($g = $size; $g > 0; $g--){
for($n = 0; $n < count($dane); $n++){
imagefilledarc($image, $x, $y+$g, $width, $height - $size, $start[$n], $stop[$n], $cien[$n], IMG_ARC_PIE);
}
}
for($i = 0; $i < count($dane); $i++){
imagefilledarc($image, $x, $y, $width, $height - $size, $start[$i], $stop[$i], $kolor[$i], IMG_ARC_PIE);
}
header("Content-type: image/png");
imagePNG($image);
imageDestroy($image);
?>
t_therkelsen at hotmail dot com
08-Mar-2005 01:21
Note that imageFilledArc() and imageArc() both take ints as degree measurements. This is no problem if you're *only* using imageArc() and/or imageFilledArc(). However, if you're using calculated degrees and plan to superimpose other drawing elements (eg., you want to make vertical lines between the shadow 3D effect) you need to floor() your degrees before converting them to radians, otherwise you'll get precision errors.
A small example illustrating the 'feature'...
<?php
$img = imageCreate(400, 400);
$back = imageColorAllocate($img, 0, 0, 0);
$front = imageColorAllocate($img, 255, 255, 255);
$sd = 45.5;
$ed = 130.5;
imageFilledArc($img, 200, 200, 300, 300, $sd, $ed,
$front, IMG_ARC_PIE|IMG_ARC_NOFILL|IMG_ARC_EDGED);
imageArc($img, 200, 230, 300, 300, $sd, $ed, $front);
imageLine($img,
cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+200,
cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+230,
$front);
imageLine($img,
cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+200,
cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+230,
$front);
header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>
And this is how it should be...
<?php
$img = imageCreate(400, 400);
$back = imageColorAllocate($img, 0, 0, 0);
$front = imageColorAllocate($img, 255, 255, 255);
$sd = floor(45.5);
$ed = floor(130.5);
imageFilledArc($img, 200, 200, 300, 300, $sd, $ed,
$front, IMG_ARC_PIE|IMG_ARC_NOFILL|IMG_ARC_EDGED);
imageArc($img, 200, 230, 300, 300, $sd, $ed, $front);
imageLine($img,
cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+200,
cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+230,
$front);
imageLine($img,
cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+200,
cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+230,
$front);
header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>
|