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

# User Rev Content
1 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     }