1 |
|
5 |
|
2 |
|
|
#include <stdio.h>
|
3 |
|
|
#include "p3d_cst.h"
|
4 |
|
|
#include "m3d_struct.h"
|
5 |
|
|
#include "m3d_hotes.h"
|
6 |
|
|
#include "prototype.h"
|
7 |
|
|
extern GEST_MEM *gest ;
|
8 |
|
|
extern int debug ;
|
9 |
|
|
int p3d_nbsurf(void)
|
10 |
|
|
/* declaration des arguments */
|
11 |
|
|
{
|
12 |
|
|
/* declaration des variables internes a la procedure */
|
13 |
|
|
ELEMENT *front, *tete ;/* tete des elements du front */
|
14 |
|
|
SEGMENT *seg ;
|
15 |
|
|
int num , num1, num2, num3, n1, n2, gtrouve, vec_ele[3], k, numele, i ;
|
16 |
|
|
/* ************************************************* */
|
17 |
|
|
/* debut du code executable */
|
18 |
|
|
/* ************************************************* */
|
19 |
|
|
|
20 |
|
|
/* on suppose que markele a ete initialise */
|
21 |
|
|
|
22 |
|
|
/* nombre de surfaces */
|
23 |
|
|
gest->nb_surf = 0 ;
|
24 |
|
|
for (k=0 ;k<gest->nb_2d;k++)
|
25 |
|
|
{
|
26 |
|
|
(gest->tab_ele[k]).num = k ;
|
27 |
|
|
(gest->tab_ele[k]).mark = 0 ;
|
28 |
|
|
(gest->tab_ele[k]).suivant = NULL ;
|
29 |
|
|
}
|
30 |
|
|
|
31 |
|
|
for (k=0;k<gest->nb_2d;k++)
|
32 |
|
|
{
|
33 |
|
|
/* l'element n'a pas ete traite : nouvelle strategie */
|
34 |
|
|
if ((gest->tab_ele[k]).mark == 0)
|
35 |
|
|
{
|
36 |
|
|
gest->nb_surf=gest->nb_surf + 1 ;
|
37 |
|
|
/* initialiser le front */
|
38 |
|
|
/* chercher l'element k et remplir le front */
|
39 |
|
|
/* element de numero k */
|
40 |
|
|
tete = &(gest->tab_ele[k]) ;
|
41 |
|
|
tete->mark = FRONT ;
|
42 |
|
|
front = NULL ;
|
43 |
|
|
/* insertion en tete */
|
44 |
|
|
INSERE_TETE(front,tete)
|
45 |
|
|
/* le front est non vide */
|
46 |
|
|
while (front!=NULL) /* tant que le front n'est pas vide */
|
47 |
|
|
{
|
48 |
|
|
/* numero de l'element */
|
49 |
|
|
num = front->num ;
|
50 |
|
|
/* reperer les segments qui constituent l'element */
|
51 |
|
|
num1 = gest->tabele[3*num] ;
|
52 |
|
|
num2 = gest->tabele[3*num+1] ;
|
53 |
|
|
num3 = gest->tabele[3*num+2] ;
|
54 |
|
|
|
55 |
|
|
vec_ele[0] = UNKNOWN ;
|
56 |
|
|
vec_ele[1] = UNKNOWN ;
|
57 |
|
|
vec_ele[2] = UNKNOWN ;
|
58 |
|
|
|
59 |
|
|
/* premier segment */
|
60 |
|
|
n1 = min(num1,num2) ;
|
61 |
|
|
n2 = max(num1,num2) ;
|
62 |
|
|
/* chercher l'element different de num connecte au segment n1,n2 */
|
63 |
|
|
seg = gest->tab_seg[n1] ;
|
64 |
|
|
gtrouve=FAUX ;
|
65 |
|
|
while ((seg!=NULL)&&(gtrouve==FAUX))
|
66 |
|
|
{
|
67 |
|
|
if ((seg->n2)==n2)
|
68 |
|
|
{
|
69 |
|
|
/* on a trouve le segment */
|
70 |
|
|
gtrouve==VRAI ;
|
71 |
|
|
/* la cardinalite du segment est egale a 2 */
|
72 |
|
|
if (seg->card == 2)
|
73 |
|
|
{
|
74 |
|
|
if (seg->tabele[0]!=num) vec_ele[0] = seg->tabele[0] ;
|
75 |
|
|
else vec_ele[0] = seg->tabele[1] ;
|
76 |
|
|
}
|
77 |
|
|
}
|
78 |
|
|
seg = seg->suivant ;
|
79 |
|
|
}
|
80 |
|
|
|
81 |
|
|
/* deuxieme segment */
|
82 |
|
|
n1 = min(num2,num3) ;
|
83 |
|
|
n2 = max(num2,num3) ;
|
84 |
|
|
/* chercher l'element different de num connecte au segment n1,n2 */
|
85 |
|
|
seg = gest->tab_seg[n1] ;
|
86 |
|
|
gtrouve=FAUX ;
|
87 |
|
|
while ((seg!=NULL)&&(gtrouve==FAUX))
|
88 |
|
|
{
|
89 |
|
|
if ((seg->n2)==n2)
|
90 |
|
|
{
|
91 |
|
|
/* on a trouve le segment */
|
92 |
|
|
gtrouve==VRAI ;
|
93 |
|
|
/* la cardinalite du segment est egale a 2 */
|
94 |
|
|
if (seg->card == 2)
|
95 |
|
|
{
|
96 |
|
|
if (seg->tabele[0]!=num) vec_ele[1] = seg->tabele[0] ;
|
97 |
|
|
else vec_ele[1] = seg->tabele[1] ;
|
98 |
|
|
}
|
99 |
|
|
}
|
100 |
|
|
seg=seg->suivant ;
|
101 |
|
|
}
|
102 |
|
|
|
103 |
|
|
/* troisieme segment */
|
104 |
|
|
n1 = min(num3,num1) ;
|
105 |
|
|
n2 = max(num3,num1) ;
|
106 |
|
|
/* chercher l'element different de num connecte au segment n1,n2 */
|
107 |
|
|
seg = gest->tab_seg[n1] ;
|
108 |
|
|
gtrouve=FAUX ;
|
109 |
|
|
|
110 |
|
|
while ((seg!=NULL)&&(gtrouve==FAUX))
|
111 |
|
|
{
|
112 |
|
|
if ((seg->n2)==n2)
|
113 |
|
|
{
|
114 |
|
|
/* on a trouve le segment */
|
115 |
|
|
gtrouve==VRAI ;
|
116 |
|
|
/* la cardinalite du segment est egale a 2 */
|
117 |
|
|
if (seg->card == 2)
|
118 |
|
|
{
|
119 |
|
|
if (seg->tabele[0]!=num) vec_ele[2] = seg->tabele[0] ;
|
120 |
|
|
else vec_ele[2] = seg->tabele[1] ;
|
121 |
|
|
}
|
122 |
|
|
}
|
123 |
|
|
seg=seg->suivant ;
|
124 |
|
|
}
|
125 |
|
|
/* mise a jour du front */
|
126 |
|
|
/* suppression */
|
127 |
|
|
/* on supprime du front l'element de numero num */
|
128 |
|
|
tete->mark = gest->nb_surf ;
|
129 |
|
|
tete = front->suivant ;
|
130 |
|
|
/* restitution */
|
131 |
|
|
front=tete ;/* on detruit la tete, le suivant devient la nouvelle tete */
|
132 |
|
|
/* insertion des elements voisins */
|
133 |
|
|
for (i=0;i<3;i++)
|
134 |
|
|
{
|
135 |
|
|
numele = vec_ele[i] ;
|
136 |
|
|
/* numero de l'element connecte au segment i*/
|
137 |
|
|
if (numele != UNKNOWN)
|
138 |
|
|
if ((gest->tab_ele[numele]).mark == 0)
|
139 |
|
|
/* ne pas creer un element deja sur le front ou deja detruit afin de ne pas boucler */
|
140 |
|
|
{
|
141 |
|
|
/* creation d'un element */
|
142 |
|
|
tete = &(gest->tab_ele[numele]) ;
|
143 |
|
|
if (tete==NULL)
|
144 |
|
|
{
|
145 |
|
|
return(FAUX) ;
|
146 |
|
|
}
|
147 |
|
|
tete->mark = FRONT ;
|
148 |
|
|
INSERE_TETE(front,tete)
|
149 |
|
|
}
|
150 |
|
|
}
|
151 |
|
|
}
|
152 |
|
|
}
|
153 |
|
|
}
|
154 |
|
|
if (debug) printf(" nombre de surfaces : %d\n",gest->nb_surf) ;
|
155 |
|
|
return(VRAI) ;
|
156 |
|
|
}
|