Visualisierung2
main.cpp
Go to the documentation of this file.
1 #include "windows.h"
2 #include <glew.h>
3 #include <glfw3.h>
4 
5 #include <iostream>
6 #include <fstream>
7 
8 #include "L_System.h"
9 #include "ShaderLoader.h"
10 //#include "AdjazenzMatrix.h"
11 #include "FastCommunity.h"
12 #include "Visualisation.h"
13 
14 void init(std::string path);
15 void initVisualisation(std::string path);
16 void update();
17 void draw();
18 void cleanup();
19 void addSelfLoops(std::string path);
20 
21 GLFWwindow* window;
22 //AdjazenzMatrix* M; //!< Repraesentiert die Adjyzenzmatrix des Graphen (Wurde fuer ersten Clusteringversuch und zum Monitoring der Testdaten benutzt).
25 
26 GLuint shader;
27 
28 int height;
29 int width;
30 
33 bool drawCurve;
34 bool drawPoints;
35 bool selfloops;
36 
39 static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
40 {
41  if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) //close Window by pressing esc
42  {
43  glfwSetWindowShouldClose(window, GL_TRUE);
44  }
45  if(key == GLFW_KEY_LEFT && action == GLFW_PRESS) //decrease visualisationorder with left arrow
46  {
47  visu->decreaseOrder();
48  }
49  if(key == GLFW_KEY_RIGHT && action == GLFW_PRESS) //increase visualisationorder with rigth arrow
50  {
51  visu->increaseOrder();
52  }
53  if(key == GLFW_KEY_C && action == GLFW_PRESS) //draw Curve by pressing C
54  {
55  if(drawCurve)
56  {
57  drawCurve = false;
58  }else{
59  drawCurve = true;
60  }
61  }
62  if(key == GLFW_KEY_P && action == GLFW_PRESS) //draw Datapoints by pressing P
63  {
64  if(drawPoints)
65  {
66  drawPoints = false;
67  }else{
68  drawPoints = true;
69  }
70  }
71  if(key == GLFW_KEY_1 && action == GLFW_PRESS) //draw the viualisation with the hilbert curve by pressing 1
72  {
73  changeCurve = 1;
74  }
75  if(key == GLFW_KEY_2 && action == GLFW_PRESS) //draw the visualisation with the gosper curve by pressing 2
76  {
77  changeCurve = 2;
78  }
79  if(key == GLFW_KEY_F1 && action == GLFW_PRESS) //draw TestData1
80  {
81  changeData = 1;
82  }
83  if(key == GLFW_KEY_F2 && action == GLFW_PRESS) //draw TestData2
84  {
85  changeData = 2;
86  }
87  if(key == GLFW_KEY_F3 && action == GLFW_PRESS) //draw TestData2
88  {
89  changeData = 3;
90  }
91  if(key == GLFW_KEY_F4 && action == GLFW_PRESS) //draw TestData2
92  {
93  changeData = 4;
94  }
95 }
96 
99 void main()
100 {
101  std::string path = "../TestData/testitest3.txt";
102  init(path);
103 
104  while (!glfwWindowShouldClose(window))
105  {
106  glfwPollEvents();
107 
108  glViewport(0,0,width,height);
109  glClear(GL_COLOR_BUFFER_BIT);
110  glUseProgram(shader);
111 
113  update();
114  glUseProgram(0);
115 
116  glfwSwapBuffers(window);
117  }
118 
119  cleanup();
120 
121  //Remove the tmp File
122  if (selfloops)
123  {
124  if( remove( "../tmp/tmp.txt" ) != 0 )
125  {
126  perror( "Can't delete the tmp files" );
127  }
128  }
129 }
130 
134 void init(std::string path)
135 {
136  if (!glfwInit()) //init glfw
137  {
138  system("PAUSE");
139  exit(EXIT_FAILURE);
140  }
141  int refresh_rate = 60;
142  glfwWindowHint(GLFW_REFRESH_RATE, refresh_rate);
143  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
144  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
145  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
146 
147  width = 800;
148  height = 800;
149  GLFWmonitor* monitor = nullptr;
150 
151  window = glfwCreateWindow(width, height, "Space Filling Curve Visualisierung", monitor, NULL);
152  glfwMakeContextCurrent(window);
153 
154  glfwSetKeyCallback(window, key_callback);
155  glViewport(0, 0, width, height);
156  glClearColor(1.0f,1.0f,1.0f,0.0f);
157 
158  glewExperimental = true; //init glew
159  GLenum err = glewInit();
160  if (err != GLEW_OK)
161  {
162  //Error
163  std::cout << glewGetErrorString(err);
164  }
165 
166  //load shaders
167  ShaderLoader* loader = new ShaderLoader();
168  shader = loader->LoadShaders("../Shader/vertexshader.vert", "../Shader/fragmentshader.frag", "../Shader/geometryshader.geo");
169  delete loader; loader = nullptr;
170 
171  //M = new AdjazenzMatrix("../TestData/testitest.txt");
172 
173  //no user inpud at the beginning
174  drawCurve = false;
175  drawPoints = false;
176  changeCurve = 0;
177  changeData = 0;
178 
179  initVisualisation(path);
180 }
184 void initVisualisation(std::string path)
185 {
186  //Cluster the Graph
187  clusterer = new FastCommunity();
188  myList* ordering;
189 
190  bool selfloops = false; //self loops are not supportet by the current visualisationversion
191  if(selfloops)
192  {
193  addSelfLoops(path);
194  ordering = clusterer->clusterAndOrder("../tmp/tmp.txt");
195  }else{
196  ordering = clusterer->clusterAndOrder(path);
197  }
198 
199  //set die visualisation
200  visu = new Visualisation(width,height,ordering,clusterer->edgeList,clusterer->gparm.n,clusterer->gparm.maxid);
201 }
202 
206 void update()
207 {
208  if(changeCurve == 1)
209  {
210  visu->changeType("hilbert");
211  changeCurve = 0;
212  }
213  if(changeCurve == 2)
214  {
215  visu->changeType("gosper");
216  changeCurve = 0;
217  }
218 
219  if(changeData == 1)
220  {
221  delete clusterer; delete visu;
222  std::string path = "../TestData/testitest.txt";
223  initVisualisation(path);
224  changeData = 0;
225  }
226  if(changeData == 2)
227  {
228  delete clusterer; delete visu;
229  std::string path = "../TestData/testitest2.txt";
230  initVisualisation(path);
231  changeData = 0;
232  }
233  if(changeData == 3)
234  {
235  delete clusterer; delete visu;
236  std::string path = "../TestData/testitest3.txt";
237  initVisualisation(path);
238  changeData = 0;
239  }
240  if(changeData == 4)
241  {
242  delete clusterer; delete visu;
243  std::string path = "../TestData/peeroregon.txt";
244  initVisualisation(path);
245  changeData = 0;
246  }
247 }
248 
252 void cleanup()
253 {
254  //delete M; M = nullptr;
255  delete clusterer; clusterer = nullptr;
256  delete visu; visu = nullptr;
257 
258  glDeleteProgram(shader);
259  glfwDestroyWindow(window);
260 
261  glfwTerminate();
262 }
263 
268 void addSelfLoops(std::string path) //not supportet in the current visualisationversion
269 {
270  int maxIndex = -1;
271 
272  //-.-.-.-.-.-.-.-.-.-get largest nodevalue-.-.-.-.-.-.-.-.-.-.-.-.-
273  int s,f,t;
274  std::ifstream fscan(path.c_str(), std::ios::in);
275  std::ofstream fout("../tmp/tmp.txt", std::ios::out);
276  while (fscan >> s >> f) {
277  fout << s << " " << f << "\n";
278  if (f < s) { t = s; s = f; f = t; } // guarantee s < f
279  if (f > maxIndex) { maxIndex = f; } // track largest node index
280  }
281  fscan.close();
282  //-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
283 
284  //-.-.-.-.-.-.-.-.-.-.-.-.-add selfloops-.-.-.-.-.-.-.-.-.-.-.-.-.-
285  for(int i = 1; i<=maxIndex; i++)
286  {
287  fout << i << " " << i << "\n";
288  }
289  fout.close();
290  //-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
291 
292 }
netparameters gparm
Struktur mit verschiedenen Informationen ueber den Graphen gefuellt wird.
Definition: FastCommunity.h:92
bool selfloops
Speichert on Kanten von Knoten zu sich selbst hinzugefuegt werden sollen (Wird von Visualisierung noc...
Definition: main.cpp:35
void main()
Definition: main.cpp:99
void init(std::string path)
Initialisiert das Fenster und alle Parameter. Path ist der Pfad zur Graphdatei.
Definition: main.cpp:134
void changeType(std::string type)
Aendert den Typ der Visualisierungskurve auf den uebergeben Typ ("hilbert" oder "gosper").
int maxid
Groesste KnotenId.
Definition: FastCommunity.h:60
int height
Definition: main.cpp:28
Definition: myList.h:4
bool drawCurve
Speichert Benutzereingabe ob die Kurve mit gezeichnet werden soll.
Definition: main.cpp:33
GLuint LoadShaders(const char *vertex_path, const char *fragment_path, const char *geo_path)
Diese Methode laedt die Shader. Parameter sind die jeweiligen Dateipfade.
void draw()
Zeichnet den Inhalt des Fensters.
int width
Definition: main.cpp:29
int changeData
Speichert Benutzeraenderung an dem anzuzeigenden Datensatz (vor allem fuer Vorfuerung).
Definition: main.cpp:32
int n
Knotenanzahl im Graphen.
Definition: FastCommunity.h:58
bool drawPoints
Speichert Benutzereingabe ob die Knotenpunkte mit gezeichnet werden sollen.
Definition: main.cpp:34
void decreaseOrder()
Verringert die Kurvebordnung um 1.
FastCommunity * clusterer
Repraesentiert die Clusterklasse.
Definition: main.cpp:23
std::vector< unsigned int > edgeList
eine Liste aller Kanten die im Graphen vorkommen
Definition: FastCommunity.h:94
GLuint shader
Enthaellt den Zeichenshader.
Definition: main.cpp:26
void cleanup()
Gibt allen Speicher wieder frei.
Definition: main.cpp:252
myList * clusterAndOrder(std::string path)
Die Hauptmethode dieser Klasse. Sie liest den Graphen aus der Datei, clustert ihn, fuehrt die Tiefensuche durch und gibt die Reihenfolge der Knoten als Liste zurueck.
GLFWwindow * window
Repraesentiert das Fenster.
Definition: main.cpp:21
void addSelfLoops(std::string path)
Fuegt in einer Temporaeren Datei Kanten an jeden Knoten zu sich selbst ein (Wird von der Visualisieru...
Definition: main.cpp:268
void increaseOrder()
Erhoeht die Kurvenordnung um 1.
void update()
Updatet die Visualisierung nach Benutzereingaben.
Definition: main.cpp:206
void draw(GLuint shader, bool drawPoints, bool drawCurve)
Zeichnet den Graphen mit den uebergeben Shader. Die 2 anderen Parameter bestimmen ob zusaetzlich die ...
Visualisation * visu
Dieses Objekt macht die eigentliche Visualisierung.
Definition: main.cpp:24
void initVisualisation(std::string path)
Initialisiert das Clustering und die Visualisierung;.
Definition: main.cpp:184
int changeCurve
Speichert Benutzeraenderungen an der Art der Kurve.
Definition: main.cpp:31