tenstar
tenstar

Reputation: 10516

PHP Geometry pie chart

i have this php program which takes in an angle as a get parameter and prints a segment of a circle with that angle:

<?php
$size = 600;
$img = imagecreatetruecolor($size, $size);

$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);

imagefilledrectangle($img,0,0,$size,$size,$white);

function Vector($palette,$startx,$starty,$angle,$length,$colour){
    $angle = deg2rad($angle);
    $endx = $startx+cos($angle)*$length;
    $endy = $starty-sin($angle)*$length;
    return(imageline($palette,$startx,$starty,$endx,$endy,$colour));
}

$ang = 0;
while($ang <= $_GET['angle']){
Vector($img,$size/2,$size/2,$ang,200,$black);
$ang += 1;
}


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

?>

The function vector basically draws a line with the given parameters. So i loop through a number of times and then each time i loop through i increase the angle by 1. And then i call the vector function which basically draws a sort of circle segment with the specified angle.

But when i wish to draw another sector of the circle starting at the end point of the previous circle, it overlaps! By the way, here's the code:

<?php
$size = 600;
$img = imagecreatetruecolor($size, $size);

$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
$blue = imagecolorallocate($img, 0, 0, 255);

imagefilledrectangle($img,0,0,$size,$size,$white);

function Vector($palette,$startx,$starty,$angle,$length,$colour){
    $angle = deg2rad($angle);
    $endx = $startx+cos($angle)*$length;
    $endy = $starty-sin($angle)*$length;
    return(imageline($palette,$startx,$starty,$endx,$endy,$colour));
}

$int = 0;
while($int <= $_GET['angle']){
Vector($img,$size/2,$size/2,$int,200,$black);
$int += 0.01;
}

$int = 0;
while($int <= $_GET['angle']){
Vector($img,$size/2,$size/2,$int,200,$blue);
$int += 0.01;
}


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

?>

In the above code, i expect to draw a circle sector with an angle and then draw another sector with the same angle but in blue color.

I want the 2nd sector to start where the first sector ended, but it overlaps?

So how do i make it start where the previous one stopped?

Upvotes: 0

Views: 360

Answers (2)

davidf2281
davidf2281

Reputation: 1328

Just FYI, you only need to change two lines of your original code to do what you want. Delete the second $int = 0; and make a change to the next line so that:

$int = 0;
while($int <= $_GET['angle']){
Vector($img,$size/2,$size/2,$int,200,$blue);
$int += 0.01;
}

Becomes:

//delete '$int = 0;'
while($int <= ($_GET['angle']) * 2){
Vector($img,$size/2,$size/2,$int,200,$blue);
$int += 0.01;
}

It's not a general solution but hopefully will allow you to see what you were originally doing wrong.

Upvotes: 0

Anshu Dwibhashi
Anshu Dwibhashi

Reputation: 4685

You say, that you have a function to draw a vector with a certain angle right? Then you can have a loop 360 times and increase the angle by 1 degree per loop and draw the vector. You'll get a circle.

For a pie chart all you have to do is change colours at certain intervals depending upon your segment's angle...

If you're working on a voting system, here's the FULL source code for a PHP image generator which takes in n number of QueryString arguments and makes a pie chart with all those QueryString arguements and puts in a legend for them:

<?php
$size = 600;
$img = imagecreatetruecolor($size, $size);

$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);

imagefilledrectangle($img,0,0,$size,$size,$white);

function Vector($palette,$startx,$starty,$angle,$length,$colour){
    $angle = deg2rad($angle);
    $endx = $startx+cos($angle)*$length;
    $endy = $starty-sin($angle)*$length;
    return(imageline($palette,$startx,$starty,$endx,$endy,$colour));
}

$sum__ = array_sum($_GET);
$items = array();
foreach($_GET as $key => $value){
$items[$key] = ($value/$sum__)*360;
}

$items2 = array();

$cur = 0;
foreach($items as $key => $value){
$cur += $value;
$items2[$key]=$cur;
}

$colors = array();
foreach($items as $key => $value){
while(array_key_exists($key,$colors) == False){
$tempcolor = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
if(in_array($tempcolor,$colors) == False){
$colors[$key] = $tempcolor;
}
}
}

$int = 0;
foreach($items2 as $key => $value){
while($int <= $value){
Vector($img,$size/2,$size/2,$int,200,$colors[$key]);
$int += 0.01;
}
}

$container = 10;
foreach($items2 as $key => $value){
imagefilledrectangle($img, 4, $container, 50, $container+15, $colors[$key]);
imagestring($img,5,4+60,$container,$key,$black);
$container += 20;
}

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

?>

hope that helps...

Upvotes: 1

Related Questions