Moka libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
k2-view.cc
Go to the documentation of this file.
1 /*
2  * lib-spamod : Visualisation des objets en discret.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of lib-spamod
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 /******************************************************************************
25  * Fichier : K2_View.cpp *
26  * Auteur : DEXET Martine *
27  *----------------------------------------------------------------------------*
28  * Ce fichier contient l'implémentation des méthodes de la classe K2_View. *
29  * *
30  *****************************************************************************/
31 
32 #ifdef _WINDOWS
33 #include <windows.h>
34 #endif
35 
36 #ifdef __APPLE__
37 #include <GLUT/glut.h>
38 #else
39 #include <GL/glut.h>
40 #endif
41 
42 #include "matrix.hh"
43 #include "k2-view.hh"
44 #include "user.hh"
45 #include "matrix-att.hh"
46 
47 using namespace GMap3d;
48 
49 /******************************************************************************
50  * Constructeur *
51  *****************************************************************************/
52 
53 K2_View::K2_View(CGMap * GM)
54 {
55  G = GM;
56 }
57 
58 
59 /******************************************************************************
60  * Fonction : void K2View::Calculate_Matrix() *
61  *----------------------------------------------------------------------------*
62  * Cette fonction recherche pour chaque pointel les liaisons possibles avec *
63  * les autres pointels. *
64  * *
65  *****************************************************************************/
66 
68 {
69  CDart * d;
70  int markVoxel = G->getNewMark();
71 
72  CDynamicCoverageAll Cgm(G);
73  for (Cgm.reinit(); Cgm.cont(); Cgm++)
74  {
75  d = *Cgm;
76 
77  // Si le brin n'est pas marqué.
78  if (!G->isMarked(d, markVoxel))
79  {
80 
81  // Récupération de la matrice principale.
82  Matrix * mat = ((Matrix_Att *)G
83  ->getAttribute(d, ORBIT_0123, MATRIX_ATTRIBUTE_ID))->Get_Data();
84 
85  // Parcours des cases de la matrice et mise à jour des bits qu'elles
86  // contiennent.
87 
88  // Premier parcours suivant le plan (X,Y).
89  for (int k = mat->Get_Z_Min(); k<mat->Get_Z_Max()+1; k++)
90 
91  for (int j = mat->Get_Y_Min(); j< mat->Get_Y_Max()+1; j++)
92 
93  for (int i = mat->Get_X_Min(); i< mat->Get_X_Max()+1; i++)
94  {
95  if (i!=mat->Get_X_Max())
96 
97  if (mat->Get_Color(i+1, j, k) != NO_COLOR)
98  mat->Set_Bit(i, j, k, 2);
99 
100  else
101  mat->Unset_Bit(i, j, k, 2);
102 
103  else
104  mat->Unset_Bit(i, j, k, 2);
105 
106  if (j!=mat->Get_Y_Max())
107 
108  if (mat->Get_Color(i, j+1, k) != NO_COLOR)
109  mat->Set_Bit(i, j, k, 3);
110 
111  else
112  mat->Unset_Bit(i, j, k, 3);
113 
114  else
115  mat->Unset_Bit(i, j, k, 3);
116 
117  if (i!=mat->Get_X_Max() && j!=mat->Get_Y_Max())
118 
119  if ((mat->Get_Color(i+1, j+1, k) != NO_COLOR) &&
120  (mat->Get_Color(i+1, j, k) != NO_COLOR) &&
121  (mat->Get_Color(i, j+1, k) != NO_COLOR))
122  mat->Set_Bit(i, j, k, 4);
123 
124  else
125  mat->Unset_Bit(i, j, k, 4);
126 
127  else
128  mat->Unset_Bit(i, j, k, 4);
129  }
130 
131  // Deuxième parcours suivant le plan (Z,Y).
132  for (int i = mat->Get_X_Min(); i<mat->Get_X_Max()+1; i++)
133 
134  for (int j = mat->Get_Y_Min(); j< mat->Get_Y_Max()+1; j++)
135 
136  for (int k = mat->Get_Z_Min(); k< mat->Get_Z_Max()+1; k++)
137  {
138  if (k!=mat->Get_Z_Max())
139 
140  if (mat->Get_Color(i, j, k+1) != NO_COLOR)
141  mat->Set_Bit(i, j, k, 5);
142 
143  else
144  mat->Unset_Bit(i, j, k, 5);
145 
146  else
147  mat->Unset_Bit(i, j, k, 5);
148 
149  if (k!=mat->Get_Z_Max() && j!=mat->Get_Y_Max())
150 
151  if ((mat->Get_Color(i, j+1, k+1) != NO_COLOR) &&
152  (mat->Get_Color(i, j, k+1) != NO_COLOR) &&
153  (mat->Get_Color(i, j+1, k) != NO_COLOR))
154  mat->Set_Bit(i, j, k, 6);
155 
156  else
157  mat->Unset_Bit(i, j, k, 6);
158 
159  else
160  mat->Unset_Bit(i, j, k, 6);
161  }
162 
163  // Troisième parcours suivant le plan (X,Z).
164  for (int j = mat->Get_Y_Min(); j<mat->Get_Y_Max()+1; j++)
165 
166  for (int k = mat->Get_Z_Min(); k< mat->Get_Z_Max()+1; k++)
167 
168  for (int i = mat->Get_X_Min(); i< mat->Get_X_Max()+1; i++)
169  {
170  if (k!=mat->Get_Z_Max() && i!=mat->Get_X_Max())
171 
172  if ((mat->Get_Color(i+1, j, k+1) != NO_COLOR) &&
173  (mat->Get_Color(i, j, k+1) != NO_COLOR) &&
174  (mat->Get_Color(i+1, j, k) != NO_COLOR))
175  mat->Set_Bit(i, j, k, 7);
176 
177  else
178  mat->Unset_Bit(i, j, k, 7);
179 
180  else
181  mat->Unset_Bit(i, j, k, 7);
182  }
183  CCoverage* DC = G->getDynamicCoverage(d, ORBIT_0123);
184  for (DC->reinit(); DC->cont(); (*DC) ++)
185  G->setMark(**DC, markVoxel);
186  delete DC;
187  }
188  }
189  for (Cgm.reinit(); Cgm.cont(); Cgm++)
190  G->unsetMark(*Cgm, markVoxel);
191 
192 
193  G->freeMark(markVoxel);
194 }
195 
196 
197 /******************************************************************************
198  * Fonction : void K2View::Draw_Pointels() *
199  *----------------------------------------------------------------------------*
200  * Cette fonction affiche les pointels de la vue K2 d'un objet. *
201  * *
202  *****************************************************************************/
203 
205 {
206  CDart * d;
207  int markVoxel = G->getNewMark();
208 
209  CDynamicCoverageAll Cgm(G);
210  for (Cgm.reinit(); Cgm.cont(); Cgm++)
211  {
212  d = *Cgm;
213 
214  // Si le brin n'est pas marqué.
215  if (!G->isMarked(d, markVoxel))
216  {
217 
218  // Récupération de la matrice principale.
219  CAttribute *alpha = G->getAttribute(d, ORBIT_0123, MATRIX_ATTRIBUTE_ID);
220  Matrix * mat = ((Matrix_Att*)alpha)->Get_Data();
221 
222  // Affichage des pointels.
223  glPointSize(4.0);
224  glBegin(GL_POINTS);
225 
226  for (int i=mat->Get_X_Min() ; i<=mat->Get_X_Max() ; i++)
227  for (int j=mat->Get_Y_Min() ; j<=mat->Get_Y_Max() ; j++)
228  for (int k=mat->Get_Z_Min() ; k<=mat->Get_Z_Max() ; k++)
229 
230  if (mat->Get_Color(i,j,k) != NO_COLOR)
231  glVertex3f(i, j, k);
232  glEnd();
233  glPointSize(1.0);
234 
235  CCoverage* DC = G->getDynamicCoverage(d, ORBIT_0123);
236  for (DC->reinit(); DC->cont(); (*DC)++)
237  G->setMark(**DC, markVoxel);
238  delete DC;
239  }
240  }
241  for (Cgm.reinit(); Cgm.cont(); Cgm++)
242  G->unsetMark(*Cgm, markVoxel);
243 
244 
245  G->freeMark(markVoxel);
246 }
247 
248 
249 /******************************************************************************
250  * Fonction : void K2View::Draw_Lignels() *
251  *----------------------------------------------------------------------------*
252  * Cette fonction affiche les lignels de la vue K2 d'un objet. *
253  * *
254  *****************************************************************************/
255 
257 {
258  CDart * d;
259  int markVoxel = G->getNewMark();
260 
261  CDynamicCoverageAll Cgm(G);
262  for (Cgm.reinit(); Cgm.cont(); Cgm++)
263  {
264  d = *Cgm;
265 
266  // Si le brin n'est pas marqué.
267  if (!G->isMarked(d, markVoxel))
268  {
269 
270  // Récupération de la matrice principale.
271  CAttribute *alpha = G->getAttribute(d, ORBIT_0123, MATRIX_ATTRIBUTE_ID);
272  Matrix * mat = ((Matrix_Att*)alpha)->Get_Data();
273 
274  // Affichage des lignels.
275  glLineWidth(2.0);
276  glBegin(GL_LINES);
277 
278  for (int i=mat->Get_X_Min() ; i<=mat->Get_X_Max() ; i++)
279  for (int j=mat->Get_Y_Min() ; j<=mat->Get_Y_Max() ; j++)
280  for (int k=mat->Get_Z_Min() ; k<=mat->Get_Z_Max() ; k++)
281 
282  if (mat->Get_Color(i,j,k) != NO_COLOR)
283  {
284  if (mat->Get_Bit(i, j, k, 2))
285  {
286  glVertex3f(i, j, k);
287  glVertex3f(i+1, j, k);
288  }
289 
290  if (mat->Get_Bit(i, j, k, 3))
291  {
292  glVertex3f(i, j, k);
293  glVertex3f(i, j+1, k);
294  }
295 
296  if (mat->Get_Bit(i, j, k, 5))
297  {
298  glVertex3f(i, j, k);
299  glVertex3f(i, j, k+1);
300  }
301  }
302  glEnd();
303  glLineWidth(1.0);
304 
305  CCoverage* DC = G->getDynamicCoverage(d, ORBIT_0123);
306  for (DC->reinit(); DC->cont(); (*DC)++)
307  G->setMark(**DC, markVoxel);
308  delete DC;
309  }
310  }
311  for (Cgm.reinit(); Cgm.cont(); Cgm++)
312  G->unsetMark(*Cgm, markVoxel);
313 
314 
315  G->freeMark(markVoxel);
316 }
317 
318 
319 /******************************************************************************
320  * Fonction : void K2View::Draw_Surfels() *
321  *----------------------------------------------------------------------------*
322  * Cette fonction affiche les surfels de la vue K2 d'un objet. *
323  * *
324  *****************************************************************************/
325 
327 {
328  CDart * d;
329  int markVoxel = G->getNewMark();
330 
331  // Activation de l'éclairage.
332  glEnable(GL_LIGHTING);
333  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
334 
335  CDynamicCoverageAll Cgm(G);
336  for (Cgm.reinit(); Cgm.cont(); Cgm++)
337  {
338  d = *Cgm;
339 
340  // Si le brin n'est pas marqué.
341  if (!G->isMarked(d, markVoxel))
342  {
343 
344  // Récupération de la matrice principale.
345  CAttribute *alpha = G->getAttribute(d, ORBIT_0123, MATRIX_ATTRIBUTE_ID);
346  Matrix * mat = ((Matrix_Att*)alpha)->Get_Data();
347 
348  // Affichage des surfels.
349  glBegin(GL_QUADS);
350 
351  for (int i=mat->Get_X_Min() ; i<=mat->Get_X_Max() ; i++)
352  for (int j=mat->Get_Y_Min() ; j<=mat->Get_Y_Max() ; j++)
353  for (int k=mat->Get_Z_Min() ; k<=mat->Get_Z_Max() ; k++)
354 
355  if (mat->Get_Color(i,j,k) != NO_COLOR)
356  {
357  if (mat->Get_Bit(i, j, k, 4))
358  {
359  glNormal3f(0.0, 0.0, 1.0);
360  glVertex3f(i+0.2, j+0.2, k);
361  glVertex3f(i+0.8, j+0.2, k);
362  glVertex3f(i+0.8, j+0.8, k);
363  glVertex3f(i+0.2, j+0.8, k);
364  }
365  if (mat->Get_Bit(i, j, k, 6))
366  {
367  glNormal3f(1.0, 0.0, 0.0);
368  glVertex3f(i, j+0.2, k+0.2);
369  glVertex3f(i, j+0.8, k+0.2);
370  glVertex3f(i, j+0.8, k+0.8);
371  glVertex3f(i, j+0.2, k+0.8);
372  }
373  if (mat->Get_Bit(i, j, k, 7))
374  {
375  glNormal3f(0.0, 1.0, 0.0);
376  glVertex3f(i+0.2, j, k+0.2);
377  glVertex3f(i+0.2, j, k+0.8);
378  glVertex3f(i+0.8, j, k+0.8);
379  glVertex3f(i+0.8, j, k+0.2);
380  }
381  }
382  glEnd();
383  CCoverage* DC = G->getDynamicCoverage(d, ORBIT_0123);
384  for (DC->reinit(); DC->cont(); (*DC)++)
385  G->setMark(**DC, markVoxel);
386  delete DC;
387  }
388  }
389  for (Cgm.reinit(); Cgm.cont(); Cgm++)
390  G->unsetMark(*Cgm, markVoxel);
391 
392 
393  G->freeMark(markVoxel);
394 
395  // Désactivation de l'éclairage.
396  glDisable(GL_LIGHTING);
397  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
398 }