Ź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...

Komentarze

 

Dodaj komentarz

 

Dostępne bbcode: b, u, i, url, code, php, css, html, sql, js

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer