PHP Doku:: Draws an arc - function.imagearc.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzBildverarbeitung und -generierungBildbearbeitung und GDGD- und Image-Funktionenimagearc

Ein Service von Reinhard Neidl - Webprogrammierung.

GD- und Image-Funktionen

<<imageantialias

imagechar>>

imagearc

(PHP 4, PHP 5)

imagearcDraws an arc

Beschreibung

bool imagearc ( resource $image , int $cx , int $cy , int $width , int $height , int $start , int $end , int $color )

imagearc() zeichnet einen Kreisbogen um den angegebenen Mittelpunkt

Parameter-Liste

image

Eine von den verschiedenen Erzeugungsfunktionen wie imagecreatetruecolor() gelieferte Grafikressource.

cx

x-Koordinate des Mittelpunkts

cy

y-Koordinate des Mittelpunkts

width

Die Breite der Ellipse

height

Die Höhe der Ellipse

start

Der Startwinkel des Bogens, in Grad.

end

Der Endwinkel des Bogens, in Grad. 0° liegt in der Drei-Uhr-Position und der Bogen wird im Uhrzeigersinn gezeichnet.

color

Eine mit imagecolorallocate() erstellte Farbe

Rückgabewerte

Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.

Beispiele

Beispiel #1 Zeichnen eines Kreises mittels imagearc()

<?php

// eine 200*200-Grafik erstellen
$img imagecreatetruecolor(200200);

// Farben vorbereiten
$white imagecolorallocate($img255255255);
$red   imagecolorallocate($img255,   0,   0);
$green imagecolorallocate($img,   0255,   0);
$blue  imagecolorallocate($img,   0,   0255);

// Kopf
imagearc($img100100200200,  0360$white);
// Mund
imagearc($img10010015015025155$red);
// Augen
imagearc($img,  60,  75,  50,  50,  0360$green);
imagearc($img140,  75,  50,  50,  0360$blue);

// Ausgabe im Browser
header("Content-type: image/png");
imagepng($img);

// Speicher freigeben
imagedestroy($img);

?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

Ausgabe des Beispiels: Zeichnen eines Kreises mittels imagearc()

Siehe auch


19 BenutzerBeiträge:
- Beiträge aktualisieren...
ajim1417 at gmail dot com
29.01.2010 4:42
I wrote a simple function that can draws an arc counter-clockwisekly. Here it is :

<?php

function imagearcCC(&$im, $cx, $cy, $w, $h, $s, $e, $c) {
$start = 360 - $e;
$end = 360 - $s;
return
imagearc($im, $cx, $cy, $w, $h, $start, $end, $c);
}

?>

The params of this function is exactly the same as the usual imagearc function.
anton dot vandeghinste at telenet dot be
13.12.2009 16:27
I needed an arc with a thick border and i didn't like to use 359.9 as end angle so i made a function that works pretty well:

<?php
function imagearcthick($image, $x, $y, $w, $h, $s, $e, $color, $thick = 1)
{
    if(
$thick == 1)
    {
        return
imagearc($image, $x, $y, $w, $h, $s, $e, $color);
    }
    for(
$i = 1;$i<($thick+1);$i++)
    {
       
imagearc($image, $x, $y, $w-($i/5), $h-($i/5),$s,$e,$color);
       
imagearc($image, $x, $y, $w+($i/5), $h+($i/5), $s, $e, $color);
    }
}
?>
mojiro at awmn dot net
13.12.2005 21:28
A previous for the Rotated (Filled)Ellipse note from(nojer2 at yahoo dot com, 02-Apr-2001 12:06) has a mistake, at the second arc. Replace them with the following listing.

if ($filled) {
    triangle($im, $cx, $cy, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
    triangle($im, $cx, $cy, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
} else {
    imageline($im, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
    imageline($im, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
}
ruturaj_v at yahoo dot com
17.05.2004 15:32
this is another piechart eg. very simple ...

<?php
global $deg;

function
get_polar($xrel, $yrel, $ang, $radius) {
   
$i = $ang;
   
$ang = ($ang * pi())/ 180;
   
   
$ix = abs($radius*cos($ang));
   
$iy = abs($radius*sin($ang));
   
    if (
$i>=0 && $i<=90) {
       
$ix = $xrel + $ix;
       
$iy = $yrel - $iy;
    }
    if (
$i>90 && $i<=180) {
       
$ix = $xrel - $ix;
       
$iy = $yrel - $iy;
    }
    if (
$i>180 && $i<=270) {
       
$ix = $xrel - $ix;
       
$iy = $yrel + $iy;
    }
    if (
$i>270 && $i<=360) {
       
$ix = $xrel + $ix;
       
$iy = $yrel + $iy;
    }

   
$ix = floor($ix);
   
$iy = floor($iy);
   
//echo ($ix . " $iy<br>");
   
$returnvals = array (
                       
'x1' => $xrel,
                       
'y1' => $yrel,
                       
'x2' => $ix,
                       
'y2' => $iy
                       
);
    return
$returnvals;
}

function
get_degtotal($degindex)
{
    global
$deg;
    if (
$degindex == 0 ) {
       return ( 
$deg[$degindex] );
    }
    else {       
        return (
$deg[$degindex] + get_degtotal($degindex-1) );
    }   
}

$im  = imagecreate (400, 400);
$w   = imagecolorallocate ($im, 255, 255, 255);
$black   = imagecolorallocate ($im, 0, 0, 0);
$red = imagecolorallocate ($im, 255, 0, 0);
$green = imagecolorallocate ($im, 0, 180, 0);

$randcolor[0] = imagecolorallocate($im, 243, 54, 163);
$randcolor[1] = imagecolorallocate($im, 179, 51, 247);
$randcolor[2] = imagecolorallocate($im, 103, 48, 250);
$randcolor[3] = imagecolorallocate($im, 53, 145, 244);
$randcolor[4] = imagecolorallocate($im, 54, 243, 243);
$randcolor[5] = imagecolorallocate($im, 107, 245, 180);
$randcolor[6] = imagecolorallocate($im, 203, 242, 111);
$randcolor[7] = imagecolorallocate($im, 248, 201, 105);

$data[0] = 30;
$data[1] = 20;
$data[2] = 15;
$data[3] = 10;
$data[4] = 8;
$data[5] = 7;
$data[6] = 5;
$data[7] = 5;

$datasum = array_sum($data);

$deg[0] = number_format((30 / $datasum * 360), 2, ".", "");
$deg[1] = number_format((20 / $datasum * 360), 2, ".", "");
$deg[2] = number_format((15 / $datasum * 360), 2, ".", "");
$deg[3] = number_format((10 / $datasum * 360), 2, ".", "");
$deg[4] = number_format((8 / $datasum * 360), 2, ".", "");
$deg[5] = number_format((7 / $datasum * 360), 2, ".", "");
$deg[6] = number_format((5 / $datasum * 360), 2, ".", "");
$deg[7] = number_format((5 / $datasum * 360), 2, ".", "");
echo (
'<pre>');

//print_r($deg);

$datadeg = array();
$datapol = array();
$degbetween = array();
$databetweenpol = array();

for (
$i=0; $i < count($deg) ; $i++) {
   
$datadeg[$i] = get_degtotal($i);
   
$datapol[$i] = get_polar(200, 200, $datadeg[$i], 100);
}

for (
$i=0; $i < count($datadeg) ; $i++) {
   
/*this is a trick where you take 2deg angle before
    and get the smaller radius so that you can have a pt to
    `imagefill` the chartboundary
    */
   
$degbetween[$i] = ($datadeg[$i]-2);
   
$databetweenpol[$i] = get_polar(200, 200, $degbetween[$i], 50);
}

print_r($datadeg);
print_r($degbetween);
print_r($databetweenpol);
//exit;

for ($i=0; $i<count($deg); $i++) {
   
imageline ($im, 200, 200, $datapol[$i]['x2'], $datapol[$i]['y2'], $black);
}
imagearc($im, 200, 200, 200, 200, 0, 360, $black);

for (
$i=0; $i<count($deg); $i++) {
   
imagefill ($im, $databetweenpol[$i]['x2'], $databetweenpol[$i]['y2'], $randcolor[$i]);

}

//header ("Content-type: image/png");
imagepng($im, 'piechart.png');
?>
<img src='piechart.png'>
jerryscript at aol dot com
26.12.2003 11:05
[note-Apache/1.3.29 (Win32) PHP/4.3.4]

The imagearc (and imageellipse) functions do not accept line thicknesses when drawn from 0 to 360 degrees.

Drawing from 0 to 359 and again from 359 to 360 does create an ellipse with the current line thickness.

Jerry
eamon at hostelworld dot com
17.12.2003 16:24
Right...
possibly the easiest way of drawing a filled circle:
Loop through the imagearc function incrementing the diameter by one pixel:
<?
 
// --- code fragment --- //

for($i=1; $i<$Diameter; $i++){
 
imagearc($Image, $CenterX, $CenterY, $i, $i, $Start, $End, $Color);
}

// --------------------- //

?>

This works great for circles with diameters up to about 60 or 70 pixels wide. After that, you start to get pixle gaps.
logang at deltatee dot com
5.08.2003 5:19
Heres a function to make a curve between two points... This will be a downward curve but it wouldn't be hard to make a similar function to make an upward curve. The first point has to be to the left of the second point ($x1 < $x2), and height is actually backwards. The larger height is the less of a crest the curve has. I imagine with a few modifications this functions could make upward curves as well.

function ImageCurveDown ($image, $x1, $y1, $x2, $y2, $height, $color) {
    $presicion = 1;

    for ($left = ($x1-$x2); $left < 0; $left++){
        if ($y1 < $y2) {
            $cy = $y2 + $height;
            $cx = $x1 - $left;
        } else {
            $cy = $y1 + $height;
            $cx = $x2 + $left;
        }
        $nx1 = abs($x1 - $cx);
        $ny1 = abs($y1 - $cy);
        $nx2 = abs($x2 - $cx);
        $ny2 = abs($y2 - $cy);

        if ($y1 < $y2) {
            if ($nx2 == 0 || $ny1 == 0) continue;
            $angle1 = atan($height/$nx2);
            $A1 = $nx2/cos ($angle1);
            $B1 = $ny2/sin ($angle1);
            $angle2 = pi()/2 +atan($left/$ny1);
            $A2 = $nx1/cos ($angle2);
            $B2 = $ny1/sin ($angle2);
        } else {
            if ($ny2 == 0 || $nx1 == 0) continue;
            $angle1 = atan($ny2/$nx2);
            $A1 = abs($nx2/cos ($angle1));
            $B1 = abs($ny2/sin ($angle1));
            $angle2 = atan($height/$nx1);
            $A2 = abs ($nx1/cos ($angle2));
            $B2 = abs($ny1/sin ($angle2));
        }

        if (abs($A1 - $A2) < $presicion && abs ($B1 - $B2) < $presicion) {
            ImageArc($image, $cx, $cy, $A1*2, $B1*2, 180+rad2deg($angle2), 360-rad2deg($angle1), $color);
        }
    }
}

23.01.2003 17:55
Please note that in order to draw a complete circle or ellipse (without using the imageellipse) you mustn't use 0° for both s and e. If you do this you will get, umm, nothing. Instead set s to 0° and e to 360° to get a complete circle or ellipse.
jinny at 263 dot net
14.05.2002 7:27
imagesetstyle() sets the style to be used by all line drawing functions when drawing with the special color .

Here goes a example of drawing a dashed-line circle.enjoy!

<?php

header
("Content-type: image/jpeg");
$im = imagecreate(100,100);

$b   = imagecolorallocate ($im, 0, 0, 0);
$w   = imagecolorallocate ($im, 255, 255, 255);

$style = array ($b,$b,$b,$b,$b,$w,$w,$w,$w,$w);

imagesetstyle ($im, $style);

imagearc($im,50,50,100,100,0,360,IMG_COLOR_STYLED);

imagejpeg($im);
imagedestroy($im);
?>
arve at skogvold dot as
30.11.2001 22:04
I found a better way for drawing a pie chart:

header ("Content-type: image/png");
$diameter = 100;
$radius = $diameter / 2;
$centerX = $radius;
$centerY = $radius;

$im = @ImageCreate ($diameter, $diameter)
    or die ("Cannot Initialize new GD image stream");

$background = ImageColorAllocate ($im, 0, 0, 0);
$red = ImageColorAllocate ($im, 176, 0, 0);

function fill_arc($start, $end, $color) {
    global $diameter, $centerX, $centerY, $im, $radius;
    imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color);
    imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $radius, $centerY + sin(deg2rad($start)) * $radius, $color);
    imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end)) * $radius, $centerY + sin(deg2rad($end)) * $radius, $color);
    imagefill ($im,$centerX + $radius * 0.5 *cos(deg2rad($start+($end-$start)/2)), $centerY + $radius * 0.5 * sin(deg2rad($start+($end-$start)/2)), $color);
    }


