1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
1

Трудности с GD

31.03.2010, 19:52. Показов 1164. Ответов 12
Метки нет (Все метки)

Приветствую тебя, дорогой форумчанин! Не знаешь как определить центр дуги в php gd? А то замучался я уже
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2010, 19:52
Ответы с готовыми решениями:

Трудности с phpQuery
Начал ковырять phpQuery. Пытаясь парсить прогноз погоды с http://pogoda.yandex.ru, столкнулся с...

Трудности с mvc
Здравствуйте! В процессе работы с MVC возникли некоторые трудности. Модель нужна для...

Трудности с оператором if, else if
Доброго всем дня! Ситуация такая, есть такой вот код: <? ... if (!$file_doc) { echo 'Файлы не...

Трудности с сессиями в Php
На локальном хостинге авторизация работает, а вот при переносе на виртуальный только наполовину....

12
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
31.03.2010, 19:57 2
Цитата Сообщение от romchiksoad Посмотреть сообщение
центр дуги
??
Ты имеешь ввиду взять длину дуги и поделить пополам?
0
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
31.03.2010, 20:03  [ТС] 3
Цитата Сообщение от Dimedrol Посмотреть сообщение
Ты имеешь ввиду взять длину дуги и поделить пополам?
ммм... Тупик, я даже ни знаю как ответить В общем задача следующая:
есть круговая диаграмма. Создается она динамически(по данным из БД). Так вот, я хочу показать часть этих данных на самой диаграмме, но строго в определенном месте, т.к. каждая дуга диаграммы соответствует определенному значению из БД...Как то так В общем стандартная диаграмма
0
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
31.03.2010, 20:10 4
Ты хочешь сделать свой движок диаграммы?
Вот пример. Попробуй разобраться.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?php
 
// $im - идентификатор изображения
// $VALUES - массив со значениями
// $LEGEND - массив с подписями
function Diagramm($im,$VALUES,$LEGEND) {
    GLOBAL $COLORS,$SHADOWS;
 
    $black=ImageColorAllocate($im,0,0,0);
 
    // Получим размеры изображения
    $W=ImageSX($im);
    $H=ImageSY($im);
 
    // Вывод легенды #####################################
 
    // Посчитаем количество пунктов, от этого зависит высота легенды
    $legend_count=count($LEGEND);
 
    // Посчитаем максимальную длину пункта, от этого зависит ширина легенды
    $max_length=0;
    foreach($LEGEND as $v) if ($max_length<strlen($v)) $max_length=strlen($v);
 
    // Номер шрифта, котором мы будем выводить легенду
    $FONT=2;
    $font_w=ImageFontWidth($FONT);
    $font_h=ImageFontHeight($FONT);
 
    // Вывод прямоугольника - границы легенды ----------------------------
 
    $l_width=($font_w*$max_length)+$font_h+10+5+10;
    $l_height=$font_h*$legend_count+10+10;
 
 
    // Получим координаты верхнего левого угла прямоугольника - границы легенды
    $l_x1=$W-10-$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+10+5+$font_h;
    $square_x=$l_x1+10;
    $y=$l_y1+10;
 
    $i=0;
    foreach($LEGEND as $v) {
        $dy=$y+($i*$font_h);
        ImageString($im, $FONT, $text_x, $dy, $v, $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-10-10;
 
    // Расчет координат центра эллипса
    $circle_x=($diametr/2)+10;
    $circle_y=$H/2-10;
 
    // Поправка диаметра, если эллипс не помещается по высоте
    if ($diametr>($H*2)-10-10) $diametr=($H*2)-20-20-40;
 
    // Вывод тени
    for ($j=20;$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);
    }
 
// Зададим значение и подписи
$VALUES=Array(100,200,300,400,500,400,300);
$LEGEND=Array("John","Bob","Alex","Mike","Andrew","Greg");
 
// Создадим изображения
header("Content-Type: image/png");
$im=ImageCreate(500,500);
 
// Зададим цвет фона. Немного желтоватый, для того, чтобы было
// видно границы изображения на белом фоне.
$bgcolor=ImageColorAllocate($im,255,255,200);
 
// Зададим цвета элементов
$COLORS[0] = imagecolorallocate($im, 255, 203, 3);
$COLORS[1] = imagecolorallocate($im, 220, 101, 29);
$COLORS[2] = imagecolorallocate($im, 189, 24, 51);
$COLORS[3] = imagecolorallocate($im, 214, 0, 127);
$COLORS[4] = imagecolorallocate($im, 98, 1, 96);
$COLORS[5] = imagecolorallocate($im, 0, 62, 136);
$COLORS[6] = imagecolorallocate($im, 0, 102, 179);
$COLORS[7] = imagecolorallocate($im, 0, 145, 195);
$COLORS[8] = imagecolorallocate($im, 0, 115, 106);
$COLORS[9] = imagecolorallocate($im, 178, 210, 52);
$COLORS[10] = imagecolorallocate($im, 137, 91, 74);
$COLORS[11] = imagecolorallocate($im, 82, 56, 47);
 
// Зададим цвета теней элементов
$SHADOWS[0] = imagecolorallocate($im, 205, 153, 0);
$SHADOWS[1] = imagecolorallocate($im, 170, 51, 0);
$SHADOWS[2] = imagecolorallocate($im, 139, 0, 1);
$SHADOWS[3] = imagecolorallocate($im, 164, 0, 77);
$SHADOWS[4] = imagecolorallocate($im, 48, 0, 46);
$SHADOWS[5] = imagecolorallocate($im, 0, 12, 86);
$SHADOWS[6] = imagecolorallocate($im, 0, 52, 129);
$SHADOWS[7] = imagecolorallocate($im, 0, 95, 145);
$SHADOWS[8] = imagecolorallocate($im, 0, 65, 56);
$SHADOWS[9] = imagecolorallocate($im, 128, 160, 2);
$SHADOWS[10] = imagecolorallocate($im, 87, 41, 24);
$SHADOWS[11] = imagecolorallocate($im, 32, 6, 0);
 
// Вызов функции рисования диаграммы
Diagramm($im,$VALUES,$LEGEND);
 
// Генерация изображения
ImagePNG($im)
?>
1
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
01.04.2010, 00:16  [ТС] 5
Тут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?php
 
// $im - идентификатор изображения
// $VALUES - массив со значениями
// $LEGEND - массив с подписями
function Diagramm($im,$VALUES,$LEGEND) {
    GLOBAL $COLORS,$SHADOWS;
 
    $black=ImageColorAllocate($im,0,0,0);
 
    // Получим размеры изображения
    $W=ImageSX($im);
    $H=ImageSY($im);
 
    // Вывод легенды #####################################
 
    // Посчитаем количество пунктов, от этого зависит высота легенды
    $legend_count=count($LEGEND);
 
    // Посчитаем максимальную длину пункта, от этого зависит ширина легенды
    $max_length=0;
    foreach($LEGEND as $v) if ($max_length<strlen($v)) $max_length=strlen($v);
 
    // Номер шрифта, котором мы будем выводить легенду
    $FONT=2;
    $font_w=ImageFontWidth($FONT);
    $font_h=ImageFontHeight($FONT);
 
    // Вывод прямоугольника - границы легенды ----------------------------
 
    $l_width=($font_w*$max_length)+$font_h+10+5+10;
    $l_height=$font_h*$legend_count+10+10;
 
 
    // Получим координаты верхнего левого угла прямоугольника - границы легенды
    $l_x1=$W-10-$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+10+5+$font_h;
    $square_x=$l_x1+10;
    $y=$l_y1+10;
 
    $i=0;
    foreach($LEGEND as $v) {
        $dy=$y+($i*$font_h);
        ImageString($im, $FONT, $text_x, $dy, $v, $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-10-10;
 
    // Расчет координат центра эллипса
    $circle_x=($diametr/2)+10;
    $circle_y=$H/2-10;
 
    // Поправка диаметра, если эллипс не помещается по высоте
    if ($diametr>($H*2)-10-10) $diametr=($H*2)-20-20-40;
 
    // Вывод тени
    for ($j=20;$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);
    }
 
// Зададим значение и подписи
$VALUES=Array(100,200,300,400,500,400,300);
$LEGEND=Array("John","Bob","Alex","Mike","Andrew","Greg");
 
// Создадим изображения
header("Content-Type: image/png");
$im=ImageCreate(500,500);
 
// Зададим цвет фона. Немного желтоватый, для того, чтобы было
// видно границы изображения на белом фоне.
$bgcolor=ImageColorAllocate($im,255,255,200);
 
// Зададим цвета элементов
$COLORS[0] = imagecolorallocate($im, 255, 203, 3);
$COLORS[1] = imagecolorallocate($im, 220, 101, 29);
$COLORS[2] = imagecolorallocate($im, 189, 24, 51);
$COLORS[3] = imagecolorallocate($im, 214, 0, 127);
$COLORS[4] = imagecolorallocate($im, 98, 1, 96);
$COLORS[5] = imagecolorallocate($im, 0, 62, 136);
$COLORS[6] = imagecolorallocate($im, 0, 102, 179);
$COLORS[7] = imagecolorallocate($im, 0, 145, 195);
$COLORS[8] = imagecolorallocate($im, 0, 115, 106);
$COLORS[9] = imagecolorallocate($im, 178, 210, 52);
$COLORS[10] = imagecolorallocate($im, 137, 91, 74);
$COLORS[11] = imagecolorallocate($im, 82, 56, 47);
 
// Зададим цвета теней элементов
$SHADOWS[0] = imagecolorallocate($im, 205, 153, 0);
$SHADOWS[1] = imagecolorallocate($im, 170, 51, 0);
$SHADOWS[2] = imagecolorallocate($im, 139, 0, 1);
$SHADOWS[3] = imagecolorallocate($im, 164, 0, 77);
$SHADOWS[4] = imagecolorallocate($im, 48, 0, 46);
$SHADOWS[5] = imagecolorallocate($im, 0, 12, 86);
$SHADOWS[6] = imagecolorallocate($im, 0, 52, 129);
$SHADOWS[7] = imagecolorallocate($im, 0, 95, 145);
$SHADOWS[8] = imagecolorallocate($im, 0, 65, 56);
$SHADOWS[9] = imagecolorallocate($im, 128, 160, 2);
$SHADOWS[10] = imagecolorallocate($im, 87, 41, 24);
$SHADOWS[11] = imagecolorallocate($im, 32, 6, 0);
 
// Вызов функции рисования диаграммы
Diagramm($im,$VALUES,$LEGEND);
 
// Генерация изображения
ImagePNG($im)
?>
нет того, что мне нужно. Если объяснить на этом примере, то мне нужно значение из массива $VALUES, вывести на диаграмму, точнее на её доли. Каждое значение из этого массива соответствует определенной дуге и цвету...

Добавлено через 2 часа 38 минут

Не по теме:

Всё кул, граждане-форумчане! Идем на Оскар...Ответов всего четыре, зато просмотров 39:)

0
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
01.04.2010, 00:19 6
А почему бы не использовать уже готовые классы для рисования? на phpclasses.org куча таких классов.
1
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
01.04.2010, 18:16  [ТС] 7
Цитата Сообщение от Dimedrol Посмотреть сообщение
А почему бы не использовать уже готовые классы для рисования? на phpclasses.org куча таких классов
Ничего не мешает, просто я упертый...

Добавлено через 1 минуту

Не по теме:

До чего конченные бывают люди...перерыл сайтов 50-60 и начитал всего лишь 4 разных статьи!!! Капец...копипастеры херовы!



Добавлено через 17 часов 33 минуты
Блин, ребят, ну каааак?
Я знаю центр эллипса, радиус и градус. Как мне определить середину радиуса под определенным градусом(каждый думает в меру своей распущенности)? Блин, нервов не хватает
Дайте учебник по геометрии...хотя б
0
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
01.04.2010, 18:19 8
У меня вообще по матеше завал Так что помочь с этой темой не могу. Надо точно с геометрии начать.
0
romchiksoad
01.04.2010, 18:22  [ТС]
  #9

Не по теме:

Цитата Сообщение от Dimedrol Посмотреть сообщение
У меня вообще по матеше завал
фууух...Я думал, что один такой, аж стыдно стало, когда написал:)

0
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
01.04.2010, 19:03 10
По идеи там в градусах надо. Давай вместе будем геометрию вспоминать . Весь круг - 360 градусов. Нам этот круг надо разделить на сумму данных - чему ровна одна часть. Теперь умножаем каждую данную на эту часть. Может так?
0
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
01.04.2010, 20:41  [ТС] 11
это я сделаля немного понял и теперь могу конкретизировать задачу...
Мне нужно вывести символ(число) в точке, которая в зависимости от угла меняется...например:с углом в 45 градусов значение точки на графике будет равно А, при 60 градусах Б...и так далее...

Добавлено через 1 час 24 минуты
УУУУУУУУРААААААААААААА ТОВАРИСЧИ!!!!УРА!!!! Всё кул:) Я разобрался!!!
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
...
//$percent[$arc] - это градусы полученные из
//@$percent[]=массив_с_данными/сумма_массива_с_данными*360;
//$do_angle - переменная содержащая начальный угол(от которого начинаем выводить дугу)
//$last_angle - конечный угол(угол в котором заканчиваем вывод дуги)
//RADIUS - радиус по оси x, RADIUS/2 - радиус по оси y
for($arc=0;$arc<count($percent);$arc++){
$pointer = $do_angle + $percent[$arc];
$last_angle = ($do_angle + $pointer)/2;
$do_angle = $pointer;
$end_x = round((RADIUS+5)+(RADIUS * cos($last_angle*pi()/180)));
$end_y = round((int)(HEIGHT/2)+((RADIUS/2) * sin($last_angle*pi()/180)));
$mid_x = round(((RADIUS+5)+($end_x))/2);
$mid_y = round(((int)(HEIGHT/2)+($end_y))/2);
$max_size_y=(HEIGHT/2)+(RADIUS/2);
$min_size_y=(HEIGHT/2)-(RADIUS/2);
$max_size_x=(RADIUS+5)+(RADIUS);
$min_size_x=(RADIUS+5)-(RADIUS);
switch($mid_y):
case $mid_y>=$max_size_y:
     $middle_y=$max_size_y/2;
     break;
case $mid_y<=$min_size_y:
     $middle_y=$min_size_y/2;
     break;
default: $middle_y=$mid_y;
endswitch;
switch($mid_x):
case $mid_x>=$max_size_x:
     $middle_x=$max_size_x/2;
     break;
case $mid_x<=$min_size_x:
     $middle_x=$min_size_x/2;
     break;
default: $middle_x=$mid_x;
endswitch;
}
...
//P.S. если Вам это нужно, то просто скопировать и вставить в свой код не получиться, т.к.
//заточен под мой код,а комментатор из меня плохой...поэтому спрашивайте...:)
0
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
01.04.2010, 20:44 12
romchiksoad, уау, мне тоже поучиться надо.
0
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
01.04.2010, 20:46  [ТС] 13
Цитата Сообщение от Dimedrol Посмотреть сообщение
уау, мне тоже поучиться надо

Не по теме:

Я такой довольный...Фуух:)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2010, 20:46
Помогаю со студенческими работами здесь

Трудности с выводом данных из таблицы
Добрый день,требуется помощь в объяснении следующего вывода: p.s.скриншот таблицы прилагаю 0...

Трудности с отправкой писем с сайта
Трудности с отправкой писем на кириллице. На латинице проблем нет. Вот код: &lt;section...

С чего стоит начать [Трудности с основами]
Добрый день, возникла следующая проблема: Уже некоторое время (пол года) работаю в PHP проекте,...

Я только сегодня начал изучать php и сразу же наткнулся на трудности
вот код на HTML &lt;html&gt; &lt;head&gt; &lt;title&gt;Как ваше имя?&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;h1&gt;Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru