cirkel diagram
jeg har fundet et rigtig fed function på udvikleren.dk som kan tegne cirkeldiagrammer! :)jeg fatter ikke særligt meget af matematiken og jeg kan da heller ikk få det til at virke :(
koden ser således ud:
<?
function cirkeldiagram($numbers, $names, $radius)
{
reset($numbers);
reset($names);
$countNumbers = count($numbers);
$countNames = count($names);
$settingSizePrNameDescription = 15;
$settingMargin = 5;
$width = $settingMargin + (2 * $radius) + $settingMargin;
$height = $settingMargin + (2 * $radius) + $settingMargin + ($settingSizePrNameDescription * $countNumbers) + $settingMargin;
$centerCircle = round($width / 2);
$sumOfNumbers = array_sum($numbers);
$degreesPrUnit = 360 / $sumOfNumbers;
$numbersDegrees;
$namesOnSlices;
// billedet oprettes
$img = imagecreatetruecolor($width, $height);
// farver initialiseres
$colorsWhite = imagecolorallocate($img, 0xFF, 0xFF, 0xFF);
$colorsBlack = imagecolorallocate($img, 0x00, 0x00, 0x00);
$colorsCircle[1] = imagecolorallocate($img, 0xFF, 0x00, 0x00);
$colorsCircle[2] = imagecolorallocate($img, 0x00, 0xFF, 0x00);
$colorsCircle[3] = imagecolorallocate($img, 0x00, 0x00, 0xFF);
$colorsCircle[4] = imagecolorallocate($img, 0xFF, 0xFF, 0x00);
$colorsCircle[5] = imagecolorallocate($img, 0xFF, 0x00, 0xFF);
$colorsCircle[6] = imagecolorallocate($img, 0x00, 0xFF, 0xFF);
$colorsCircle[7] = imagecolorallocate($img, 0xEE, 0xEE, 0xEE);
$colorsCircle[8] = imagecolorallocate($img, 0xCC, 0xCC, 0xCC);
$colorsCircle[9] = imagecolorallocate($img, 0x99, 0x99, 0x99);
$colorsCircle[10] = imagecolorallocate($img, 0x66, 0x66, 0x66);
// baggrundsfarve
imagefilledrectangle($img, 0, 0, $width, $height, $colorsWhite);
// selve cirklen tegnes
imageellipse($img, $centerCircle, $centerCircle, 2 * $radius, 2 * $radius, $colorsBlack);
foreach($numbers as $value)
{
$numbersDegrees[] = $value * $degreesPrUnit;
$numbersProcentOfSum[] = number_format(($value/$sumOfNumbers) * 100, 2, ",", ".");
$numbersTmp[] = $value;
}
foreach($names as $value)
{
$namesOnSlices[] = $value;
}
$indexColor = 1;
$indexDegree = 0;
foreach($numbersDegrees as $value)
{
$degree = $value + $indexDegrees;
$indexDegrees = $degree;
// koordinater til at farve cirkelafsnit beregnes i følgende afsnit kode
// konvertér fra grader til radian
$rad = deg2rad($indexDegrees);
// x-koordinaten beregnes
$x = (cos($rad) * ($radius - 5)) + $centerCircle;
// y-koordinaten beregnes
$y = (sin($rad) * ($radius - 5)) + $centerCircle;
imagefilltoborder($img, $x, $y, $colorsBlack, $colorsCircle[$indexColor + 1]);
// koordinater til at tegne stregerne til afgrænsning af cirkelafsnit beregnes i følgende afsnit kode
// konvertér fra grader til radian
$rad = deg2rad($degree);
$x = (cos($rad) * ($radius - 1)) + $centerCircle;
$y (sin($rad) * ($radius - 1)) + $centerCircle;
imageline($img, $centerCircle, $centerCircle, $x, $y, $colorsBlack);
// koordinater til at tegne den sorte firkant farven til forklaring forklaringen af data
imagerectangle($img, $settingMargin, (2 * $radius) + (2 * $settingMargin) + (($indexColor - 1) * $settingSizePrNameDescription), ($settingMargin) + 10, ((2 * $radius) + (2 * $settingMargin) + (($indexColor - 1) * $settingSizePrNameDescription)) + 10, $colorsBlack);
// forklaringsboksene skal også have lidt farve
imagefilltoborder($img, $settingMargin + 1, ((2 * $radius) + (2 * $settingMargin) + (($indexColor - 1) * $settingSizePrNameDescription)) + 1, $colorsBlack, $colorsCircle[$indexColor + 1]);
// hvis der ikke er noget tilhørende navn
if ($namesOnSlices[$indexColor - 1] == "")
$namesOnSlices[$indexColor - 1] = $numbersTmp[$indexColor - 1];
// info skrives
imagestring($img, 2, 20, (2 * $radius) + (2 * $settingMargin) + (($indexColor - 1) * $settingSizePrNameDescription), $namesOnSlices[$indexColor - 1] . " (" . $numbersProcentOfSum[$indexColor - 1] . "%)", $colorsBlack);
// næste!
$indexColor++;
}
// farver sidste slice – samme princip som alle de andre
$rad = deg2rad(1);
$x = (cos($rad) * ($radius - 5)) + $centerCircle;
$y = (sin($rad) * ($radius - 5)) + $centerCircle;
imagefilltoborder($img, $x, $y, $colorsBlack, $colorsCircle[2]);
// billedet tegnes
imagepng($img);
imagedestroy($img);
}
// kunne kaldes på følgende måde:
$stats = explode(",", $_GET["s"]);
$navne = explode(",", $_GET["n"]);
header("Content-type: image/png");
cirkeldiagram($stats, $navne, $_GET["r"]);
?>
og den skal så kaldes med fx:
create.php?r=50&s=50,45,87,54&n=Dansk,Svensk,Norsk,Finsk
mit problem er at den skriver en fatalerror!
Call to undefined function: 98.7143451969() in /var/www/www.alvision.dk/www/image/create.php on line 76
hvad gør jeg galt!? kunne vildt godt tænke mig at kunne bruge functionen til et statistiksystem jeg er i gang med :)
på forhånd tak!
