Please wait. Loading …

Перейти на главную страницу Горячие цены

Справочник

Рисуем круговую 3D диаграмму

Круговая 3D диаграмма удобна для наглядного сравнительного представления статистических данных и широко применяется в различных офисных программах. Для вывода таких диаграмм средствами php необходимо установить gd библиотеку.

3D эффект имитируется размножением плоских эллипсов по оси Y, причем цвета долей самого верхнего эллипса светлее чем цвета остальных (рис.1).

На рисунке 2 представлена диаграмма, построенная с помощью класса diagram

class diagram{
var $width;
var $height;
var $thick;

function draw($rows){

foreach ($rows as $value){
$total+=$value;
}

$image = imagecreatetruecolor($this->width, $this->height);

// allocate some colors
$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);

$color[1] = imagecolorallocate($image, 128, 0, 0);
$color_d[1] = imagecolorallocate($image, 78, 0, 0);
$color_h[1] = "800000";
$color[2] = imagecolorallocate($image, 153, 204, 0);
$color_d[2] = imagecolorallocate($image, 134, 178, 0);
$color_h[2] = "99cc00";
$color[3] = imagecolorallocate($image, 255, 204, 0);
$color_d[3] = imagecolorallocate($image, 217, 174, 0);
$color_h[3] = "ffcc00";
$color[4] = imagecolorallocate($image, 255, 102, 0);
$color_d[4] = imagecolorallocate($image, 214, 86, 0);
$color_h[4] = "ff6600";
$color[5] = imagecolorallocate($image, 255, 0, 255);
$color_d[5] = imagecolorallocate($image, 207, 0, 207);
$color_h[5] = "ff00ff";
$color[6] = imagecolorallocate($image, 255, 255, 0);
$color_d[6] = imagecolorallocate($image, 219, 219, 0);
$color_h[6] = "ffff00";
$color[7] = imagecolorallocate($image, 128, 128, 0);
$color_d[7] = imagecolorallocate($image, 108, 108, 0);
$color_h[7] = "808000";
$color[8] = imagecolorallocate($image, 128, 128, 128);
$color_d[8] = imagecolorallocate($image, 111, 111, 111);
$color_h[8] = "808080";
$color[9] = imagecolorallocate($image, 255, 204, 153);
$color_d[9] = imagecolorallocate($image, 223, 178, 134);
$color_h[9] = "ffcc99";
$color[10] = imagecolorallocate($image, 0, 0, 255);
$color_d[10] = imagecolorallocate($image, 0, 0, 185);
$color_h[10] = "0000ff";
$color[11] = imagecolorallocate($image, 0, 255, 255);
$color_d[11] = imagecolorallocate($image, 0, 218, 218);
$color_h[11] = "00ffff";
$color[12] = imagecolorallocate($image, 204, 255, 204);
$color_d[12] = imagecolorallocate($image, 178, 223, 178);
$color_h[12] = "ccffcc";
$color[13] = imagecolorallocate($image, 51, 204, 204);
$color_d[13] = imagecolorallocate($image, 43, 173, 173);
$color_h[13] = "33cccc";
$color[14] = imagecolorallocate($image, 0, 255, 0);
$color_d[14] = imagecolorallocate($image, 0, 219, 0);
$color_h[14] = "00ff00";
$color[15] = imagecolorallocate($image, 153, 204, 255);
$color_d[15] = imagecolorallocate($image, 136, 182, 227);
$color_h[15] = "99ccff";
$color[16] = imagecolorallocate($image, 0, 128, 0);
$color_d[16] = imagecolorallocate($image, 0, 97, 0);
$color_h[16] = "008000";
$color[17] = imagecolorallocate($image, 0, 204, 255);
$color_d[17] = imagecolorallocate($image, 0, 175, 219);
$color_h[17] = "00ccff";
$color[18] = imagecolorallocate($image, 204, 255, 255);
$color_d[18] = imagecolorallocate($image, 182, 227, 227);
$color_h[18] = "ccffff";
$color[19] = imagecolorallocate($image, 150, 150, 150);
$color_d[19] = imagecolorallocate($image, 113, 113, 113);
$color_h[19] = "969696";
$color[20] = imagecolorallocate($image, 255, 0, 0);
$color_d[20] = imagecolorallocate($image, 209, 0, 0);
$color_h[20] = "ff0000";

imagefill($image, 0, 0, $white);

// make the 3D effect
for ($i = (($this->height/2) + $this->thick); $i > ($this->height/2); $i--) {

$j=0;
$z1=0;
if ($rows){
foreach ($rows as $value){
$j++;
$z2=$z1+(360/($total/$value));
imagefilledarc($image, ($this->width/2), $i, $this->width, ($this->height)/2, $z1, $z2, $color_d[$j], IMG_ARC_PIE);
$z1=$z2;
}
}
}

$j=0;
$z1=0;
foreach ($rows as $value){
$j++;
$z2=$z1+(360/($total/$value));
imagefilledarc($image, ($this->width/2), ($this->height/2), $this->width, ($this->height)/2, $z1, $z2, $color[$j], IMG_ARC_PIE);
$colorback[]=$color_h[$j];
$z1=$z2;
}

imagepng($image, "draw.png");
return $colorback;
}
}

и следующей программы, которая создает экземпляр класса и задает необходимые параметры.

$image=new diagram;
$image->width=300;
$image->height=300;
$image->thick=20;
$rows=array(20, 50, 24, 56, 78, 15);
if ($image->draw($rows)){
echo "<img src=\"draw.png\" width=\"300\" height=\"300\">";
}

Класс содержит три свойства: ширина width рисунка, высота height рисунка, толщина thick диаграммы; и один метод draw(), которому передается массив данных. В результате успешной работы метод возвращает массив цветов долей диаграммы и сохраняет рисунок с диаграммой draw.png в корне.

Вернуться к списку

Справочник Runa