Moka libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
ineq-op.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 : Ineq_Op.cpp *
26  * Auteur : DEXET Martine *
27  *----------------------------------------------------------------------------*
28  * Ce fichier contient l'implémentation des fonctions contenues dans le *
29  * le fichier Ineq_Op.h. *
30  * *
31  *****************************************************************************/
32 
33 
34 #include "ineq-op.hh"
35 #include "definition.hh"
36 #include "ineq-table-6-att.hh"
37 #include "ineq-table-2-att.hh"
38 #include "ineq-use-att.hh"
39 #include "attribute-vertex.hh"
40 
41 namespace GMap3d
42 {
43 
44 /******************************************************************************
45  * Fonction : void Create_Vertex_Ineq(CGMap * G, CDart * dgm, int markVertex) *
46  *----------------------------------------------------------------------------*
47  * Cette fonction calcule les inéquations des sommets de l'objet. *
48  * *
49  *****************************************************************************/
50 
51 void Create_Vertex_Ineq(CGMap * G, CDart * dgm, int markVertex)
52 {
53  CAttribute *currentAttribute;
54  CVertex *currentPoint;
55 
56  // Calcul des inequations du sommet et affectation à l'orbite ORBIT_123.
57  currentAttribute = G->getAttribute(dgm,ORBIT_123,VERTEX_ATTRIBUTE_ID);
58  currentPoint = (CAttributeVertex*)currentAttribute;
59  G->addAttribute(dgm,ORBIT_123,new Ineq_Table6_Att(*currentPoint));
60 
61  // Parcours et marquage des brins du sommet.
62  CCoverage* DCv = G->getDynamicCoverage(dgm, ORBIT_123);
63  for (DCv->reinit(); DCv->cont(); (*DCv)++)
64  G->setMark(**DCv, markVertex);
65  delete DCv;
66 }
67 
68 
69 /******************************************************************************
70  * Fonction : void Create_Edges_Ineq(CGMap * G, CDart * dgm, int markEdge) *
71  *----------------------------------------------------------------------------*
72  * Cette fonction calcule les inéquations des arêtes de l'objet. *
73  * *
74  *****************************************************************************/
75 
76 void Create_Edges_Ineq(CGMap * G, CDart * dgm, int markEdge)
77 {
78  CAttribute *currentAttribute;
79  CVertex *p1, *p2;
80 
81  // Parcours des brins de la face élémentaire.
82  CCoverage* DC01 = G->getDynamicCoverage(dgm, ORBIT_01);
83  for (DC01->reinit(); DC01->cont(); (*DC01)++)
84  {
85  CDart* d01 = **DC01;
86 
87  // Si le brin n'est pas marqué.
88  if (!G->isMarked(d01, markEdge))
89  {
90  // Coordonnées du point associé au sommet contenant dgm.
91  currentAttribute = G->getAttribute(d01,ORBIT_123,
93  p1 = (CAttributeVertex*)currentAttribute;
94 
95  // Coordonnées du point associé au sommet contenant alpha0(dgm).
96  currentAttribute = G->getAttribute(G->alpha0(d01),ORBIT_123,
98  p2 = (CAttributeVertex*)currentAttribute;
99 
100  // Calcul des inequations et affectation à l'orbite ORBIT_023.
101  G->addAttribute(d01,ORBIT_023,new Ineq_Table6_Att(*p1, *p2));
102 
103  // Parcours et marquage des brins de l'orbite ORBIT_023.
104  CCoverage* DCe = G->getDynamicCoverage(d01, ORBIT_023);
105  for (DCe->reinit();DCe->cont(); (*DCe)++)
106  G->setMark(**DCe, markEdge);
107  delete DCe;
108  }
109  }
110  delete DC01;
111 }
112 
113 
114 /******************************************************************************
115  * Fonction : void Create_Face_Ineq(CGMap * G, CDart * dgm, int markFace) *
116  *----------------------------------------------------------------------------*
117  * Cette fonction calcule les inéquations des faces de l'objet. *
118  * *
119  *****************************************************************************/
120 
121 void Create_Face_Ineq(CGMap * G, CDart * dgm, int markFace)
122 {
123  CAttribute *currentAttribute;
124  CVertex *currentPoint, *p1, *p2;;
125 
126  //Il s'agit d une face.
127  if (G->getAttribute(dgm, ORBIT_013, INT_ATTRIBUTE_ID))
128  {
129  // Coordonnées du point associé au sommet contenant dgm.
130  currentAttribute = G->getAttribute(dgm,ORBIT_123, VERTEX_ATTRIBUTE_ID);
131  currentPoint = (CAttributeVertex*)currentAttribute;
132 
133  // Coordonnées du point associé au sommet contenant alpha0(dgm).
134  currentAttribute = G->getAttribute(G->alpha0(dgm), ORBIT_123,
136  p1 = (CAttributeVertex*)currentAttribute;
137 
138  // Coordonnées du point associé au sommet contenant alpha1(alpha0(dgm)).
139  currentAttribute = G->getAttribute(G->alpha0(G->alpha1(dgm)),
140  ORBIT_123, VERTEX_ATTRIBUTE_ID);
141  p2 = (CAttributeVertex*)currentAttribute;
142 
143  //Calcul des inequations de la face et affectation alpha l'orbite ORBIT_013.
144  G->addAttribute(dgm,ORBIT_013,new Ineq_Table2_Att(*currentPoint, *p1,
145  *p2));
146 
147  //Parcours et marquage des brins de la face.
148  CCoverage* DCf = G->getDynamicCoverage(dgm, ORBIT_013);
149  for (DCf->reinit(); DCf->cont(); (*DCf)++)
150  G->setMark(**DCf, markFace);
151  delete DCf;
152  }
153  else
154  G->setMark(dgm, markFace);
155 }
156 
157 
158 /******************************************************************************
159  * Fonction : void Create_Ineq(CGMap * G) *
160  *----------------------------------------------------------------------------*
161  * Cette fonction calcule les inéquations des cellules de l'objet. *
162  * *
163  *****************************************************************************/
164 
165 void Create_Ineq(CGMap *G)
166 {
167  // Création de 3 marques.
168  int markVertex = G->getNewMark();
169  int markFace = G->getNewMark();
170  int markEdge = G->getNewMark();
171 
172 
173  // Parcours des brins de la GCarte.
174  CDynamicCoverageAll Cgm(G);
175  for (Cgm.reinit(); Cgm.cont(); Cgm++)
176  {
177  CDart* dgm = *Cgm;
178 
179  // Si le brin n'est pas marqué avec la marque markVertex.
180  if (!G->isMarked(dgm, markVertex))
181  Create_Vertex_Ineq(G, dgm, markVertex);
182 
183  // Si le brin n'est pas marqué avec la marque markEdge.
184  if (!G->isMarked(dgm, markEdge) && !G->isFree0(dgm))
185  Create_Edges_Ineq(G, dgm, markEdge);
186 
187  // Si le brin n'est pas marqué avec la marque markFace.
188  if (!G->isMarked(dgm, markFace))
189  Create_Face_Ineq(G, dgm, markFace);
190  }
191 
192  // Démarquage et libération des marques.
193  for (Cgm.reinit(); Cgm.cont(); Cgm++)
194  {
195  G->unsetMark(*Cgm, markVertex);
196  G->unsetMark(*Cgm, markFace);
197  G->unsetMark(*Cgm, markEdge);
198  }
199  G->freeMark(markVertex);
200  G->freeMark(markFace);
201  G->freeMark(markEdge);
202 
203 }
204 
205 
206 /******************************************************************************
207  * Fonction : void Calculate_Bounding_Box(CGMap * G, CDart * d, TOrbit o, *
208  * float minMaxXyz[6]) *
209  *----------------------------------------------------------------------------*
210  * Cette fonction calcule la boite englobante des cellules de l'objet. *
211  * *
212  *****************************************************************************/
213 
214 void Calculate_Bounding_Box(CGMap * G, CDart * d, TOrbit o, float minMaxXyz[6])
215 {
216  CDart * dO;
217 
218  // Création d'une marque.
219  int markVertex = G->getNewMark();
220 
221  // Calcul de la boite englobante de l'objet complet.
222  if (d == NULL && o == ORBIT_0123)
223  {
224  // Parcours des brins de la G-carte.
225  CDynamicCoverageAll Cgm(G);
226  Cgm.reinit();
227  dO = *Cgm;
228 
229  // Récupération des inéquations du sommet contenant le premier brin du
230  // parcours.
231  CAttribute * alpha = G->getAttribute(dO,ORBIT_123,INEQ6_ATTRIBUTE_ID);
232  Ineq_Table6 * t = ((Ineq_Table6_Att*)alpha)->Get_Data();
233 
234  // Stockage des paramètres w des inéquations.
235  for (int i=0; i<6; i++)
236  minMaxXyz[i] = t->Get_Ineq(i)->GetW();
237 
238  // Parcours et marquage des brins du sommet.
239  CCoverage* DCv = G->getDynamicCoverage(dO, ORBIT_123);
240  for (DCv->reinit(); DCv->cont(); (*DCv)++)
241  G->setMark(**DCv, markVertex);
242  delete DCv;
243 
244  // Parcours des autres brins de la G-carte.
245  for (; Cgm.cont(); Cgm++)
246  {
247  dO = *Cgm;
248 
249  // Si le brin n'est pas marqué.
250  if (!G->isMarked(dO, markVertex))
251  {
252  // Récupération des inéquations du sommet contenant dO.
253  alpha = G->getAttribute(dO,ORBIT_123,INEQ6_ATTRIBUTE_ID);
254  t = ((Ineq_Table6_Att*)alpha)->Get_Data();
255 
256  // Comparaison des paramètres w des inéquations récupérées avec
257  // les valeurs du tableau.
258  for (int i=0; i<6; i++)
259  if (minMaxXyz[i] < t->Get_Ineq(i)->GetW())
260  minMaxXyz[i] = t->Get_Ineq(i)->GetW();
261  }
262  // Parcours et marquage des brins du sommet.
263  CCoverage* DCv = G->getDynamicCoverage(dO, ORBIT_123);
264  for (DCv->reinit();
265  DCv->cont();
266  (*DCv)++)
267  G->setMark(**DCv, markVertex);
268  delete DCv;
269  }
270  // Parcours et démarquage des brins de la G-carte.
271  for (Cgm.reinit(); Cgm.cont(); Cgm++)
272  G->unsetMark(*Cgm, markVertex);
273  }
274 
275  // Calcul de la boite englobante d'une certaine cellule.
276  else
277  {
278  // Récupération des inéquations du sommet contenant d.
279  CAttribute * alpha = G->getAttribute(d,ORBIT_123,INEQ6_ATTRIBUTE_ID);
280  Ineq_Table6 * t = ((Ineq_Table6_Att*)alpha)->Get_Data();
281 
282  // Stockage des paramètres w des inéquations.
283  for (int i=0; i<6; i++)
284  minMaxXyz[i] = t->Get_Ineq(i)->GetW();
285 
286  // Parcours des brins de l'orbite donnée en paramètre de la fonction.
287  CCoverage* DCe = G->getDynamicCoverage(d, o);
288  for (DCe->reinit(); DCe->cont(); (*DCe)++)
289  {
290  dO = **DCe;
291 
292  // Si le brin n'est pas marqué.
293  if (!G->isMarked(dO, markVertex))
294  {
295  // Récupération des inéquations du sommet contenant dO.
296  alpha = G->getAttribute(dO,ORBIT_123,INEQ6_ATTRIBUTE_ID);
297  t = ((Ineq_Table6_Att*)alpha)->Get_Data();
298 
299  // Comparaison des paramètres w des inéquations récupérées avec
300  // les valeurs du tableau.
301  for (int i=0; i<6; i++)
302  if (minMaxXyz[i] < t->Get_Ineq(i)->GetW())
303  minMaxXyz[i] = t->Get_Ineq(i)->GetW();
304 
305  // Marquage des brins de l'orbite spécifiée.
306  if (o == ORBIT_01)
307  {
308  G->setMark(dO, markVertex);
309  G->setMark(G->alpha1(dO), markVertex);
310  }
311  else
312  if (o == ORBIT_012)
313  {
314  G->setMark(dO, markVertex);
315  G->setMark(G->alpha1(dO), markVertex);
316  G->setMark(G->alpha2(dO), markVertex);
317  }
318  else
319  if (o == ORBIT_0)
320  G->setMark(dO, markVertex);
321  else
322  {
323  G->setMark(dO, markVertex);
324  G->setMark(G->alpha1(dO), markVertex);
325  G->setMark(G->alpha2(dO), markVertex);
326  G->setMark(G->alpha3(dO), markVertex);
327  }
328  }
329  }
330 
331  // Démarquage des brins de la G-carte.
332  for (DCe->reinit(); DCe->cont(); (*DCe)++)
333  G->unsetMark(**DCe, markVertex);
334  delete DCe;
335  }
336  // Libération de la marque.
337  G->freeMark(markVertex);
338 }
339 
340 
341 /******************************************************************************
342  * Fonction : void Ineq_Vertex_Set_Unused(CGMap * G, CDart * d, TOrbit o, *
343  * float minMaxXyz[6]) *
344  *----------------------------------------------------------------------------*
345  * Cette fonction met à jour les variables used des inéquations des cellules *
346  * de l'objet. *
347  * *
348  *****************************************************************************/
349 
350 void Ineq_Vertex_Set_Unused(CGMap * G, CDart * d, TOrbit o, float minMaxXyz[6])
351 {
352  CDart * dO;
353  CAttribute * alpha;
354  Ineq_Table6 * t;
355 
356  // Création d'une marque.
357  int markVertex = G->getNewMark();
358 
359  // Parcours des brins de l'orbite o.
360  CCoverage* DCe = G->getDynamicCoverage(d, o);
361  for (DCe->reinit(); DCe->cont(); (*DCe)++)
362  {
363  dO = **DCe;
364 
365  // Si le brin n'est pas marqué.
366  if (!G->isMarked(dO, markVertex))
367  {
368  // Récupération des inéquations du sommet contenant dO.
369  alpha = G->getAttribute(dO,ORBIT_123,INEQ6_ATTRIBUTE_ID);
370  t = ((Ineq_Table6_Att*)alpha)->Get_Data();
371 
372  // Mise à jour de la variable used des inéquations.
373  for (int i=0; i<6; i++)
374  if (fabs(minMaxXyz[i] - t->Get_Ineq(i)->GetW())>EPS)
375  t->Get_Ineq(i)->Set_Unused();
376 
377  // Marquage des brins de l'orbite spécifiée.
378  if (o == ORBIT_01)
379  {
380  G->setMark(dO, markVertex);
381  G->setMark(G->alpha1(dO), markVertex);
382  }
383  else
384  if (o == ORBIT_012)
385  {
386  G->setMark(dO, markVertex);
387  G->setMark(G->alpha1(dO), markVertex);
388  G->setMark(G->alpha2(dO), markVertex);
389  }
390  else
391  G->setMark(dO, markVertex);
392  }
393  }
394 
395  // Démarquage des brins de l'orbite o.
396  for (DCe->reinit(); DCe->cont(); (*DCe)++)
397  G->unsetMark(**DCe, markVertex);
398  G->freeMark(markVertex);
399 
400  delete DCe;
401 }
402 
403 
404 /******************************************************************************
405  * Fonction : void Compare_Ineq_Vertex(CGMap * G, CDart * d, int markVertex) *
406  *----------------------------------------------------------------------------*
407  * Cette fonction recherche les inéquations visibles des sommets pour la *
408  * cellule de plus grande dimension contenant d. *
409  * *
410  *****************************************************************************/
411 
412 void Compare_Ineq_Vertex(CGMap* G, CDart* d, int markVertex)
413 {
414  float minMaxXyz[6];
415 
416  // Le brin appartient à une face.
417  if (G->getEmbeddingOwner(d, ORBIT_013))
418  {
419  // Calcul de la boite englobante.
420  Calculate_Bounding_Box(G, d, ORBIT_01, minMaxXyz);
421 
422  // Mise à jour des variables used.
423  Ineq_Vertex_Set_Unused(G, d, ORBIT_01, minMaxXyz);
424 
425  // Marquage des brins de la face.
426  CCoverage* DCv = G->getDynamicCoverage(d, ORBIT_01);
427  for (DCv->reinit(); DCv->cont(); (*DCv)++)
428  G->setMark(**DCv, markVertex);
429  delete DCv;
430  }
431 
432  // Le brin appartient à une arete.
433  else
434  {
435  if (!G->isFree0(d))
436  {
437  // Calcul de la boite englobante.
438  Calculate_Bounding_Box(G, d, ORBIT_0, minMaxXyz);
439 
440  // Mise à jour des variables used.
441  Ineq_Vertex_Set_Unused(G, d, ORBIT_0, minMaxXyz);
442 
443  // Marquage de d et alpha0(d).
444  G->setMark(d, markVertex);
445  G->setMark(G->alpha0(d), markVertex);
446  }
447  // Le brin est seul
448  else
449  // Marquage du brin.
450  G->setMark(d, markVertex);
451  }
452 }
453 
454 
455 /******************************************************************************
456  * Fonction : void Compare_Ineq_Edge(CGMap * G, CDart * d, int markEdge) *
457  *----------------------------------------------------------------------------*
458  * Cette fonction recherche les inéquations visibles des arêtes pour les *
459  * faces contenant d. *
460  * *
461  *****************************************************************************/
462 
463 void Compare_Ineq_Edge(CGMap* G, CDart* d, int markEdge)
464 {
465  CAttribute* alpha, * au;
466  CDart* d01;
467  CVertex* p;
468 
469  bool badIneq;
470 
471  // Création d'une marque.
472  int markTemp = G->getNewMark();
473 
474  // Le brin appartient à une face.
475  if (G->getEmbeddingOwner(d, ORBIT_013))
476  {
477  // Recuperation des inequations de l arete.
478  alpha = G->getAttribute(d,ORBIT_023,INEQ6_ATTRIBUTE_ID);
479  Ineq_Table6* t = ((Ineq_Table6_Att*)alpha)->Get_Data();
480 
481  // Tableau de type Inequ_Use pourl'arête traitée.
482  au = new Ineq_Use_Att();
483  Ineq_Use* u = ((Ineq_Use_Att*)au)->Get_Data();
484 
485  // Pour chaque inéquation de l'arête.
486  for(int j=0; j < 6; j++)
487  {
488  badIneq = false;
489  Inequation i = *t->Get_Ineq(j);
490 
491  if (j%2 == 0)
492  {
493  // Calcul de l'inequation du demiEspace contenant l'arête.
494  i.SetW((i.GetW() - t->Get_Ineq(j+1)->GetW())/2.0);
495  }
496  else
497  {
498  // Calcul de l'inequation du demi-espace contenant l'arête.
499  i.SetW((i.GetW() - t->Get_Ineq(j-1)->GetW())/2.0);
500  }
501 
502  // Parcours des brins de l'orbite ORBIT_01.
503  CCoverage* DCf = G->getDynamicCoverage(d, ORBIT_01);
504  for (DCf->reinit();
505  DCf->cont() && !badIneq;
506  (*DCf)++)
507  {
508  d01 = **DCf;
509 
510  // Si le brin n'est pas marqué.
511  if (!G->isMarked(d01, markTemp))
512  {
513  // Récupération du point associé au sommet contenant d01.
514  alpha = G->getAttribute(d01,ORBIT_123, VERTEX_ATTRIBUTE_ID);
515  p = (CAttributeVertex*)alpha;
516 
517  // Je teste si le point récupéré ne vérifie pas une des 2
518  // inequations.
519  if(!t->Get_Ineq(j)->Test_Point (*p) || !i.Test_Point (*p))
520  {
521  badIneq = true;
522 
523  // Mise à jour du paramètre used de l'inéquation et de la
524  // case correspondante dans le tableau de type Ineq_Use.
525  t->Get_Ineq(j)->Set_Unused();
526  u->Set_Unused(j);
527  }
528  // Marquage de d01 et de alpha1(d01)
529  G->setMark(d01, markTemp);
530  G->setMark(G->alpha1(d01), markTemp);
531  }
532  }
533 
534  // Démarquage des brins de l'orbite ORBIT_01.
535  for (DCf->reinit();
536  DCf->cont();
537  (*DCf)++)
538  G->unsetMark(**DCf, markTemp);
539  delete DCf;
540  }
541  G->addAttribute(d,ORBIT_0,au);
542  }
543  //Libération de la marque.
544  G->freeMark(markTemp);
545 
546  // Marquage de d;
547  G->setMark(d, markEdge);
548 
549  // Le brin n est pas seul
550  if(!G->isFree0(d))
551 
552  // Marquage de son image par alpha0.
553  G->setMark(G->alpha0(d), markEdge);
554 }
555 
556 
557 /******************************************************************************
558  * Fonction : void Choose_Ineq(CGMap * G) *
559  *----------------------------------------------------------------------------*
560  * Cette fonction recherche les inéquations visibles pour l'objet. *
561  * *
562  *****************************************************************************/
563 
564 void Choose_Ineq(CGMap* G)
565 {
566  // Création de 3 marques.
567  int markEdge = G->getNewMark();
568  int markVertex = G->getNewMark();
569 
570  // Parcours des brins de la GCarte.
571  CDynamicCoverageAll Cgm(G);
572  for (Cgm.reinit(); Cgm.cont(); Cgm++)
573  {
574  CDart* dgm = *Cgm;
575 
576  // Le brin n'est pas marqué par la marque markVertex.
577  if (!G->isMarked(dgm, markVertex))
578  Compare_Ineq_Vertex(G, dgm, markVertex);
579 
580  // Le brin n'est pas marqué par la marque markEdge .
581  if (!G->isMarked(dgm, markEdge))
582  Compare_Ineq_Edge(G, dgm, markEdge);
583  }
584 
585  // Demarquage et liberation des marques.
586  for (Cgm.reinit(); Cgm.cont(); Cgm++)
587  {
588  G->unsetMark(*Cgm, markVertex);
589  G->unsetMark(*Cgm, markEdge);
590  }
591  G->freeMark(markVertex);
592  G->freeMark(markEdge);
593 
594 }
595 
596 } // namespace GMap3d