Advertisement
Guest User

Volume_diagram

a guest
Apr 10th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.76 KB | None | 0 0
  1. <?php
  2.  
  3. // $im - идентификатор изображения
  4. // $VALUES - массив со значениями
  5. // $LEGEND - массив с подписями
  6.     function Diagramm($im,$VALUES,$LEGEND) {
  7.         GLOBAL $COLORS,$SHADOWS;
  8.  
  9.         $black = ImageColorAllocate($im,0,0,0);
  10.  
  11.         // Получим размеры изображения
  12.         $W = ImageSX($im);                
  13.         $H = ImageSY($im);
  14.  
  15.         // Вывод легенды #####################################
  16.  
  17.         // Посчитаем количество пунктов, от этого зависит высота легенды
  18.         $legend_count=count($LEGEND);
  19.  
  20.         // Посчитаем максимальную длину пункта, от этого зависит ширина легенды
  21.         $max_length=0;
  22.         foreach($LEGEND as $v) if ($max_length<strlen($v)) $max_length=strlen($v);
  23.  
  24.         // Номер шрифта, котором мы будем выводить легенду
  25.         $FONT=2;
  26.         $font_w=ImageFontWidth($FONT);
  27.         $font_h=ImageFontHeight($FONT);
  28.  
  29.         // Вывод прямоугольника - границы легенды ----------------------------
  30.  
  31.         $l_width=($font_w*$max_length)+$font_h+10+5+10;
  32.         $l_height=$font_h*$legend_count+10+10;
  33.  
  34.        
  35.         // Получим координаты верхнего левого угла прямоугольника - границы легенды
  36.         $l_x1=$W-10-$l_width;
  37.         $l_y1=($H-$l_height)/2;
  38.  
  39.         // Выводя прямоугольника - границы легенды
  40.         ImageRectangle($im, $l_x1, $l_y1, $l_x1+$l_width, $l_y1+$l_height, $black);
  41.  
  42.         // Вывод текст легенды и цветных квадратиков
  43.         $text_x=$l_x1+10+5+$font_h;
  44.         $square_x=$l_x1+10;
  45.         $y=$l_y1+10;
  46.  
  47.         $i=0;
  48.         foreach($LEGEND as $v) {
  49.             $dy=$y+($i*$font_h);
  50.             ImageString($im, $FONT, $text_x, $dy, $v, $black);
  51.             ImageFilledRectangle($im,
  52.                                  $square_x+1,$dy+1,$square_x+$font_h-1,$dy+$font_h-1,
  53.                                  $COLORS[$i]);
  54.             ImageRectangle($im,
  55.                            $square_x+1,$dy+1,$square_x+$font_h-1,$dy+$font_h-1,
  56.                            $black);
  57.             $i++;
  58.             }
  59.  
  60.         // Вывод круговой диаграммы ----------------------------------------
  61.  
  62.         $total=array_sum($VALUES);
  63.         $anglesum=$angle=Array(0);
  64.         $i=1;
  65.  
  66.         // Расчет углов
  67.         while ($i<count($VALUES)) {
  68.             $part=$VALUES[$i-1]/$total;
  69.             $angle[$i]=floor($part*360);
  70.             $anglesum[$i]=array_sum($angle);
  71.             $i++;
  72.             }
  73.         $anglesum[]=$anglesum[0];
  74.  
  75.         // Расчет диаметра
  76.         $diametr=$l_x1-10-10;
  77.  
  78.         // Расчет координат центра эллипса
  79.         $circle_x=($diametr/2)+10;
  80.         $circle_y=$H/2-10;
  81.  
  82.         // Поправка диаметра, если эллипс не помещается по высоте
  83.         if ($diametr>($H*2)-10-10) $diametr=($H*2)-20-20-40;
  84.  
  85.         // Вывод тени
  86.         for ($j=20;$j>0;$j--)
  87.             for ($i=0;$i<count($anglesum)-1;$i++)
  88.                 ImageFilledArc($im,$circle_x,$circle_y+$j,
  89.                                    $diametr,$diametr/2,
  90.                                    $anglesum[$i],$anglesum[$i+1],
  91.                                    $SHADOWS[$i],IMG_ARC_PIE);
  92.  
  93.         // Вывод круговой диаграммы
  94.         for ($i=0;$i<count($anglesum)-1;$i++)
  95.             ImageFilledArc($im,$circle_x,$circle_y,
  96.                                $diametr,$diametr/2,
  97.                                $anglesum[$i],$anglesum[$i+1],
  98.                                $COLORS[$i],IMG_ARC_PIE);
  99.     }
  100.  
  101.  
  102.  
  103.  
  104.  
  105.     $host = 'localhost';
  106.     $db   = 'fembd';
  107.     $user = 'root';
  108.     $password = 'root';
  109.     try {
  110.         $pdo = new PDO("mysql:host=$host; dbname=$db;", $user, $password);
  111.         $pdo->exec("set names utf8");
  112.         $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  113.     } catch (PDOException $e) {
  114.         print "Не удалось подключиться к базе данных! ".$e->getMessage();
  115.         exit();
  116.     }
  117.  
  118.     $sql = "SELECT elements.id, nodes.x, nodes.y
  119.             FROM elements, nodes
  120.             WHERE nodes.id = elements.n1
  121.             OR nodes.id = elements.n2
  122.             OR nodes.id = elements.n3";
  123.  
  124.     try {
  125.         $result = $pdo->prepare($sql);
  126.     } catch (PDOException $e) {
  127.         print("Не удаётся соединиться с базой данных".$e->getMessage());
  128.         exit();
  129.     }
  130.  
  131.     try {
  132.             $result->execute();
  133.         }
  134.     catch (PDOException $e) {
  135.         if ($e->getCode() == 42000) {
  136.             print("Не достаточно прав доступа для выполнения запроса:(".$e->getMessage());
  137.         }
  138.  
  139.         else {
  140.             print("Не удалось выполнить обращение к базе данных:  ".$e->getMessage());
  141.         }
  142.  
  143.         exit();
  144.     }
  145.  
  146.     $rownum = $result->rowcount();
  147.     if($rownum == 0){
  148.         print "Вернулся пустой результат!";
  149.         exit();
  150.     }
  151.  
  152.     $elem_num = $rownum / 3;
  153.     for ($i = 0; $i < $elem_num; ++$i){
  154.         $node1 = $result->fetch();
  155.         $node2 = $result->fetch();
  156.         $node3 = $result->fetch();
  157.         $centerx[$i] = ($node1[1]+$node2[1]+$node3[1]) / 3;
  158.         $centery[$i] = ($node1[2]+$node2[2]+$node3[2]) / 3;
  159.     }
  160.  
  161.     $quadrant = array(0, 0, 0, 0, 0);
  162.  
  163.     for ($i = 0; $i < $elem_num; ++$i) {
  164.         $x = $centerx[$i];
  165.         $y = $centery[$i];
  166.         if ($x > 0 && $y > 0) {
  167.             ++$quadrant[1];
  168.         }
  169.         else if ($x < 0 && $y > 0) {
  170.             ++$quadrant[2];
  171.         }
  172.         else if ($x < 0 && $y < 0) {
  173.             ++$quadrant[3];
  174.         }
  175.         else if ($x > 0 && $y < 0) {
  176.             ++$quadrant[4];
  177.         }
  178.         else {
  179.             ++$quadrant[0];
  180.         }
  181.     }
  182.  
  183.     // Зададим значение и подписи
  184.     $VALUES = array($quadrant[0], $quadrant[1], $quadrant[2], $quadrant[3], $quadrant[4]);
  185.     $LEGEND = array("ON BORDER","I","II","III","IV");
  186.  
  187.     // Создадим изображения
  188.     header("Content-Type: image/png");
  189.     $im=ImageCreate(500, 500);
  190.  
  191.     // Зададим цвет фона. Немного желтоватый, для того, чтобы было
  192.     // видно границы изображения на белом фоне.
  193.     $bgcolor=ImageColorAllocate($im, 255, 255, 200);
  194.  
  195.     // Зададим цвета элементов
  196.     $COLORS[0] = imagecolorallocate($im, 255, 203, 3);
  197.     $COLORS[1] = imagecolorallocate($im, 220, 101, 29);
  198.     $COLORS[2] = imagecolorallocate($im, 189, 24, 51);
  199.     $COLORS[3] = imagecolorallocate($im, 214, 0, 127);
  200.     $COLORS[4] = imagecolorallocate($im, 98, 1, 96);
  201.     $COLORS[5] = imagecolorallocate($im, 0, 62, 136);
  202.     $COLORS[6] = imagecolorallocate($im, 0, 102, 179);
  203.     $COLORS[7] = imagecolorallocate($im, 0, 145, 195);
  204.     $COLORS[8] = imagecolorallocate($im, 0, 115, 106);
  205.     $COLORS[9] = imagecolorallocate($im, 178, 210, 52);
  206.     $COLORS[10] = imagecolorallocate($im, 137, 91, 74);
  207.     $COLORS[11] = imagecolorallocate($im, 82, 56, 47);
  208.  
  209.     // Зададим цвета теней элементов
  210.     $SHADOWS[0] = imagecolorallocate($im, 205, 153, 0);
  211.     $SHADOWS[1] = imagecolorallocate($im, 170, 51, 0);
  212.     $SHADOWS[2] = imagecolorallocate($im, 139, 0, 1);
  213.     $SHADOWS[3] = imagecolorallocate($im, 164, 0, 77);
  214.     $SHADOWS[4] = imagecolorallocate($im, 48, 0, 46);
  215.     $SHADOWS[5] = imagecolorallocate($im, 0, 12, 86);
  216.     $SHADOWS[6] = imagecolorallocate($im, 0, 52, 129);
  217.     $SHADOWS[7] = imagecolorallocate($im, 0, 95, 145);
  218.     $SHADOWS[8] = imagecolorallocate($im, 0, 65, 56);
  219.     $SHADOWS[9] = imagecolorallocate($im, 128, 160, 2);
  220.     $SHADOWS[10] = imagecolorallocate($im, 87, 41, 24);
  221.     $SHADOWS[11] = imagecolorallocate($im, 32, 6, 0);
  222.  
  223.     // Вызов функции рисования диаграммы
  224.     Diagramm($im,$VALUES,$LEGEND);
  225.  
  226.     // Генерация изображения
  227.     ImagePNG($im)
  228.  
  229. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement