Секторная диаграмма на PHP
Секторная диаграмма на PHP
Возникла задача в автоматическом режиме сгенерировать несколько секторных диаграмм на PHP. Никаких ракетных технологий, всего два разноцветных сектора, заданные значения углов. Казалось бы, решение тоже получается простейшее.
От нулевой точки окружности до заданного угла функцией ImageFilledArc нарисовали один сектор, затем от этого же угла до нуля нарисовали второй сектор.
Code (PHP) : Убрать нумерацию
- $image_x=600;
- $image_y=450;
- $im=Imagecreatetruecolor($image_x, $image_y);
- $lgray=ImageColorAllocate($im, 250,250,250);
- $blue=ImageColorAllocate($im, 183,221,232);
- $red=ImageColorAllocate($im, 255,51,0);
- ImageFill($im,0,0,$lgray);
- // Угол секторов
- $angle=72;
- // Нарисовать первый сектор от 0 до $angle
- ImageFilledArc($im,
- ($image_x/2),($image_y/2),
- 400,400,
- 0,$angle,
- $red,
- IMG_ARC_PIE // Сектор с заливкой
- );
- // Нарисовать второй сектор от $angle до 0
- ImageFilledArc($im,
- ($image_x/2),($image_y/2),
- 400,400,
- $angle,0,
- $blue,
- IMG_ARC_PIE // Сектор с заливкой
- );
Некорректная диаграмма
Например, в диапазоне 271-274 градусов красный сектор окружности отрисовывается корректно, тогда как начало синего фиксируется где-то на 274 градусах. При этом, если проставить комбинацию флагов IMG_ARC_EDGED + IMG_ARC_NOFILL, то есть сектор без заливки, все рисуется как должно быть.
Секторная диаграмма без заливки
Но задачу никто не отменял, решать ее все равно надо. Пришлось сперва рисовать сектора без заливки, а затем выполнять заливку самостоятельно при помощи функции ImageFill. Координаты начала заливки берутся по биссектрисе каждого из секторов ближе к наружному контуру, чтобы корректно обрабатывать небольшие углы.
Code (PHP) : Убрать нумерацию
- $image_x=600;
- $image_y=450;
- $im=Imagecreatetruecolor($image_x, $image_y);
- $lgray=ImageColorAllocate($im, 250,250,250);
- $blue=ImageColorAllocate($im, 183,221,232);
- $red=ImageColorAllocate($im, 255,51,0);
- ImageFill($im,0,0,$lgray);
- // Угол секторов
- $angle=272;
- // Координаты по биссектрисе
- $dy=150*sin(deg2rad($angle/2));
- $dx=150*cos(deg2rad($angle/2));
- // Нарисовать первый сектор от 0 до $angle
- ImageFilledArc($im,
- ($image_x/2),($image_y/2),
- 400,400,
- 0,$angle,
- $red,
- IMG_ARC_EDGED+IMG_ARC_NOFILL // Сектор без заливки
- );
- // Выполнить заливку первого сектора
- ImageFill($im,($image_x/2)+$dx,($image_y/2)+$dy,$red);
- // Нарисовать второй сектор от $angle до 0
- ImageFilledArc($im,
- ($image_x/2),($image_y/2),
- 400,400,
- $angle,0,
- $blue,
- IMG_ARC_EDGED+IMG_ARC_NOFILL // Сектор без заливки
- );
- // Выполнить заливку второго сектора
- ImageFill($im,($image_x/2)-$dx,($image_y/2)-$dy,$blue);
Секторная диаграмма с заливкой
Не исключаю, что в каких-то свежих версиях PHP этот косяк уже исправлен, но мне приходится работать с тем, что есть. Соответственно, и решения задач приходится искать, основываясь на доступных инструментах.
Просмотров: 685 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария