За последние 24 часа нас посетили 18130 программистов и 1661 робот. Сейчас ищут 1752 программиста ...

Генератор диаграмм (графиков) [готовое решение]

Тема в разделе "Решения, алгоритмы", создана пользователем [vs], 28 май 2011.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Имеет следующие функции:
    - любое количество кривых
    - вывод в ресурс GD или png
    - координирование вершин ломаных по сетке, а не по пикселям
    - масштабирование графика под нужные размеры картинки в процессе генерации
    - объектный интерфейс на человеческом языке
    Вообщем писал просто под визуализацию статистики, но по-моему получилось очень даже ничего. Полученную картинку надо взять и наложить на свою картинку с легендой.
    Код (PHP):
    1. <?php
    2. /**
    3. * Прекрасный генератор графиков
    4. * Использует GD.
    5. *
    6. * @author Vasiliy B. Shpilchin (http://www.vasya.pro)
    7. * @copyright [vs] 2011
    8. */
    9. class vsDiagram {
    10.     // Размеры изображения
    11.     private $x;
    12.     private $y;
    13.     // ресурс
    14.     private $pic;
    15.     // параметры горизонтальных линий
    16.     private $xRange = array(
    17.         'num' => null,
    18.         'color' => null
    19.     );
    20.     // параметры вертикальных линий
    21.     private $yRange = array(
    22.         'num' => null,
    23.         'color' => null
    24.     );
    25.     // На эти переменные делятся пиксельные координаты.
    26.     // Вершины то мы будем по сетке указыват, а не в пикселях
    27.     private $xDiv;
    28.     private $yDiv;
    29.     // Ломаные. Каждый элемент массива - массив с цветом ломанной и массивом
    30.     // координат вершин.
    31.     private $polygons = array();
    32.  
    33.     // Размеры и фоновый цвет
    34.     public function __construct($x = 640, $y = 480, $r = 0, $g = 0, $b = 0) {
    35.         $this->x = intval($x);
    36.         $this->y = intval($y);
    37.         $this->pic = imagecreate($this->x, $this->y);
    38.         imagecolorallocate($this->pic, $r, $g, $b);
    39.     }
    40.  
    41.     // Горзонтальные линиии (шкала X)
    42.     public function xRange($num = 10, $div = 1, $r = 128, $g = 128, $b = 128) {
    43.         $this->xRange['num'] = $num;
    44.         $this->xRange['color'] = imagecolorallocate($this->pic, $r, $g, $b);
    45.         $this->xDiv = $div;
    46.         return $this;
    47.     }
    48.  
    49.     // Вертикальные линиии (шкала Y)
    50.     public function yRange($num = 10, $div = 1, $r = 128, $g = 128, $b = 128) {
    51.         $this->yRange['num'] = $num;
    52.         $this->yRange['color'] = imagecolorallocate($this->pic, $r, $g, $b);
    53.         $this->yDiv = $div;
    54.         return $this;
    55.     }
    56.  
    57.     public function addPoly($name = 'line', $r = 255, $g = 255, $b = 255) {
    58.         $this->polygons[$name] = array(
    59.             'color' => imagecolorallocate($this->pic, $r, $g, $b),
    60.             'vertices' => array()
    61.         );
    62.         return $this;
    63.     }
    64.  
    65.     public function addVertex($poly = 'line', $x = 0, $y = 0) {
    66.         $xC = $x * (($this->x / $this->xRange['num']) / $this->xDiv);
    67.         $yC = ($this->y - 1) - $y * (($this->y / $this->yRange['num']) / $this->yDiv);
    68.         array_push($this->polygons[$poly]['vertices'], array('x'=>$xC, 'y'=>$yC));
    69.         return $this;
    70.     }
    71.  
    72.     // Рисует график и возвращает картинку, ресуср gd
    73.     public function draw() {
    74.         // Сетка: X
    75.         $x_step = ($this->x / $this->xRange['num']);
    76.         $x_steps = ($this->x / $x_step);
    77.         for ($i = 1; $i < $x_steps; $i++) {
    78.             imageline($this->pic, $x_step * $i - 1, 0, $x_step * $i - 1,
    79.                     $this->y - 1, $this->xRange['color']);
    80.         }
    81.         // Сетка: Y
    82.         $y_step = ($this->y / $this->yRange['num']);
    83.         $y_steps = ($this->y / $y_step);
    84.         for ($i = 1; $i < $y_steps; $i++) {
    85.             imageline($this->pic, 0, $y_step * $i - 1, $this->x - 1,
    86.                     $y_step * $i - 1, $this->yRange['color']);
    87.         }
    88.         // Ломаные
    89.         foreach ($this->polygons as $poly) {
    90.             foreach ($poly['vertices'] as $n=>$vertix) {
    91.                 if (isset($poly['vertices'][$n-1])) {
    92.                     $x1 = $poly['vertices'][$n-1]['x'];
    93.                     $y1 = $poly['vertices'][$n-1]['y'];
    94.                 }
    95.                 else {
    96.                     $x1 = $vertix['x'];
    97.                     $y1 = $vertix['y'];
    98.                 }
    99.                 $x2 = $vertix['x'];
    100.                 $y2 = $vertix['y'];
    101.                 imageline($this->pic, $x1, $y1, $x2, $y2, $poly['color']);
    102.             }
    103.         }
    104.         return $this->pic;
    105.     }
    106.  
    107.     // удобно же :)
    108.     public function __toString() {
    109.         imagepng($this->draw());
    110.     }
    111. }
    как юзать:
    Код (PHP):
    1. <?
    2. // Нарисовать график синуса и косинуса, и прямую 0
    3. $diagram = new vsDiagram(); // будет 640x480 с черным фоном
    4. $diagram->xRange()->yRange(4)
    5.         ->addPoly() // имя - line, цвет - белый
    6.         ->addPoly('red', 255, 0, 0)
    7.         ->addPoly('blue', 0, 0, 255)
    8.         ->addVertex('line', 0, 2) // проведем линию из начала
    9.         ->addVertex('line', 10, 2); // в конец
    10. for ($x = 0; $x < 10; $x+=0.01) {
    11.     $y = sin($x) + 2;
    12.     $diagram->addVertex('blue', $x, $y);
    13. }
    14. for ($x = 0; $x < 10; $x+=0.01) {
    15.     $y = cos($x) + 2;
    16.     $diagram->addVertex('red', $x, $y);
    17. }
    18. header('Content-Type: image/png');
    19. echo $diagram;
    результат:

    [​IMG]

    Или просто рисовать линии по сетке
    Код (PHP):
    1. <?
    2. $diagram = new vsDiagram(400, 400);
    3. $diagram->xRange(2)->yRange(2)
    4.         ->addPoly('blue', 0, 0, 255);
    5. for ($x = 0; $x <= 50; $x++) {
    6.     $y = sin($x*450) + 1;
    7.     $x1 = cos($x*450) + 1;
    8.     $diagram->addVertex('blue', $x1, $y);
    9. }
    [​IMG]
     
    #1 [vs], 28 май 2011
    Последнее редактирование модератором: 11 дек 2016
    mahmuzar нравится это.
  2. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    норм. но не пригодится.
    ибо
    1) проще самому написать прямо нативно.
    2) сейчас популярен flash
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    флеш нельзя сохранить или это неудобно делать. А чем вообще генерировать графики в флеш?
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    есть решения =)
    флеш сам генерирует...
     
  5. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    [vs]
    http://jpgraph.net/index.php не?

    или это из серии "захотелось сделать"? :) типа как мне каптчу.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Апельсин
    Спасибо, не знал. Но слишком он тяжелый