Blog. Just Blog

Секторная диаграмма на PHP

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Секторная диаграмма на PHP
Секторная диаграмма на PHP

Возникла задача в автоматическом режиме сгенерировать несколько секторных диаграмм на PHP. Никаких ракетных технологий, всего два разноцветных сектора, заданные значения углов. Казалось бы, решение тоже получается простейшее.

От нулевой точки окружности до заданного угла функцией ImageFilledArc нарисовали один сектор, затем от этого же угла до нуля нарисовали второй сектор.
  1. $image_x=600;
  2. $image_y=450;
  3.  
  4. $im=Imagecreatetruecolor($image_x$image_y);
  5.  
  6. $lgray=ImageColorAllocate($im250,250,250);
  7. $blue=ImageColorAllocate($im183,221,232);
  8. $red=ImageColorAllocate($im255,51,0);
  9.  
  10. ImageFill($im,0,0,$lgray);
  11.  
  12. // Угол секторов
  13. $angle=72;
  14.  
  15. // Нарисовать первый сектор от 0 до $angle
  16. ImageFilledArc($im,
  17.     ($image_x/2),($image_y/2),
  18.     400,400,
  19.     0,$angle,
  20.     $red,
  21.     IMG_ARC_PIE // Сектор с заливкой
  22. );
  23.  
  24. // Нарисовать второй сектор от $angle до 0
  25. ImageFilledArc($im,
  26.     ($image_x/2),($image_y/2),
  27.     400,400,
  28.     $angle,0,
  29.     $blue,
  30.     IMG_ARC_PIE // Сектор с заливкой
  31. );
Однако, как показала практика, все не так просто. Действительно, для большинства значений углов картинка получается правильной, но нашлось несколько диапазонов, где возникает следующая аномалия.

Некорректная диаграмма
Некорректная диаграмма

Например, в диапазоне 271-274 градусов красный сектор окружности отрисовывается корректно, тогда как начало синего фиксируется где-то на 274 градусах. При этом, если проставить комбинацию флагов IMG_ARC_EDGED + IMG_ARC_NOFILL, то есть сектор без заливки, все рисуется как должно быть.

Секторная диаграмма без заливки
Секторная диаграмма без заливки

Но задачу никто не отменял, решать ее все равно надо. Пришлось сперва рисовать сектора без заливки, а затем выполнять заливку самостоятельно при помощи функции ImageFill. Координаты начала заливки берутся по биссектрисе каждого из секторов ближе к наружному контуру, чтобы корректно обрабатывать небольшие углы.
  1. $image_x=600;
  2. $image_y=450;
  3.  
  4. $im=Imagecreatetruecolor($image_x$image_y);
  5.  
  6. $lgray=ImageColorAllocate($im250,250,250);
  7. $blue=ImageColorAllocate($im183,221,232);
  8. $red=ImageColorAllocate($im255,51,0);
  9.  
  10. ImageFill($im,0,0,$lgray);
  11.  
  12. // Угол секторов
  13. $angle=272;
  14.  
  15. // Координаты по биссектрисе
  16. $dy=150*sin(deg2rad($angle/2));
  17. $dx=150*cos(deg2rad($angle/2));
  18.  
  19. // Нарисовать первый сектор от 0 до $angle
  20. ImageFilledArc($im,
  21.     ($image_x/2),($image_y/2),
  22.     400,400,
  23.     0,$angle,
  24.     $red,
  25.     IMG_ARC_EDGED+IMG_ARC_NOFILL // Сектор без заливки
  26. );
  27.  
  28. // Выполнить заливку первого сектора
  29. ImageFill($im,($image_x/2)+$dx,($image_y/2)+$dy,$red);
  30.  
  31. // Нарисовать второй сектор от $angle до 0
  32. ImageFilledArc($im,
  33.     ($image_x/2),($image_y/2),
  34.     400,400,
  35.     $angle,0,
  36.     $blue,
  37.     IMG_ARC_EDGED+IMG_ARC_NOFILL // Сектор без заливки
  38. );
  39.  
  40. // Выполнить заливку второго сектора
  41. ImageFill($im,($image_x/2)-$dx,($image_y/2)-$dy,$blue);
Цветными точками я отметил координаты начала заливки, это исключительно для наглядности, чтобы было понятнее.

Секторная диаграмма с заливкой
Секторная диаграмма с заливкой

Не исключаю, что в каких-то свежих версиях PHP этот косяк уже исправлен, но мне приходится работать с тем, что есть. Соответственно, и решения задач приходится искать, основываясь на доступных инструментах.

Поделиться ссылкой ВКонтакте
Просмотров: 553 | Комментариев: 0

Метки: PHP, графика

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.13 сек. / MySQL: 2 (0.0082 сек.) / Память: 4.5 Mb
Наверх