1 | <? // Skript pro generování grafu stromové struktury sítì do PNG obrázku
|
---|
2 | include('../db.php');
|
---|
3 | DB_Init('localhost','root','','is');
|
---|
4 |
|
---|
5 | // === Zpìtné vyváení stromu do hloubky =======================================
|
---|
6 | function balance($id, $level, $vlast,$vleft,$vfirst,$vnext,$tbound) {
|
---|
7 | if (($vlast[$id]>0)&&($vleft[$id]>$vleft[$vlast[$id]])) {
|
---|
8 | $diff=$vleft[$id]-$vleft[$vlast[$id]];
|
---|
9 | $i=$vfirst[$id];
|
---|
10 | if ($vleft[$i]+$diff>$tbound[$level+1]) $tbound[$level+1]=$vleft[$i]+$diff+2;
|
---|
11 | while ($i>0) {
|
---|
12 | $vleft[$i]+=$diff;
|
---|
13 | balance($i,$level+1, &$vlast,&$vleft,&$vfirst,&$vnext,&$tbound);
|
---|
14 | $i=$vnext[$i];
|
---|
15 | }
|
---|
16 | }
|
---|
17 | }
|
---|
18 |
|
---|
19 | // === Generování rovinné stromové struktury ===================================
|
---|
20 | function gentree($mode) { // depth-first algorithm
|
---|
21 | // --- Inicializace ----------------------------------------------------------
|
---|
22 | $tbound=array(); // Hranice pozic jednotlivých úrovní
|
---|
23 | $position=array(); // Pozice aktuálního prvku na dané úrovni
|
---|
24 | $vfirst=array(); // První potomek prvku
|
---|
25 | $vlast=array(); // Poslední potomek prvku
|
---|
26 | $vprev=array(); // Pedchozí sourozenec
|
---|
27 | $vnext=array(); // Následující sourozenec
|
---|
28 | $vleft=array(); // Pozice prvku zleva
|
---|
29 | $vtop=array(); // Pozice prvku shora
|
---|
30 |
|
---|
31 | $index = 0; // Index aktuálního prvku
|
---|
32 | $level = 0; // Aktuální úroveò hloubky ve stromu
|
---|
33 | $width = 0; // íøka stromu
|
---|
34 | $height = 0; // Hloubka stromu
|
---|
35 |
|
---|
36 | $curr = 0; // Aktuální prvek
|
---|
37 | $index=0; // Index aktuálního prvku
|
---|
38 | $parent[$level]=0; // Rodiè dané úrovnì
|
---|
39 | $position[$level]=0; // Aktuální pozice prvku na dané úrovni
|
---|
40 | $count[$level]=0; // Poèet prvkù na dané úrovni
|
---|
41 |
|
---|
42 | // --- Hlavní cyklus ---------------------------------------------------------
|
---|
43 | do {
|
---|
44 | // --- Proveï databázový dotaz -----------------------------------------------
|
---|
45 | $query = 'SELECT * FROM hosts WHERE ';
|
---|
46 | if ($level==0) { $query .= 'name = "INTERNET" ORDER BY id'; } else {
|
---|
47 | $query .= ' parent = '.$parent[$level].' ORDER BY id';
|
---|
48 | }
|
---|
49 | if ($mode) $query.=' DESC';
|
---|
50 | $query .= ' LIMIT '.$position[$level].',1';
|
---|
51 | DB_Query($query);
|
---|
52 | $item = DB_Row();
|
---|
53 | if ($item) {
|
---|
54 | // --- Zpracování poloky z DB -----------------------------------------------
|
---|
55 | if ($position[$level]>0) {
|
---|
56 | $vprev[$item['id']]=$curr;
|
---|
57 | $vnext[$curr]=$item['id'];
|
---|
58 | }
|
---|
59 | $curr = $item['id'];
|
---|
60 | if ($position[$level]==0) {
|
---|
61 | $vfirst[$parent[$level]]=$curr;
|
---|
62 | if (($level>0)&&($vleft[$parent[$level]]<$tbound[$level])) {
|
---|
63 | $vleft[$parent[$level]]=$tbound[$level];
|
---|
64 | $tbound[$level-1]=$tbound[$level]+2;
|
---|
65 | }
|
---|
66 | }
|
---|
67 | $position[$level]++;
|
---|
68 | $vlast[$parent[$level]]=$item['id'];
|
---|
69 | $vparent[$curr] = $parent[$level];
|
---|
70 | $count[$level]++;
|
---|
71 | $vtop[$item['id']] = $level;
|
---|
72 | $vleft[$item['id']] = $tbound[$level];
|
---|
73 | $tbound[$level]+=2;
|
---|
74 | if ($tbound[$level]>$maxleft) $maxleft=$tbound[$level];
|
---|
75 | // --- Zjisti existenci potomkù ----------------------------------------------
|
---|
76 | DB_Query("SELECT COUNT(*) FROM hosts WHERE parent = ".$curr);
|
---|
77 | $childcnt = DB_Row();
|
---|
78 | if ($childcnt[0]>0) { // Nelistov uzel
|
---|
79 | $level++;
|
---|
80 | if ($level>$maxlevel) $maxlevel = $level;
|
---|
81 | $parent[$level]=$item['id'];
|
---|
82 | $position[$level]=0;
|
---|
83 | $count[$level] = 0;
|
---|
84 | } else { // listov uzel
|
---|
85 | $index++;
|
---|
86 | }
|
---|
87 | } else {
|
---|
88 | if ($tbound[$level]<$tbound[$level-1]) $tbound[$level]=$tbound[$level-1];
|
---|
89 | if ($tbound[$level]>$maxleft) $maxleft=$tbound[$level];
|
---|
90 | if ($count[$level]==0) {
|
---|
91 | $count[$level]=1;
|
---|
92 | $index++;
|
---|
93 | }
|
---|
94 | $vfollow[$parent[$level]] = $count[$level];
|
---|
95 | if ($level>0) {
|
---|
96 | $count[$level-1] += $count[$level];
|
---|
97 | }
|
---|
98 |
|
---|
99 | if ($vleft[$vfirst[$parent[$level]]]>$vleft[$parent[$level]]) {
|
---|
100 | $vleft[$parent[$level]] = $vleft[$vfirst[$parent[$level]]];
|
---|
101 | if ($vleft[$parent[$level]]>$maxleft) $maxleft=$tbound[$level]-1;
|
---|
102 | $tbound[$level-1]=$vleft[$parent[$level]]+2;
|
---|
103 | if ($tbound[$level-1]>$maxleft) $maxleft=$tbound[$level-1];
|
---|
104 | }
|
---|
105 | balance($parent[$level],$level, &$vlast,&$vleft,&$vfirst,&$vnext,&$tbound);
|
---|
106 | $level--;
|
---|
107 | }
|
---|
108 | } while ($level>=0);
|
---|
109 | $data = compact('tbound','count','tbound','vfirst','vlast','vtop','vleft','vparent','maxlevel','maxleft','index');
|
---|
110 | return $data;
|
---|
111 | };
|
---|
112 |
|
---|
113 | extract(gentree(1));
|
---|
114 | $data = gentree(1);
|
---|
115 | // exit;
|
---|
116 | // 3th phase - generating midle tree
|
---|
117 |
|
---|
118 | $datamaxleft = $data['maxleft']+1;
|
---|
119 | for ($i=0; $i<71 ;$i++ ) {
|
---|
120 | // $vleft[$i]=($vleft[$i]+($datamaxleft-$data['vleft'][$i]))/2;
|
---|
121 | }
|
---|
122 |
|
---|
123 | // Generating image
|
---|
124 |
|
---|
125 | header("Content-type: image/png");
|
---|
126 | header("Cache-Control: no-cache"); // Dynamick graf nekeovat
|
---|
127 | $im = @imagecreate(($maxleft+1)*32, ($maxlevel+1)*32);
|
---|
128 | $background_color = imagecolorallocate($im, 255, 255, 255);
|
---|
129 | $black = imagecolorallocate($im, 0,0,0);
|
---|
130 | $gray = imagecolorallocate($im, 200,200,200);
|
---|
131 | $modra = imagecolorallocate($im, 100,100,255);
|
---|
132 | $red = imagecolorallocate($im, 255,180,180);
|
---|
133 |
|
---|
134 | function xpos($id) {
|
---|
135 | global $vleft, $vfollow;
|
---|
136 | $out = @$vleft[$id]*32;
|
---|
137 | // if ($vfollow[$id]>0) $out += ($vfollow[$id]-1) * 16;
|
---|
138 | return $out;
|
---|
139 | // return $vleft[$id]*32;
|
---|
140 | }
|
---|
141 |
|
---|
142 | DB_Query("SELECT * FROM hosts");
|
---|
143 | while ($item = DB_Row()) {
|
---|
144 | if ($item['parent']==0) {
|
---|
145 | // imagerectangle($im,xpos($item['id'])+10,$vtop[$item['id']]*32+10,xpos($item['id'])+22,$vtop[$item['id']]*32+22,$red);
|
---|
146 | imageline($im,xpos($item['id'])+16,$vtop[$item['id']]*32+16,xpos($item['id'])+16,$vtop[$item['id']]*32+32,$gray);
|
---|
147 | if (xpos($vfirst[$item['id']])>xpos($item['id'])) { $ttt=xpos($vfirst[$item['id']]); } else $ttt=xpos($item['id']);
|
---|
148 | // imageline($im,xpos($item['id'])+16,$vtop[$item['id']]*32+32,xpos($vlast[$item['id']])+16,$vtop[$item['id']]*32+32,$gray);
|
---|
149 | // imageline($im,xpos($vfirst[$item['id']])+16,$vtop[$item['id']]*32+32,xpos($item['id'])+16,$vtop[$item['id']]*32+32,$gray);
|
---|
150 | imageline($im,xpos($vfirst[$item['id']])+16,$vtop[$item['id']]*32+32,xpos($vlast[$item['id']])+16,$vtop[$item['id']]*32+32,$gray); //imagecolorallocate($im, 127+rand()*128, 127+rand()*128, 127+rand()*128));
|
---|
151 | } else {
|
---|
152 | imageline($im,xpos($item['id'])+16,$vtop[$item['id']]*32,xpos($item['id'])+16,$vtop[$item['id']]*32+16,$gray);
|
---|
153 | if ($vfirst[$item['id']]>0) {
|
---|
154 | imagerectangle($im,xpos($item['id'])+10,$vtop[$item['id']]*32+10,xpos($item['id'])+22,$vtop[$item['id']]*32+22,$black);
|
---|
155 | imageline($im,xpos($item['id'])+16,$vtop[$item['id']]*32+16,xpos($item['id'])+16,$vtop[$item['id']]*32+32,$gray);
|
---|
156 | // if (xpos($vfirst[$item['id']])>xpos($item['id'])) { $ttt=xpos($vfirst[$item['id']]); } else $ttt=xpos($item['id']);
|
---|
157 | imageline($im,xpos($vfirst[$item['id']])+16,$vtop[$item['id']]*32+32,xpos($vlast[$item['id']])+16,$vtop[$item['id']]*32+32,$gray); //imagecolorallocate($im, 127+rand()*128, 127+rand()*128, 127+rand()*128));
|
---|
158 | if (@$vfirst[$item['id']]>0) imageline($im,xpos(@$vfirst[$item['id']])+16,@$vtop[$item['id']]*32+32,xpos($item['id'])+16,$vtop[$item['id']]*32+32,$gray);
|
---|
159 | } else {
|
---|
160 | imagerectangle($im,xpos($item['id'])+10,@$vtop[$item['id']]*32+10,xpos($item['id'])+22,@$vtop[$item['id']]*32+22,$modra);
|
---|
161 | }
|
---|
162 | // imageline($im,xpos($item['id'])+16,$vtop[$item['id']]*32+16,xpos($item['parent'])+16,$vtop[$item['parent']]*32+16,$gray);
|
---|
163 | }
|
---|
164 | }
|
---|
165 |
|
---|
166 |
|
---|
167 | imagepng($im);
|
---|
168 | imagedestroy($im);
|
---|
169 | ?>
|
---|