Forkert farve i cirkeldiagram
Jeg har herinde fundet et fedt script til at lave cirkeldiagrammer med. Der er blot en bug i den som jeg hverken forstår eller kan gennemskue hvorfor opstår.Det viser sig nemlig at hvis der er 8 opdelinger af diagrammet, så vises den ene del i en forkert farve (en der allerede er brugt) i selve diagrammet, mens den rigtige vises i forklaringen. Dette sker ikke når der er 7 opdelinger og heller ikke ved 9 opdelinger. Godt nok har jeg tænkt mig at modificerer scriptet således at navne og procenter derudover vises ud for deres respektive andel af cirkeldiagrammet (vis jeg da eller kan), men det ville jo være rart hvis de korrekte farver bliver brugt (specielt hvis det viser sig at jeg ikke kan lave modofikationen :D)
Som det ses her
http://www.esea.dk/esea/cirkle.php?r=200&s=29,9,16,2,9,16,3,2&n=SETI@home,Predictor@home,climateprediction.net,LHC@home,Pirates@home,Einstein@home,BURP,None
er der to dele af diagrammet der vises med samme grå nuance, mens det fremgår af forklaringen at den ene skulle være en anden grå nuance - mens hvis jeg propper en ekstra på, som her
http://www.esea.dk/esea/cirkle.php?r=200&s=29,9,16,2,9,16,3,2,7&n=SETI@home,Predictor@home,climateprediction.net,LHC@home,Pirates@home,Einstein@home,BURP,None,hfhf
opstår problemet ikke. Koden til diagrammet kommer hér:
<?
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"]);
?>
