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

File Contents

# Content
1 /*****************************************************************
2
3 m3d_traite_front.cpp Type:Func
4
5 Traitement des cas de front
6
7 Date de creation : 11-3-1999 11 :40 :5
8 Derniere version : 11-3-1999 11 :40 :5
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
37 struct tri_front
38 {
39 int num;
40 int crit;
41 struct tri_front *suivant;
42 };
43
44 /**************************/
45 /* programme principal */
46
47 int m3d_traite_front(int type,struct s_front3d *ft,struct cas_front *cas,int nb_cas,int *liste_cas,int nb_liste_cas)
48 {
49 int i,j,sol,ierr,listsol[50];
50 int numcas,fin,mode;
51 struct s_noeud *no;
52 struct tri_front *tete,liste_front[50],*pointeur,*pointeurprec;
53 struct s_front3d *ft1,*ft2,*ft3,*ftn1,*ftn2,*ftn3,*ftbase;
54 struct s_tetra *tet;
55 //struct s_triangle *tri1,*tri2;
56 float qualsol[50];
57 int iordre [50];
58 int nb_inter;
59 struct s_front3d *list_inter[50];
60 int neww,neww2;
61
62 switch (type)
63 {
64 case ADJACENT3 : numcas=liste_cas[nb_liste_cas-1];
65 sol=cas[numcas].num;
66 ierr=m3d_i_tetra(&tet,ft,sol,EXISTE,list_inter,&nb_inter);
67 if (ierr==VALIDE)
68 {
69 strcpy(tet->front,"ADJACENT3");
70 ft1=ft->voisin[0].ft;
71 ft2=ft->voisin[1].ft;
72 ft3=ft->voisin[2].ft;
73 m3d_ac_front(&ft,DETRUIT);
74 m3d_ac_front(&ft1,DETRUIT);
75 m3d_ac_front(&ft2,DETRUIT);
76 m3d_ac_front(&ft3,DETRUIT);
77 }
78 cas[numcas].traite=TRAITE;
79 break;
80 case ADJACENT2 : numcas=liste_cas[nb_liste_cas-1];
81 sol=cas[numcas].num;
82 ierr=m3d_i_tetra(&tet,ft,sol,EXISTE,list_inter,&nb_inter);
83 if (ierr==VALIDE)
84 {
85 strcpy(tet->front,"ADJACENT2");
86 if (cas[numcas].liaison[0]==0)
87 {
88 ft1=ft->voisin[1].ft;
89 ft2=ft->voisin[2].ft;
90 ft3=ft->voisin[0].ft;
91 neww=NEW1;
92 }
93 if (cas[numcas].liaison[1]==0)
94 {
95 ft1=ft->voisin[0].ft;
96 ft2=ft->voisin[2].ft;
97 ft3=ft->voisin[1].ft;
98 neww=NEW3;
99 }
100 if (cas[numcas].liaison[2]==0)
101 {
102 ft1=ft->voisin[0].ft;
103 ft2=ft->voisin[1].ft;
104 ft3=ft->voisin[2].ft;
105 neww=NEW2;
106 }
107 m3d_ac_front(&ft,DETRUIT);
108 m3d_ac_front(&ft1,DETRUIT);
109 m3d_ac_front(&ft2,DETRUIT);
110 m3d_update_front(&ftn1,NULL,tet,neww);
111 m3d_update_front(&ft3,NULL,NULL,LIAISON);
112 m3d_update_front(&ftn1,NULL,NULL,LIAISON);
113 m3d_update_front(&(ftn1->voisin[0].ft),NULL,NULL,LIAISON);
114 m3d_update_front(&(ftn1->voisin[1].ft),NULL,NULL,LIAISON);
115 m3d_update_front(&(ftn1->voisin[2].ft),NULL,NULL,LIAISON);
116 }
117 cas[numcas].traite=TRAITE;
118 break;
119 case ADJACENT1 : /* tri des differentes solution */
120 for (i=0;i<nb_liste_cas;i++)
121 {
122 liste_front[i].num=liste_cas[i];
123 sol=cas[liste_front[i].num].num;
124 liste_front[i].crit=m3d_cal_qual(ft->n1,ft->n2,ft->n3,sol);
125 if (i==0)
126 {
127 tete=&(liste_front[0]);
128 liste_front[0].suivant=NULL;
129 }
130 else
131 {
132 pointeurprec=NULL;
133 pointeur=tete;
134 fin=0;
135 do
136 {
137 if (pointeur->crit>liste_front[i].crit)
138 {
139 if (pointeurprec!=NULL) pointeurprec->suivant=&(liste_front[i]);
140 else tete=&(liste_front[i]);
141 liste_front[i].suivant=pointeur;
142 }
143 pointeurprec=pointeur;
144 pointeur=pointeur->suivant;
145 if (pointeur==NULL)
146 {
147 fin=1;
148 pointeurprec->suivant=&(liste_front[i]);
149 liste_front[i].suivant=NULL;
150 }
151 }
152 while (fin==0);
153 }
154 }
155 /* solution */
156 pointeur=tete;
157 fin=0;
158 while (fin==0)
159 {
160 numcas=pointeur->num;
161 sol=cas[numcas].num;
162 ierr=m3d_i_tetra(&tet,ft,sol,EXISTE,list_inter,&nb_inter);
163 cas[numcas].traite=TRAITE;
164 if (ierr==VALIDE) fin=1;
165 pointeur=pointeur->suivant;
166 if ((fin==0)&&(pointeur==NULL)) return(PASTROUVE);
167 }
168 strcpy(tet->front,"ADJACENT1");
169 if (cas[numcas].liaison[0]==1)
170 {
171 ft1=ft->voisin[0].ft;
172 ft2=ft->voisin[1].ft;
173 ft3=ft->voisin[2].ft;
174 neww=NEW2;
175 neww2=NEW3;
176 }
177 if (cas[numcas].liaison[1]==1)
178 {
179 ft1=ft->voisin[1].ft;
180 ft2=ft->voisin[0].ft;
181 ft3=ft->voisin[2].ft;
182 neww=NEW1;
183 neww2=NEW2;
184 }
185 if (cas[numcas].liaison[2]==1)
186 {
187 ft1=ft->voisin[2].ft;
188 ft2=ft->voisin[0].ft;
189 ft3=ft->voisin[1].ft;
190 neww=NEW1;
191 neww2=NEW3;
192 }
193 m3d_ac_front(&ft,DETRUIT);
194 m3d_ac_front(&ft1,DETRUIT);
195 m3d_update_front(&ftn1,NULL,tet,neww);
196 m3d_update_front(&ftn2,NULL,tet,neww2);
197 m3d_update_front(&ft2,NULL,NULL,LIAISON);
198 m3d_update_front(&ft3,NULL,NULL,LIAISON);
199 m3d_update_front(&ftn1,NULL,NULL,LIAISON);
200 m3d_update_front(&ftn2,NULL,NULL,LIAISON);
201 m3d_update_front(&(ftn1->voisin[0].ft),NULL,NULL,LIAISON);
202 m3d_update_front(&(ftn1->voisin[1].ft),NULL,NULL,LIAISON);
203 m3d_update_front(&(ftn1->voisin[2].ft),NULL,NULL,LIAISON);
204 m3d_update_front(&(ftn2->voisin[0].ft),NULL,NULL,LIAISON);
205 m3d_update_front(&(ftn2->voisin[1].ft),NULL,NULL,LIAISON);
206 m3d_update_front(&(ftn2->voisin[2].ft),NULL,NULL,LIAISON);
207 return(TROUVE);
208 case LIE3 :
209 case LIE2 :
210 case LIE1 :/* tri des differentes solution */
211 for (i=0;i<nb_liste_cas;i++)
212 {
213 liste_front[i].num=liste_cas[i];
214 sol=cas[liste_front[i].num].num;
215 liste_front[i].crit=m3d_cal_qual(ft->n1,ft->n2,ft->n3,sol);
216 if (i==0)
217 {
218 tete=&(liste_front[0]);
219 liste_front[0].suivant=NULL;
220 }
221 else
222 {
223 pointeurprec=NULL;
224 pointeur=tete;
225 fin=0;
226 do
227 {
228 if (pointeur->crit>liste_front[i].crit)
229 {
230 if (pointeurprec!=NULL) pointeurprec->suivant=&(liste_front[i]);
231 else tete=&(liste_front[i]);
232 liste_front[i].suivant=pointeur;
233 }
234 pointeurprec=pointeur;
235 pointeur=pointeur->suivant;
236 if (pointeur==NULL)
237 {
238 fin=1;
239 pointeurprec->suivant=&(liste_front[i]);
240 liste_front[i].suivant=NULL;
241 }
242 }
243 while (fin==0);
244 }
245 }
246 /* solution */
247 pointeur=tete;
248 fin=0;
249 while (fin==0)
250 {
251 numcas=pointeur->num;
252 sol=cas[numcas].num;
253 ierr=m3d_i_tetra(&tet,ft,sol,EXISTE,list_inter,&nb_inter);
254 cas[numcas].traite=TRAITE;
255 if (ierr==VALIDE) fin=1;
256 pointeur=pointeur->suivant;
257 if ((fin==0)&&(pointeur==NULL)) return(PASTROUVE);
258 }
259 strcpy(tet->front,"LIE");
260 ft1=ft->voisin[0].ft;
261 ft2=ft->voisin[1].ft;
262 ft3=ft->voisin[2].ft;
263 m3d_ac_front(&ft,DETRUIT);
264 m3d_update_front(&ftn1,NULL,tet,NEW1);
265 m3d_update_front(&ftn2,NULL,tet,NEW2);
266 m3d_update_front(&ftn3,NULL,tet,NEW3);
267 m3d_update_front(&ft1,NULL,NULL,LIAISON);
268 m3d_update_front(&ft2,NULL,NULL,LIAISON);
269 m3d_update_front(&ft3,NULL,NULL,LIAISON);
270 m3d_update_front(&ftn1,NULL,NULL,LIAISON);
271 m3d_update_front(&ftn2,NULL,NULL,LIAISON);
272 m3d_update_front(&ftn3,NULL,NULL,LIAISON);
273 m3d_update_front(&(ftn1->voisin[0].ft),NULL,NULL,LIAISON);
274 m3d_update_front(&(ftn1->voisin[1].ft),NULL,NULL,LIAISON);
275 m3d_update_front(&(ftn1->voisin[2].ft),NULL,NULL,LIAISON);
276 m3d_update_front(&(ftn2->voisin[0].ft),NULL,NULL,LIAISON);
277 m3d_update_front(&(ftn2->voisin[1].ft),NULL,NULL,LIAISON);
278 m3d_update_front(&(ftn2->voisin[2].ft),NULL,NULL,LIAISON);
279 m3d_update_front(&(ftn3->voisin[0].ft),NULL,NULL,LIAISON);
280 m3d_update_front(&(ftn3->voisin[1].ft),NULL,NULL,LIAISON);
281 m3d_update_front(&(ftn3->voisin[2].ft),NULL,NULL,LIAISON);
282 return(TROUVE);
283 case GENERAL : mode=m3d_gen_noe(ft,listsol,CREATION);
284 if (mode==CREATION) sol=listsol[0];
285 if (mode==EXISTE)
286 {
287 sol=listsol[0];
288 for (i=0;i<nb_cas;i++)
289 if (sol==cas[i].num)
290 if (cas[i].traite==PASTRAITE) return(i);
291 else return(PASTROUVE);
292 }
293 if (mode==MULTIEXISTE)
294 {
295 for (i=1;i<=listsol[0];i++)
296 {
297 for (j=0;j<nb_cas;j++)
298 {
299 if (listsol[i]==cas[j].num)
300 {
301 listsol[i]=-1;
302 qualsol[i]=100.;
303 }
304 }
305 if (listsol[i]>0) qualsol[i]=m3d_cal_qual(ft->n1,ft->n2,ft->n3,listsol[i]);
306 iordre[i-1]=i;
307 }
308 trirea(qualsol+1,&(listsol[0]),iordre);
309 ierr=NONVALIDE;
310 nb_inter=0;
311 for (i=1;i<=listsol[0];i++)
312 {
313 if ((ierr==NONVALIDE)&&(listsol[iordre[listsol[0]-i]]!=-1))
314 {
315 ierr=m3d_i_tetra(&tet,ft,listsol[iordre[listsol[0]-i]],mode,list_inter,&nb_inter);
316 if (ierr==NONVALIDE)
317 {
318 ierr=m3d_traite_destruction(ft,list_inter,nb_inter);
319 no=ADRESSE(listsol[iordre[listsol[0]-i]],noeud,mesh->);
320 if (no->etat!=ACTIF) no->etat=ACTIF;
321 if (ierr==VALIDE) ierr=m3d_i_tetra(&tet,ft,listsol[iordre[listsol[0]-i]],mode,list_inter,&nb_inter);
322 }
323 sol=listsol[iordre[listsol[0]-i]];
324 }
325 }
326 }
327 else ierr=m3d_i_tetra(&tet,ft,sol,mode,list_inter,&nb_inter);
328 if ((ierr==NONVALIDE) && (nb_inter>0))
329 {
330 ierr=m3d_traite_destruction(ft,list_inter,nb_inter);
331 no=ADRESSE(sol,noeud,mesh->);
332 if (no->etat!=ACTIF) no->etat=ACTIF;
333 if (ierr==VALIDE) ierr=m3d_i_tetra(&tet,ft,sol,mode,list_inter,&nb_inter);
334 }
335 if (ierr==VALIDE)
336 {
337 strcpy(tet->front,"GENERAL");
338 ft1=ft->voisin[0].ft;
339 ft2=ft->voisin[1].ft;
340 ft3=ft->voisin[2].ft;
341 ftbase=ft;
342 if (mode==CREATION) m3d_gen_noe(ft,&sol,UPDATE);
343 m3d_ac_front(&ft,DETRUIT);
344 m3d_update_front(&ftn1,NULL,tet,NEW1);
345 m3d_update_front(&ftn2,NULL,tet,NEW2);
346 m3d_update_front(&ftn3,NULL,tet,NEW3);
347 m3d_update_front(&ftn1,NULL,NULL,LIAISON);
348 m3d_update_front(&ftn2,NULL,NULL,LIAISON);
349 m3d_update_front(&ftn3,NULL,NULL,LIAISON);
350 m3d_update_front(&ft1,NULL,NULL,LIAISON);
351 m3d_update_front(&ft2,NULL,NULL,LIAISON);
352 m3d_update_front(&ft3,NULL,NULL,LIAISON);
353 m3d_update_front(&(ftn1->voisin[0].ft),NULL,NULL,LIAISON);
354 m3d_update_front(&(ftn1->voisin[1].ft),NULL,NULL,LIAISON);
355 m3d_update_front(&(ftn1->voisin[2].ft),NULL,NULL,LIAISON);
356 m3d_update_front(&(ftn2->voisin[0].ft),NULL,NULL,LIAISON);
357 m3d_update_front(&(ftn2->voisin[1].ft),NULL,NULL,LIAISON);
358 m3d_update_front(&(ftn2->voisin[2].ft),NULL,NULL,LIAISON);
359 m3d_update_front(&(ftn3->voisin[0].ft),NULL,NULL,LIAISON);
360 m3d_update_front(&(ftn3->voisin[1].ft),NULL,NULL,LIAISON);
361 m3d_update_front(&(ftn3->voisin[2].ft),NULL,NULL,LIAISON);
362 }
363 else
364 {
365 if (mode==CREATION) mesh->nb_noeud=mesh->nb_noeud-1;
366 return(PASTROUVE);
367 }
368 break;
369 }
370 if (ierr==NONVALIDE) return(PASTROUVE);
371 return(TROUVE);
372 }