|
|
|
| Я не рано...
<?php
// $im - идентификатор изображения
// $VALUES - массив со значениями
// $LEGEND - массив с подписями
function win2uni($s) //перекодировка
{
$s = convert_cyr_string($s,'w','i');
for ($result='', $i=0; $i<strlen($s); $i++) {
$charcode = ord($s[$i]);
$result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
}
return $result;
}
function Diagramm($im,$VALUES2,$LEGEND2) {
GLOBAL $COLORS,$SHADOWS,$qw1,$pr;
$black=ImageColorAllocate($im,0,0,0);
// Получим размеры изображения
$W=ImageSX($im);
$H=ImageSY($im);
//минимум процентов, если более 15 данных процент выводится автоматом
$percent=2;
$percent1=round((100*$qw1)/array_sum($VALUES2),0);
$percent=($percent1>$percent) ? $percent1 : $percent;
$qw=0;
$totall=array_sum($VALUES2);
$all=count($VALUES2);
for ($i=0;$i<$all;$i++)
{
if (floor((100*$VALUES2[$i])/$totall)<$percent)
{
$qw=+$qw1+$VALUES2[$i];
unset($VALUES2[$i]);
unset($LEGEND2[$i]);
}
}
//отсутствие товаров менее $percent проценов
if($qw<>0):
$VALUES2[]=$qw; //меньше $percent процентов - заккоментировать обе строки, если не надо выводить
$LEGEND2[]="меньше $percent%";
endif;
foreach($VALUES2 as $value) $VALUES[]=$value;
foreach($LEGEND2 as $value) $LEGEND[]=$value;
// Вывод легенды #####################################
// Посчитаем количество пунктов, от этого зависит высота легенды
$legend_count=count($LEGEND);
// Посчитаем максимальную длину пункта, от этого зависит ширина легенды
$max_length=0;
foreach($LEGEND as $v) if ($max_length<strlen($v)) $max_length=strlen($v);
// Номер шрифта, котором мы будем выводить легенду
$FONT=8;
$font_w=ImageFontWidth($FONT);
$font_h=ImageFontHeight($FONT);
// Вывод прямоугольника - границы легенды ----------------------------
$l_width=($font_w*$max_length)+$font_h+$FONT*13;
$l_height=$font_h*$legend_count+$FONT*1.5;
// Получим координаты верхнего левого угла прямоугольника - границы легенды
$l_x1=$W-$FONT-$l_width;
$l_y1=($H-$l_height)/2;
// Вывод прямоугольника - границы легенды
ImageRectangle($im, $l_x1, $l_y1, $l_x1+$l_width, $l_y1+$l_height, $black);
// Вывод текст легенды и цветных квадратиков
$text_x=$l_x1+$FONT*2+$font_h;
$square_x=$l_x1+$FONT;
$y=$l_y1+$FONT;
$i=0;
$mf = imageloadfont('myfont.phpfont');
foreach($LEGEND as $v) {
$dy=$y+($i*$font_h);
$v1[] = round(((100*$VALUES[$i])/$pr),2);
(strlen($VALUES[$i])==1)? $space=" " : $space=" ";
($v<=$max_length)? $space1=" " : $space1=" ";
$vs = win2uni($VALUES[$i]);
$vs1 = win2uni("шт - $v $v1[$i]%");
// imagettftext($im, $FONT, 0, $text_x, $dy+$FONT, $black, 'arial.ttf', "$vs$space$vs1"); // или этот шрифт
ImageString($im, $mf, $text_x, $dy, $VALUES[$i]."".$space."шт.-".$v."- ".$v1[$i]."%", $black);
ImageFilledRectangle($im,
$square_x+1,$dy+1,$square_x+$font_h-1,$dy+$font_h-1,
$COLORS[$i]);
ImageRectangle($im,
$square_x+1,$dy+1,$square_x+$font_h-1,$dy+$font_h-1,
$black);
$i++;
}
// Вывод круговой диаграммы #####################################
$total=array_sum($VALUES);
$anglesum=$angle=Array(0);
$i=1;
// Расчет углов
while ($i<count($VALUES))
{
$part=$VALUES[$i-1]/$total;
$angle[$i]=floor($part*360);
$anglesum[$i]=array_sum($angle);
$i++;
}
$anglesum[]=$anglesum[0];
// Расчет диаметра
$diametr=$l_x1-20;
// Расчет координат центра эллипса
$circle_x=($diametr/2)+10;
$circle_y=$H/2-10;
// Поправка диаметра, если эллипс не помещается по высоте
if ($diametr>($H*2)-20) $diametr=($H*2)-80;
// Вывод тени
for ($j;$j>0;$j--)
for ($i=0;$i<count($anglesum)-1;$i++)
ImageFilledArc($im,$circle_x,$circle_y+$j, $diametr,$diametr/2,$anglesum[$i],$anglesum[$i+1],$SHADOWS[$i],IMG_ARC_PIE);
// Вывод круговой диаграммы
for ($i=0;$i<count($anglesum)-1;$i++)
ImageFilledArc($im,$circle_x,$circle_y, $diametr,$diametr/2, $anglesum[$i],$anglesum[$i+1], $COLORS[$i],IMG_ARC_PIE);
}
// Зададим значение и подписи из файла
//3 вишня,26 груши,12 апельсины,3 персики,8 сливы,5 бананы,2 киви,34 яблоки,8 разное
($file = fopen ("data.dat","r")) or die("Ошибка открытия файла!");
while ($data = fgets ($file, 4096))
{
list ($kol, $name) = split(" ", $data);
$VALUES1[]=$kol;
$LEGEND1[]=$name;
}
fclose ($file);
arsort($VALUES1);
foreach($VALUES1 as $index => $val)
$LEGEND[$index]=$LEGEND1[$index];
foreach($VALUES1 as $value) $VALUES2[]=$value;
foreach($LEGEND as $value) $LEGEND2[]=$value;
$qw1=0;
$pr = array_sum($VALUES2);
if (count($VALUES2)>15)
{
for ($i=count($VALUES2);$i>14;$i--)
{
$qw1=+$VALUES2[$i];
unset($LEGEND2[$i]);
unset($VALUES2[$i]);
}
}
// Создаем изображения
$im=ImageCreate(500,300);
// Зададим цвет фона
$bgcolor=ImageColorAllocate($im,255,255,200);
for ($i=0;$i<=count($LEGEND1);$i++)
{
$r=rand(0,255);
$g=rand(0,255);
$b=rand(0,255);
// Зададим цвета элементов
$COLORS[$i] = imagecolorallocate($im, $r, $g, $b);
($r<)? $r=0: $r-;
($g<)? $g=0: $g-;
($b<)? $b=0: $b-;
// Зададим цвета теней элементов
$SHADOWS[$i] = imagecolorallocate($im, $r, $g, $b);
}
// Вызов функции рисования диаграммы
Diagramm($im,$VALUES2,$LEGEND2);
// Генерация изображения
ImagePNG($im)
?>
|
код не мой, но переработанный... В первый ответ и не смотрел. Хотелось себя проверить. | |
|
|
|
|
|
|
|
для: Андрюха.
(18.04.2006 в 12:21)
| | Вероятно имеется ввиду задача N 16. Хм... у меня скрипт выдаёт ошибку
Parse error: syntax error, unexpected ')' in d:\main\test2\index.php on line 178
|
| |
|
|
|
|
|
|
|
для: cheops
(19.04.2006 в 16:03)
| | Ну конечно 16.
Имеется в виду этот блок?
<?php
for ($i=0;$i<=count($LEGEND1);$i++)
{
$r=rand(0,255);
$g=rand(0,255);
$b=rand(0,255);
// Зададим цвета элементов
$COLORS[$i] = imagecolorallocate($im, $r, $g, $b);
($r<=10)? $r=0: $r-=10;
($g<=10)? $g=0: $g-=10;
($b<=10)? $b=0: $b-=10;
// Зададим цвета теней элементов
$SHADOWS[$i] = imagecolorallocate($im, $r, $g, $b);
}
?>
|
| |
|
|
|
|