fill_arc(0,30,$red);
// Will make a red filled arc, starting at 0 degrees, ending at 30 degrees

ImagePng ($im);
marc at resiteit dot com
8.11.2001 22:04
Round cornered anti-aliased dynamically sized button.

$w=40;
$h=20;
$im = ImageCreate($w,$h);
$white=ImageColorAllocate($im,255,255,255);
ImageFilledRectangle($im,0,0,$w,$h,$white);
imagecolortransparent ($im, $white);
ImageTTFText ($im, $h+ceil($h/3)+1, 0, -1, $h-1, $col1, "arialbd.ttf", "O");
ImageTTFText ($im, $h+ceil($h/3)+1, 0, $w-$h, $h-1, $col1, "arialbd.ttf", "O");
ImageTTFText ($im, $h+ceil($h/3)+1, 0, 1, $h-1, $col1, "arialbd.ttf", "O");
ImageTTFText ($im, $h+ceil($h/3)+1, 0, $w-$h-2, $h-1, $col1, "arialbd.ttf", "O");
$points=array(
    1,round($h/2),
    round($h/4),$h-round($h/4),
    round($h/2),$h,
    $w-(round($h/2)),$h,
    $w-(round($h/4)),$h-round($h/4),
    $w-2,round($h/2),
    $w-round($h/4),round($h/4),
    $w-round($h/2),0,
    round($h/2),0,
    round($h/4),round($h/4)
);
imagefilledpolygon ($im, $points, 10, $col1);

header("content-type: image/gif");
header("Content-Disposition: filename=name.gif");
ImageGif($im);
ImageDestroy($im);
foripepe at yahoo dot com
2.09.2001 18:56
To fill an arc (DiameterX != DiameterY):

<?
function imagefilledarc($Image, $CenterX, $CenterY, $DiameterX, $DiameterY, $Start, $End, $Color) {
   
// To draw the arc
   
imagearc($Image, $CenterX, $CenterY, $DiameterX, $DiameterY, $Start, $End, $Color);
   
// To close the arc with 2 lines between the center and the 2 limits of the arc
   
$x = $CenterX + (cos(deg2rad($Start))*($DiameterX/2));
   
$y = $CenterY + (sin(deg2rad($Start))*($DiameterY/2));
   
imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
   
$x = $CenterX + (cos(deg2rad($End))*($DiameterX/2));
   
$y = $CenterY + (sin(deg2rad($End))*($DiameterY/2));
   
imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
   
// To fill the arc, the starting point is a point in the middle of the closed space
   
$x = $CenterX + (cos(deg2rad(($Start+$End)/2))*($DiameterX/4));
   
$y = $CenterY + (sin(deg2rad(($Start+$End)/2))*($DiameterY/4));
   
imagefilltoborder($Image, $x, $y, $Color, $Color);
}
?>

To close the arc with 2 lines (DiameterX != DiameterY):

<?
function imagenofilledarc($Image, $CenterX, $CenterY, $DiameterX, $DiameterY, $Start, $End, $Color) {
   
// To draw the arc
   
imagearc($Image, $CenterX, $CenterY, $DiameterX, $DiameterY, $Start, $End, $Color);
   
// To close the arc with 2 lines between the center and the 2 limits of the arc
   
$x = $CenterX + (cos(deg2rad($Start))*($DiameterX/2));
   
$y = $CenterY + (sin(deg2rad($Start))*($DiameterY/2));
   
imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
   
$x = $CenterX + (cos(deg2rad($End))*($DiameterX/2));
   
$y = $CenterY + (sin(deg2rad($End))*($DiameterY/2));
   
imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
}
?>

An example:
<?
    $destImage
= imagecreate( 216, 152 );
   
$c0 = imagecolorallocate( $destImage, 0, 255, 255 );
   
$c1 = imagecolorallocate( $destImage, 0, 0, 0 );
   
$c2 = imagecolorallocate( $destImage, 255, 0, 0 );
   
ImageFilledRectangle ( $destImage, 0, 0, 216, 152, $c0 );
   
imagefilledarc( $destImage, 108, 76, 180, 80, 0, 130, $c1 );
   
imagenofilledarc( $destImage, 108, 76, 180, 80, 0, 130, $c2 );
   
header("content-type: image/PNG");
   
ImagePNG( $destImage );
   
ImageDestroy( $destImage );
?>

9.04.2001 7:37
The following site contains heaps of different functions to draw graphs with easy to follow code for newbies and heaps of examples with OVER 60 different predefined graphs
http://www.aditus.nu/jpgraph/index.php
nojer2 at yahoo dot com
1.04.2001 23:18
Here's a dashed circle function:

