Avatar billede elskermad.dk Nybegynder
21. juli 2004 - 13:12 Der er 15 kommentarer og
1 løsning

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!
Avatar billede taskmgr Nybegynder
21. juli 2004 - 13:17 #1
Der mangler et lighedstegn på linie 76:

$y (sin($rad) * ($radius - 1)) + $centerCircle;
ændres til:
$y = (sin($rad) * ($radius - 1)) + $centerCircle;
Avatar billede elskermad.dk Nybegynder
21. juli 2004 - 13:19 #2
hehe nu er den bar perfekt!
det er da egentlig mærkelig at ingen har bemærket det på udvikleren og skrevet det da den er over et år gammel og der er 20 kommentare hvor alle roser den til skyerne! eheh...

men læg du et svar og du får nogle points :D
Avatar billede taskmgr Nybegynder
21. juli 2004 - 13:22 #3
Det hedder jo ikke eksperten.dk for ingenting ;) Det' gas...
Avatar billede elskermad.dk Nybegynder
21. juli 2004 - 13:23 #4
hehe lige en ting hvis du har tid for ved du er rimelig hård til programmering!

hvordan undgår jeg at den "gemmer" billedet!? det er rimelig irriterende den ikke opdatere billedet når man skriver noget nyt - den hænger i det gamle som om den gemmer billedet!
Avatar billede taskmgr Nybegynder
21. juli 2004 - 13:30 #5
Den forstår jeg ikke helt? Det er jo meningen at du skal kalde billedet sådan her:

<img src="create.php?r=50&s=50,45,87,54&n=Dansk,Svensk,Norsk,Finsk" alt="" />

Og det kan jeg ikke se nogle problemer i?
Avatar billede elskermad.dk Nybegynder
21. juli 2004 - 13:31 #6
jaja det gør jeg også... men hvis jeg så fx næste gang kalder det med: <img src="create.php?r=300&s=20,10,5&n=Ryger,Festryger,Ikkeryger" alt="" /> så viser den den med landene istedet :(
Avatar billede taskmgr Nybegynder
21. juli 2004 - 13:34 #7
Her kommer det nye billede når jeg opdaterer siden. Jeg kan også lave flere forskellige på samme side?
Avatar billede elskermad.dk Nybegynder
21. juli 2004 - 13:35 #8
ehmn ved det sgi ikk.. prøver at tømme internet-filerne og se om det virker :]

men mange tak for hjælpen!
Avatar billede taskmgr Nybegynder
21. juli 2004 - 13:38 #9
Velbekomme :) Du skriver bare her hvis der opstår problemer :)
Avatar billede elskermad.dk Nybegynder
21. juli 2004 - 13:55 #10
ehmn jeg har egentlig et problem som godt nok ikke er så meget med spørgsmålet men jeg kan ikke få det til at virke:

http://www.alvision.dk/statistik/mkimg.php?r=200&s=9,9,5,3&n=/webshop.php,/webshop.php,/,/service.php <-- viser det fint!

http://www.alvision.dk/statistik/showimg.php?r=200&s=9,9,5,3&n=/webshop.php,/webshop.php,/,/service.php <-- vil ikke vise det selvom det skal være den sidde som skal vise det og det er samme kode!?

kan du se fejlen!?
Avatar billede gejl Nybegynder
22. juli 2004 - 13:02 #11
Fejlen ligger i at der ikke er nogen fil der hedder showimg.php
Avatar billede gejl Nybegynder
22. juli 2004 - 13:04 #12
Undskyld... der var jeg lidt for hurtig...!

Indeholder filerne mkimg.php og showimg.php det samme...?
Avatar billede gejl Nybegynder
22. juli 2004 - 13:06 #13
Må jeg evt. se koden for de 2 filer?
Avatar billede taskmgr Nybegynder
22. juli 2004 - 14:51 #14
På den sidste kalder du create.php:
<img src='create.php?r=200&s=9,9,5,3&n=/webshop.php,/webshop.php,/,/service.php' alt=''>

Er du sikker på at det ikke skal være mkimg.php?
Avatar billede elskermad.dk Nybegynder
22. juli 2004 - 18:32 #15
jo selvfølgelig hehe... der var jeg vist lidt for hurtig! :] mange tak igen taskmgr
Avatar billede taskmgr Nybegynder
22. juli 2004 - 18:40 #16
Det var da så lidt :)
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