Avatar billede bgo Nybegynder
07. april 2005 - 14:15 Der er 1 løsning

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"]);

?>
Avatar billede bgo Nybegynder
16. april 2005 - 13:59 #1
åbenbart en periodisk ting - i al fald er problemet væk uden at jeg har gjort noget for det...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester