Źle rysujący imagefilledpolygon
Niedawno bawiąc się biblioteką pChart, służącą do rysowania wykresów, natrafiłem na pewien błąd. Rysując wykres kołowy 3d z dużą ilością danych, gdzie kilka z nich miały procentowy udział około 1% okazało się, że wykres jest źle rysowany. Dla mało procentowych wartości ich kawałek wykresu był rysowany jakby z przerwami. Od razu uznałem, że jest to błąd klasy pChart, która nie radzi sobie z małymi danymi i tam właśnie zacząłem szukać błędu. Okazało się jednak inaczej....
Do rysowania wykresu kołowego 3d pChart korzysta z funkcji imagefilledpolygon(). I dla tej funkcji wylicza masę współrzędnych na podstawie zapodanych danych. Tak więc po kilku godzinach analiz danych, echowania co się da i porównywania, okazało się, że pChart poprawnie wylicza współrzędne rysowania dla wszystkich danych. Skoro więc dane są ok, należało poszukać błędu gdzieś indziej. Przy okazji wyszło dokładnie kiedy jest błąd - wtedy, gdy polygon jest tak cieńki, że niemalże jest linią prostą. I w tym momencie mnie coś tknęło - a może to poprostu wina php, a konkretnie funkcji imagefilledpolygon()? Szybko więc skrobnąłem taki o to kodzik:
<?php
$values = array(
40, 50,
45, 50,
60, 51,
90, 52,
);
$image = imagecreatetruecolor(100,100);
$bg = imagecolorallocate($image, 0, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
imagefilledrectangle($image, 0, 0, 100, 100, $bg);
imagefilledpolygon($image, $values, 4, $blue);
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>
Kod ten ma rysować wypełniony poligon. Jednak jest on tak cieńki, że tak naprawdę wychodzi z niego prosta linia a nie poligon. I w tym momencie funkcja imagefilledpolygon() zaczyna źle działać. Poprostu rysuje linię przerywaną zamiast poligonu. I to właśnie przez ten błąd klasa pChart źle rysowała mi wykres kołowy. Rozwiązanie problemu jest banalnie proste. Oprócz imagefilledpolygon() należy wykonać jeszcze imagepolygon().
<?php
$values = array(
40, 50,
45, 50,
60, 51,
90, 52,
);
$image = imagecreatetruecolor(100,100);
$bg = imagecolorallocate($image, 0, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
imagefilledrectangle($image, 0, 0, 100, 100, $bg);
imagefilledpolygon($image, $values, 4, $blue);
imagepolygon($image, $values, 4, $blue);
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>
I już, to wszystko, problem znika No ale na znalezienie takiej popierdułki trzeba było poświęcić parę godzin...