Hej allesammen,
Jeg er igang med at lave noget statestik på noget data og ville godt have det illustreret, hertil fandt jeg den udemærket guide på denne siden.
Har en functions fil med følgende kode:
<?
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"]);
?>
Funktionen bliver kaldt i min statestik side hvor jeg har lavet et meget hurtigt eksempel for at teste koden af.
<?
if(!$_SESSION['login'])
{
echo '<script>location.href = "index.php"</script>';
}
?>
<table cellspan="0" cellpadding="0" border="0" width="100%">
<tr>
<td>
<?
$stats = "40,50";
$stats = explode(",", $stats);
$navne = "dansk,engelsk";
$navne = explode(",", $navne);
header("Content-type: image/png");
cirkeldiagram($stats, $navne, '50');
?>
</td>
</tr>
</table>
Jeg får en bugget fejlkode. Først troede jeg at den udskrev billedet som tekst men billedet bliver så vidt jeg kan se ikke oprettet på serveren.
‰PNG IHDRn‘ý`öIDATxœíÙ’´*„‹ÿû¿²ç‚š¦X H¥òb ÙüLpó<©úïí œ#E “¢„IQÂôïí DdŒ‘D[톹JÆNÄ(Hõ:YóV ~A@êðÍð•“zåÄ¡åštJφÓÎðSâœsœrŠ U ñ@Ç¢\\¢¯±@Ž+1DÏ2ÉVF8ÒjÐW.fF®!öÄ»r=3r ±'Ò•Ë›‘ iO˜+w0#Òž”7†&åæ4{QÁѪ—fʃ8ZuÑlGyG«vš(åhÕH³åÑZhV£¼€£U5Í:”×p´ª£©Oaª@y™%*Œ)Ey%G+)Mmà0‰P^lI+‘1Ë(¯çhU¦© ¦Jµ¤§‚1Õ•0åPª%™rÆTW¤(aJ¢ÔÖP²«+aŠ£TKf7¦º&E “¢„)‚R;J"Ý¥º&E “¢„IQ¢Ô{ŽXáG] “¢„IQ¤(aZâ}ð¹õ6Ù(¡'žüÖke”5Ýdl¶ ÊÍ:ƒrW‚N¯£Üž Ó[(Ï!è4å"/1XÑ8‘ ß~íJCtÁ´¡<ц%aQÞHÐ ‚òj‚NñogÈî<d÷jråų’£T‚Q*A©’ßú™ËÑýõ3yöçWÏ´A´ Žž/‹s,†´åÍ$O³ë+®Á%å¿ú~½SÇU¥gBzRÕÖóí ÿrñëÆ/¸ó7Q¦—i©[ïú\\,‹ç)¯Ï÷`t{é¼i̤bÿÿôùû¢6ÙQ:‡IQ¤(aR”0)J˜%LÿÐâmIQ¶IEND®B`‚
Nogle der kender en løsning på problemet?