source: www/netgraph/old/imagegen6.php@ 1

Last change on this file since 1 was 1, checked in by george, 17 years ago

Prvotní import všeho

  • Property svn:executable set to *
File size: 7.6 KB
Line 
1<? // Skript pro generování grafu stromové struktury sítì do PNG obrázku
2include('../db.php');
3DB_Init('localhost','root','','is');
4
5// === Zpìtné vyvážení stromu do hloubky =======================================
6function 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 ===================================
20function 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í položky 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
113extract(gentree(1));
114$data = gentree(1);
115// exit;
116// 3th phase - generating midle tree
117
118$datamaxleft = $data['maxleft']+1;
119for ($i=0; $i<71 ;$i++ ) {
120// $vleft[$i]=($vleft[$i]+($datamaxleft-$data['vleft'][$i]))/2;
121}
122
123// Generating image
124
125header("Content-type: image/png");
126header("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
134function 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
142DB_Query("SELECT * FROM hosts");
143while ($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
167imagepng($im);
168imagedestroy($im);
169?>
Note: See TracBrowser for help on using the repository browser.