ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/acismesh/m3d_gest_front.cpp
Revision: 1
Committed: Mon Jun 11 22:53:07 2007 UTC (17 years, 11 months ago)
File size: 11332 byte(s)
Log Message:

File Contents

# Content
1 /*****************************************************************
2
3 m3d_gest_front Type:Func
4
5 Progression du front 3D
6
7 Date de creation : 5-3-1999 15 :34 :45
8 Derniere version : 5-3-1999 15 :34 :45
9
10 Vincent FRANCOIS
11
12 *****************************************************************/
13
14
15
16
17
18 /**************************/
19 /* include */
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <math.h>
24 #include "const.h"
25 #include "memoire.h"
26 #include "struct.h"
27 #include "struct3d.h"
28 #include "prototype.h"
29
30
31 /**************************/
32 /* variables globales */
33 extern struct environnment env;
34 extern struct s_mesh *mesh;
35
36 extern int test_front(void);
37
38 /**************************/
39 /* programme principal */
40
41
42 void m3d_gest_front(void)
43 {
44 struct cas_front cas[100];
45 int nb_cas;
46 int liste_cas[8][100];
47 int nb_liste_cas[8];
48 int num;
49 int temps;
50 int eletmp;
51 int i,type;
52 int solution;
53 float angle;
54 struct s_noeud *no,*notmp;
55 struct s_segment *seg;
56 struct s_front3d *ft,*fttmp;
57 char message[255];
58
59 temps=mesh->nb_front3d;
60 sprintf(message,ETATFR3D,temps);
61 aff_text(message);
62 int compteur=0;
63 do
64 {
65 compteur++;
66 voir();
67 /* selection de l element de front */
68 num=0;
69 while ((mesh->tete_front3d[num]==NULL) && (num<11)) num++;
70 if (num>10)
71 {
72 if (mesh->tete_front3d[ATTENTE]==NULL)
73 {
74 ft=NULL;
75 continue;
76 }
77 else
78 {
79 ft=mesh->tete_front3d[11];
80 while (ft!=NULL)
81 {
82 fttmp=ft->suivant;
83 m3d_ord_front(ft,NONFORCE);
84 ft=fttmp;
85 }
86 mesh->tete_front3d[ATTENTE]=NULL;
87 mesh->queue_front3d[ATTENTE]=NULL;
88 sprintf(message,ETATFR3D,mesh->nb_front3d);
89 aff_text(message);
90 num=0;
91 while ((mesh->tete_front3d[num]==NULL) && (num<11)) num++;
92 ft=mesh->tete_front3d[num];
93 m3d_enreg(0);
94 m3d_enreg(2);
95 }
96 }
97 else ft=mesh->tete_front3d[num];
98 /* pour debug */
99 /* if (test_front()==1)
100 {
101 m3d_enreg(0);
102 m3d_enreg(2);
103 }*/
104
105 if ((mesh->nb_tetra==2725)||(mesh->nb_tetra==16173))
106 {
107 m3d_enreg(0);
108 m3d_enreg(2);
109 }
110
111 /* recherche des cas de front */
112 nb_cas=0;
113 /* adjacence */
114 fttmp=ft->voisin[0].ft;
115 if ((fttmp->n1!=ft->n1) && (fttmp->n1!=ft->n2)) eletmp=fttmp->n1;
116 else if ((fttmp->n2!=ft->n1) && (fttmp->n2!=ft->n2)) eletmp=fttmp->n2;
117 else if ((fttmp->n3!=ft->n1) && (fttmp->n3!=ft->n2)) eletmp=fttmp->n3;
118 m3d_insere_cas(ADJACENT,eletmp,0,ft->voisin[0].angle,&nb_cas,cas);
119 fttmp=ft->voisin[1].ft;
120 if ((fttmp->n1!=ft->n1) && (fttmp->n1!=ft->n3)) eletmp=fttmp->n1;
121 else if ((fttmp->n2!=ft->n1) && (fttmp->n2!=ft->n3)) eletmp=fttmp->n2;
122 else if ((fttmp->n3!=ft->n1) && (fttmp->n3!=ft->n3)) eletmp=fttmp->n3;
123 m3d_insere_cas(ADJACENT,eletmp,1,ft->voisin[1].angle,&nb_cas,cas);
124 fttmp=ft->voisin[2].ft;
125 if ((fttmp->n1!=ft->n2) && (fttmp->n1!=ft->n3)) eletmp=fttmp->n1;
126 else if ((fttmp->n2!=ft->n2) && (fttmp->n2!=ft->n3)) eletmp=fttmp->n2;
127 else if ((fttmp->n3!=ft->n2) && (fttmp->n3!=ft->n3)) eletmp=fttmp->n3;
128 m3d_insere_cas(ADJACENT,eletmp,2,ft->voisin[2].angle,&nb_cas,cas);
129 /* lie */
130 no=ADRESSE(ft->n1,noeud,mesh->);
131 for (i=0;i<no->nb_segment;i++)
132 {
133 seg=no->segment[i];
134 if (seg->n1==no->num) eletmp=seg->n2; else eletmp=seg->n1;
135 notmp=ADRESSE(eletmp,noeud,mesh->);
136 if (notmp->etat==ACTIF)
137 if (eletmp!=ft->n2)
138 if (eletmp!=ft->n3)
139 {
140 angle=m3d_angle_front2(ft,seg);
141 m3d_insere_cas(LIE,eletmp,0,angle,&nb_cas,cas);
142 }
143 }
144 no=ADRESSE(ft->n2,noeud,mesh->);
145 for (i=0;i<no->nb_segment;i++)
146 {
147 seg=no->segment[i];
148 if (seg->n1==no->num) eletmp=seg->n2; else eletmp=seg->n1;
149 notmp=ADRESSE(eletmp,noeud,mesh->);
150 if (notmp->etat==ACTIF)
151 if (eletmp!=ft->n1)
152 if (eletmp!=ft->n3)
153 {
154 angle=m3d_angle_front2(ft,seg);
155 m3d_insere_cas(LIE,eletmp,1,angle,&nb_cas,cas);
156 }
157 }
158 no=ADRESSE(ft->n3,noeud,mesh->);
159 for (i=0;i<no->nb_segment;i++)
160 {
161 seg=no->segment[i];
162 if (seg->n1==no->num) eletmp=seg->n2; else eletmp=seg->n1;
163 notmp=ADRESSE(eletmp,noeud,mesh->);
164 if (notmp->etat==ACTIF)
165 if (eletmp!=ft->n1)
166 if (eletmp!=ft->n2)
167 {
168 angle=m3d_angle_front2(ft,seg);
169 m3d_insere_cas(LIE,eletmp,2,angle,&nb_cas,cas);
170 }
171
172 }
173 /* classement des cas de front */
174 nb_liste_cas[ADJACENT3]=0;
175 nb_liste_cas[ADJACENT2]=0;
176 nb_liste_cas[ADJACENT1]=0;
177 nb_liste_cas[LIE1]=0;
178 nb_liste_cas[LIE2]=0;
179 nb_liste_cas[LIE3]=0;
180 nb_liste_cas[GENERAL]=0;
181 nb_liste_cas[AUTRECAS]=0;
182 liste_cas[GENERAL][nb_liste_cas[GENERAL]++]=(-1); /* insersion du cas general */
183 for (i=0;i<nb_cas;i++)
184 {
185 if ((cas[i].type==ADJACENT)&&(cas[i].degre==3))
186 {
187 cas[i].type=ADJACENT3;
188 angle=4.*PI;
189 if (cas[i].liaison[0]==1) MINI(angle,angle,cas[i].angle[0]);
190 if (cas[i].liaison[1]==1) MINI(angle,angle,cas[i].angle[1]);
191 if (cas[i].liaison[2]==1) MINI(angle,angle,cas[i].angle[2]);
192 if (angle<PI) liste_cas[ADJACENT3][nb_liste_cas[ADJACENT3]++]=i;
193 }
194 if ((cas[i].type==ADJACENT)&&(cas[i].degre==2))
195 {
196 cas[i].type=ADJACENT2;
197 angle=4.*PI;
198 if (cas[i].liaison[0]==1) MINI(angle,angle,cas[i].angle[0]);
199 if (cas[i].liaison[1]==1) MINI(angle,angle,cas[i].angle[1]);
200 if (cas[i].liaison[2]==1) MINI(angle,angle,cas[i].angle[2]);
201 if (angle<PI) liste_cas[ADJACENT2][nb_liste_cas[ADJACENT2]++]=i;
202 }
203 if ((cas[i].type==ADJACENT)&&(cas[i].degre==1))
204 {
205 cas[i].type=ADJACENT1;
206 if (cas[i].liaison[0]==1) angle=cas[i].angle[0];
207 if (cas[i].liaison[1]==1) angle=cas[i].angle[1];
208 if (cas[i].liaison[2]==1) angle=cas[i].angle[2];
209 if (angle<1.396263401) liste_cas[ADJACENT1][nb_liste_cas[ADJACENT1]++]=i;
210 else liste_cas[AUTRECAS][nb_liste_cas[AUTRECAS]++]=i;
211 }
212 if ((cas[i].type==LIE)&&(cas[i].degre==3))
213 {
214 angle=4.*PI;
215 if (cas[i].liaison[0]==1) MINI(angle,angle,cas[i].angle[0]);
216 if (cas[i].liaison[1]==1) MINI(angle,angle,cas[i].angle[1]);
217 if (cas[i].liaison[2]==1) MINI(angle,angle,cas[i].angle[2]);
218 cas[i].type=LIE3;
219 if (angle<PI) liste_cas[LIE3][nb_liste_cas[LIE3]++]=i;
220 }
221 if ((cas[i].type==LIE)&&(cas[i].degre==2))
222 {
223 angle=4*PI;
224 cas[i].type=LIE2;
225 if (cas[i].liaison[0]==1) MINI(angle,angle,cas[i].angle[0]);
226 if (cas[i].liaison[1]==1) MINI(angle,angle,cas[i].angle[1]);
227 if (cas[i].liaison[2]==1) MINI(angle,angle,cas[i].angle[2]);
228 if (angle<1.396263401) liste_cas[LIE2][nb_liste_cas[LIE2]++]=i;
229 else liste_cas[AUTRECAS][nb_liste_cas[AUTRECAS]++]=i;
230 }
231 if ((cas[i].type==LIE)&&(cas[i].degre==1))
232 {
233 cas[i].type=LIE1;
234 if (cas[i].liaison[0]==1) angle=cas[i].angle[0];
235 if (cas[i].liaison[1]==1) angle=cas[i].angle[1];
236 if (cas[i].liaison[2]==1) angle=cas[i].angle[2];
237 if (angle<1.396263401) liste_cas[LIE1][nb_liste_cas[LIE1]++]=i;
238 else liste_cas[AUTRECAS][nb_liste_cas[AUTRECAS]++]=i;
239 }
240
241 }
242
243 /* traitement des cas en respectant les priorites */
244 solution=PASTROUVE;
245 if ((nb_liste_cas[ADJACENT3]>0)&&(solution==PASTROUVE)) solution=m3d_traite_front(ADJACENT3,ft,cas,nb_cas,liste_cas[ADJACENT3],nb_liste_cas[ADJACENT3]);
246 if ((nb_liste_cas[ADJACENT2]>0)&&(solution==PASTROUVE)) solution=m3d_traite_front(ADJACENT2,ft,cas,nb_cas,liste_cas[ADJACENT2],nb_liste_cas[ADJACENT2]);
247 if ((nb_liste_cas[ADJACENT1]>0)&&(solution==PASTROUVE)) solution=m3d_traite_front(ADJACENT1,ft,cas,nb_cas,liste_cas[ADJACENT1],nb_liste_cas[ADJACENT1]);
248 if ((nb_liste_cas[LIE3]>0)&&(solution==PASTROUVE)) solution=m3d_traite_front(LIE3,ft,cas,nb_cas,liste_cas[LIE3],nb_liste_cas[LIE3]);
249 if ((nb_liste_cas[LIE2]>0)&&(solution==PASTROUVE)) solution=m3d_traite_front(LIE2,ft,cas,nb_cas,liste_cas[LIE2],nb_liste_cas[LIE2]);
250 if ((nb_liste_cas[LIE1]>0)&&(solution==PASTROUVE)) solution=m3d_traite_front(LIE1,ft,cas,nb_cas,liste_cas[LIE1],nb_liste_cas[LIE1]);
251 if ((nb_liste_cas[GENERAL]>0)&&(solution==PASTROUVE))
252 {
253 //do
254 {
255 solution=m3d_traite_front(GENERAL,ft,cas,nb_cas,liste_cas[GENERAL],nb_liste_cas[GENERAL]);
256 //ft->etat=ft->etat+1;
257 }
258 //while ((solution==PASTROUVE)&&(ft->etat%8!=1));
259
260 if (!((solution==PASTROUVE)||(solution==TROUVE)))
261 {
262 type=cas[solution].type;
263 nb_liste_cas[type]=1;
264 liste_cas[type][0]=solution;
265 solution=m3d_traite_front(type,ft,cas,nb_cas,liste_cas[type],nb_liste_cas[type]);
266 }
267 }
268 /* on essai toutes les solutions */
269 /* if (solution==PASTROUVE)
270 for (i=0;i<nb_liste_cas[AUTRECAS];i++)
271 {
272 if (cas[liste_cas[AUTRECAS][i]].traite!=TRAITE)
273 {
274 angle=4*PI;
275 if (cas[liste_cas[AUTRECAS][i]].liaison[0]==1) MINI(angle,angle,cas[liste_cas[AUTRECAS][i]].angle[0]);
276 if (cas[liste_cas[AUTRECAS][i]].liaison[1]==1) MINI(angle,angle,cas[liste_cas[AUTRECAS][i]].angle[1]);
277 if (cas[liste_cas[AUTRECAS][i]].liaison[2]==1) MINI(angle,angle,cas[liste_cas[AUTRECAS][i]].angle[2]);
278 if (angle <(0.975*PI))
279 {
280 liste_cas[AUTRECAS][0]=liste_cas[AUTRECAS][i];
281 type=cas[liste_cas[AUTRECAS][0]].type;
282 solution=m3d_traite_front(type,ft,cas,nb_cas,liste_cas[AUTRECAS],1);
283 if (solution==TROUVE) break;
284 }
285 }
286 } */
287
288 if (solution==PASTROUVE) /* pas de solution */
289 {
290 ft->etat=ft->etat+1;
291 mesh->tete_front3d[ft->type]=ft->suivant;
292 if (mesh->tete_front3d[ft->type]!=NULL) mesh->tete_front3d[ft->type]->precedent=NULL;
293 else mesh->queue_front3d[ft->type]=NULL;
294 m3d_ord_front(ft,ft->type+1);
295 }
296 }
297 while (ft!=NULL);
298
299
300 m3d_enreg(0);
301
302
303
304 }