1 |
francois |
283 |
|
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 |
|
|
} |