<?php
function dashedcircle($im, $cx, $cy, $radius, $colour, $dashsize=5) {

  
$dash=false;
   for (
$angle=0; $angle<=(180+$dashsize); $angle+=$dashsize) {
     
$x = ($radius * cos(deg2rad($angle)));
     
$y = ($radius * sin(deg2rad($angle)));

      if (
$dash) {
        
imageline($im, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
        
imageline($im, $cx-$px, $cx-$py, $cx-$x, $cy-$y, $colour);
      }
     
$dash=!$dash;
     
$px=$x;
     
$py=$y;
   }
}
?>
nojer2 at yahoo dot com
1.04.2001 23:06
Here's the function to draw rotated ellipses again. This time I've optimised it a bit, fixed the no-fill bug, and used a 'squishratio' rather than a 'radiusmodifier', to make the curves perfect, so ignore my previous version.

<?php
function rotatedellipse($im, $cx, $cy, $width, $height, $rotateangle, $colour, $filled=true) {
  
$step=2;
  
$cosangle=cos(deg2rad($rotateangle));
  
$sinangle=sin(deg2rad($rotateangle));

  
$squishratio = $height/$width;
  
$nopreviouspoint = true;
   for (
$angle=0; $angle<=(180+$step); $angle+=$step) {
      
     
$ox = ($width * cos(deg2rad($angle)));
     
$oy = ($width * sin(deg2rad($angle))) * $squishratio;

     
$x =  + (($ox * $cosangle) - ($oy * $sinangle));
     
$y = $centrey + (($ox * $sinangle) + ($oy * $cosangle));
 
      if (
$nopreviouspoint) {
       
$px=$x;
       
$py=$y;
       
$nopreviouspoint=false;
      }

      if (
$filled) {
        
triangle($im, $cx, $cy, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
        
triangle($im, $cx, $cy, $cx-$px, $cx-$py, $cx-$x, $cy-$y, $colour);
      } else {
        
imageline($im, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
        
imageline($im, $cx-$px, $cx-$py, $cx-$x, $cy-$y, $colour);
      }
     
$px=$x;
     
$py=$y;
   }
}

function
triangle($im, $x1,$y1, $x2,$y2, $x3,$y3, $colour) {
  
$coords = array($x1,$y1, $x2,$y2, $x3,$y3);
  
imagefilledpolygon($im, $coords, 3, $colour);
}
?>
ericquil at yahoo dot com
29.09.2000 13:30
If circles overlap, a temporary border is needed when filling:
<?php
ImageArc
($im,$x,$y,$w,$h,0,360,$temp_color);
ImageFillToBorder($im,$x,$y,$temp_color,$fill_color);
ImageArc ($im,$x,$y,$w,$h,0,360,$fill_color);
?>
cbriou at orange-art dot fr
18.09.2000 4:03
There is another way to fill an arc :

<?php
// To draw the arc
$Color = imagecolorallocate($Image, $Red, $Green, $Blue);
imagearc($Image, $CenterX, $CenterY, $Diameter, $Diameter, $Start, $End, $Color);
// To close the arc with 2 lines between the center and the 2 limits of the arc
$x = $CenterX + (cos(deg2rad($Start))*($Diameter/2));
$y = $CenterY + (sin(deg2rad($Start))*($Diameter/2));
imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
$x = $CenterX + (cos(deg2rad($End))*($Diameter/2));
$y = $CenterY + (sin(deg2rad($End))*($Diameter/2));
imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
// To fill the arc, the starting point is a point in the middle of the closed space
$x = $CenterX + (cos(deg2rad(($Start+$End)/2))*($Diameter/4));
$y = $CenterY + (sin(deg2rad(($Start+$End)/2))*($Diameter/4));
imagefilltoborder($Image, $x, $y, $Color, $Color);
?>
timothyhouck at yahoo dot com
17.08.2000 0:58
To do filled arcs, try something like this:

<?php
$diameter
= 50;
imagearc($image, 25, 25, $diameter, $diameter, $start, $end, $color);
while(
$diameter > 0) {
 
imagearc($image, 25, 25, $diameter, $diameter, $start, $start + 1, $color);
 
imagearc($image, 25, 25, $diameter, $diameter, $end - 1, $end, $color);
 
$diameter--;
}
?>

...well you get the point.  It's a kludge, and *very* slow, but it's free.
travis at duluth dot com
23.12.1999 3:36
The wierd thing is that the first two integers tell where to place the "circle".
So for example I first create the "pallet" to place the circle on.
$image = imagecreate(500, 500); 
(this makes a huge 500x500 gif :) )
$colorBody = imagecolorallocate($image, 0, 0, 0);
(make the default color of the "pallet" black
$circleColor = imagecolorallocate($image, 255, 0, 255);
(going to make the circle an ugly pink color)
imagearc($image, 250, 250, 300, 300, 0, 360, $circleColor);
Places the image in the center (250,250) and the circle is 300 pixels in diameter.

Hope this helps.
 
Travis Kent Beste



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)