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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     m2d_gest_front.c Type:Func
4    
5     Gestion du front
6    
7     Date de creation : Wed Feb 5 17:24:21 1997
8    
9     Derniere version : Wed May 7 15:32:19 1997
10    
11    
12    
13    
14     Vincent FRANCOIS
15    
16     *****************************************************************/
17    
18    
19    
20    
21    
22     /**************************/
23     /* include */
24     #include <stdio.h>
25     #include <string.h>
26     #include <stdlib.h>
27     #include <math.h>
28     #include "const.h"
29     #include "memoire.h"
30     #include "struct.h"
31     #include "prototype.h"
32    
33    
34     /**************************/
35     /* variables globales */
36     extern struct environnment env;
37     extern struct s_mesh *mesh;
38    
39    
40    
41     /**************************/
42     /* programme principal */
43    
44     void m2d_gest_front(struct s_face *face)
45     {
46     struct s_front *ft,*ftp,*fts,*ft2,*ftn;
47     struct s_noeud *nop,*no1,*no2,*nos;
48     struct s_segment *seg,*seg2,*segref;
49     int pass;
50     int traite,mode;
51     int np,n1,n2,ns,sol,solu;
52     int anglep,angles;
53     int ierr,ierr2,compteur;
54     float eps,crit11,crit12,crit21,crit22,crit1,crit2;
55     float pcp,pss,pcs,psp;
56     float nplan[4],n1n2[4],n[4],n2s[4],pn1[4];
57    
58    
59     compteur=0;
60     while (mesh->tete_front!=NULL)
61     {
62     voir();
63     compteur++;
64     ft=mesh->tete_front;
65     ftp=ft->prec;
66     fts=ft->suiv;
67     eps=0.0001*ft->seg->longueur;
68     np=ftp->n1;
69     n1=ft->n1;
70     n2=ft->n2;
71     ns=fts->n2;
72     nop=ADRESSE(np,noeud,mesh->);
73     no1=ADRESSE(n1,noeud,mesh->);
74     no2=ADRESSE(n2,noeud,mesh->);
75     nos=ADRESSE(ns,noeud,mesh->);
76     /* angle precedent et angle suivant */
77     VEC(n1n2,no1,no2);
78     VEC(n2s,no2,nos);
79     VEC(pn1,nop,no1);
80     NORME(n1n2);
81     NORME(n2s);
82     NORME(pn1);
83     eval_normal(face,nplan,no1->u,no1->v);
84     NORME(nplan);
85     PVEC(n,nplan,n1n2);
86     pcp=(-1)*PSCA(n1n2,pn1);
87     psp=(-1)*PSCA(n,pn1);
88     if ((pcp>=0.1786481777)&&(psp>eps)) anglep=1; else anglep=0;
89     eval_normal(face,nplan,no2->u,no2->v);
90     NORME(nplan);
91     PVEC(n,nplan,n1n2);
92     pcs=(-1.)*PSCA(n1n2,n2s);
93     pss=PSCA(n,n2s);
94     if ((pcs>=0.1786481777)&&(pss>eps)) angles=1; else angles=0;
95     traite=0;
96     pass=0;
97     while (traite<1)
98     {
99     if ( (ftp==fts->suiv) && (n1!=ns) && (n2!=np) ) /* front de 3 */
100     {
101     m2d_ac_front(&ftp,1);
102     m2d_ac_front(&ft,1);
103     m2d_ac_front(&fts,1);
104     m2d_i_triangle(face,n1,ns,n2,0);
105     traite=1;
106     }
107     if ( (ftp->prec==fts->suiv) && (traite==0) ) /* front de 4 */
108     {
109     if (m2d_int_triangle(np,n1,n2,ns)==1)
110     {
111     m2d_i_segment(face,&seg,n1,ns,FRONT);
112     m2d_i_triangle(face,n1,ns,n2,0);
113     m2d_i_triangle(face,np,ns,n1,0);
114     }
115     else if (m2d_int_triangle(np,n1,ns,n2)==1)
116     {
117     m2d_i_segment(face,&seg,n2,np,FRONT);
118     m2d_i_triangle(face,n1,np,n2,0);
119     m2d_i_triangle(face,np,ns,n2,0);
120     }
121     else if (m2d_int_triangle(np,n2,ns,n1)==1)
122     {
123     m2d_i_segment(face,&seg,n1,ns,FRONT);
124     m2d_i_triangle(face,n1,ns,n2,0);
125     m2d_i_triangle(face,np,ns,n1,0);
126     }
127     else if (m2d_int_triangle(n1,n2,ns,np)==1)
128     {
129     m2d_i_segment(face,&seg,n2,np,FRONT);
130     m2d_i_triangle(face,n1,np,n2,0);
131     m2d_i_triangle(face,np,ns,n2,0);
132     }
133     else
134     {
135     crit11=m2d_cal_qual(n1,n2,np);
136     crit12=m2d_cal_qual(np,n2,ns);
137     crit21=m2d_cal_qual(n1,n2,ns);
138     crit22=m2d_cal_qual(np,n1,ns);
139     MINI(crit1,crit11,crit12);
140     MINI(crit2,crit21,crit22);
141     if (crit1>crit2)
142     {
143     m2d_i_segment(face,&seg,np,n2,FRONT);
144     m2d_i_triangle(face,n1,np,n2,0);
145     m2d_i_triangle(face,np,ns,n2,0);
146     }
147     else
148     {
149     m2d_i_segment(face,&seg,n1,ns,FRONT);
150     m2d_i_triangle(face,n1,ns,n2,0);
151     m2d_i_triangle(face,np,ns,n1,0);
152     }
153     }
154     m2d_ac_front(&ft,1);
155     m2d_ac_front(&fts->suiv,1);
156     m2d_ac_front(&fts,1);
157     m2d_ac_front(&ftp,1);
158     traite=1;
159     }
160     if ( (anglep==1) && (angles==1) && (traite==0) ) /* referme une cavite */
161     {
162     crit11=m2d_cal_qual(n1,n2,np);
163     crit12=m2d_cal_qual(np,n2,ns);
164     crit21=m2d_cal_qual(n1,n2,ns);
165     crit22=m2d_cal_qual(np,n1,ns);
166     MINI(crit1,crit11,crit12);
167     MINI(crit2,crit21,crit22);
168     ierr=m2d_i_segment(face,&seg,np,ns,TOUS);
169     if (ierr==1)
170     {
171     if (crit1>crit2)
172     {
173     ierr=m2d_i_segment(face,&segref,np,n2,FRONT);
174     solu=1;
175     }
176     else
177     {
178     ierr=m2d_i_segment(face,&segref,n1,ns,FRONT);
179     solu=2;
180     }
181     if (ierr==0)
182     if (crit1>crit2)
183     {
184     ierr=m2d_i_segment(face,&segref,n1,ns,FRONT);
185     solu=2;
186     }
187     else
188     {
189     ierr=m2d_i_segment(face,&segref,np,n2,FRONT);
190     solu=1;
191     }
192     if (ierr==0)
193     {
194     m2d_d_segment(&seg);
195     traite=(-1);
196     }
197     else
198     {
199     m2d_ac_front(&ft,1);
200     m2d_ac_front(&ft,2);
201     ft->n1=np;
202     ft->n2=ns;
203     ft->seg=seg;
204     ft->seg->front=ft->seg->front+1;
205     ft->prec=ftp->prec;
206     ft->suiv=fts->suiv;
207     ftp->prec->suiv=ft;
208     fts->suiv->prec=ft;
209     m2d_ac_front(&ftp,1);
210     m2d_ac_front(&fts,1);
211     m2d_ord_front(ft);
212     if (solu==1)
213     {
214     m2d_i_triangle(face,n1,np,n2,0);
215     m2d_i_triangle(face,np,ns,n2,0);
216     }
217     else
218     {
219     m2d_i_triangle(face,n1,ns,n2,0);
220     m2d_i_triangle(face,np,ns,n1,0);
221     }
222     traite=1;
223     }
224     }
225     else traite=(-1);
226     }
227     if ( (anglep==1) && (traite==0) ) /* referme precedent */
228     {
229     ierr=m2d_i_segment(face,&seg,np,n2,TOUS);
230     if (ierr==1)
231     {
232     m2d_ac_front(&ft,1);
233     m2d_ac_front(&ft,2);
234     ft->n1=np;
235     ft->n2=n2;
236     ft->seg=seg;
237     ft->seg->front=ft->seg->front+1;
238     ft->prec=ftp->prec;
239     ft->suiv=fts;
240     ftp->prec->suiv=ft;
241     fts->prec=ft;
242     m2d_ac_front(&ftp,1);
243     m2d_ord_front(ft);
244     m2d_i_triangle(face,n1,np,n2,0);
245     traite=1;
246     }
247     else traite=(-1);
248     }
249     if ( (angles==1) && (traite==0) ) /* referme suivant */
250     {
251     ierr=m2d_i_segment(face,&seg,n1,ns,TOUS);
252     if (ierr==1)
253     {
254     m2d_ac_front(&ft,1);
255     m2d_ac_front(&ft,2);
256     ft->n1=n1;
257     ft->n2=ns;
258     ft->seg=seg;
259     ft->seg->front++;
260     ft->suiv=fts->suiv;
261     ft->prec=ftp;
262     ftp->suiv=ft;
263     fts->suiv->prec=ft;
264     m2d_ac_front(&fts,1);
265     m2d_ord_front(ft);
266     m2d_i_triangle(face,n1,ns,n2,0);
267     traite=1;
268     }
269     else traite=(-1);
270     }
271     if ( (traite<1) && (pass==0) ) /* cas general */
272     {
273     mode=m2d_gen_noe(face,ft,&ft2,&sol);
274     if (mode==2)
275     {
276     if (sol==ns)
277     {
278     mode=0;
279     anglep=0;
280     angles=1;
281     pass=1;
282     traite=0;
283     }
284     if (sol==np)
285     {
286     mode=0;
287     anglep=1;
288     angles=0;
289     traite=0;
290     pass=1;
291     }
292     }
293     if (mode==1)
294     {
295     ierr=m2d_i_segment(face,&seg,n1,sol,FRONT);
296     ierr2=m2d_i_segment(face,&seg2,sol,n2,FRONT);
297     if ( (ierr==0) && (ierr2==0) )
298     {
299     mesh->nb_noeud--;
300     traite=(-1);
301     }
302     else if ( (ierr==0) && (ierr2!=0) )
303     {
304     traite=(-1);
305     m2d_d_segment(&seg2);
306     mesh->nb_noeud--;
307     }
308     else if ( (ierr!=0) && (ierr2==0) )
309     {
310     traite=(-1);
311     m2d_d_segment(&seg);
312     mesh->nb_noeud--;
313     }
314     else
315     {
316     m2d_ac_front(&ft,1);
317     m2d_ac_front(&ft,2);
318     m2d_ac_front(&ftn,2);
319     ft->n1=n1;
320     ft->n2=sol;
321     ft->seg=seg;
322     ft->seg->front++;
323     ftn->n1=sol;
324     ftn->n2=n2;
325     ftn->seg=seg2;
326     ftn->seg->front++;
327     ftp->suiv=ft;
328     ft->prec=ftp;
329     ft->suiv=ftn;
330     ftn->prec=ft;
331     ftn->suiv=fts;
332     fts->prec=ftn;
333     m2d_ord_front(ft);
334     m2d_ord_front(ftn);
335     m2d_i_triangle(face,n1,sol,n2,1);
336     qu_ins_obj(NOEUD,sol,mesh->root);
337     traite=1;
338     }
339     }
340     if (mode==2)
341     {
342     ierr=m2d_i_segment(face,&seg,n1,sol,FRONT);
343     ierr2=m2d_i_segment(face,&seg2,sol,n2,FRONT);
344     if ( (ierr==0) && (ierr2==0) ) traite=(-1);
345     else if ( (ierr==0) && (ierr2!=0) )
346     {
347     traite=(-1);
348     m2d_d_segment(&seg2);
349     }
350     else if ( (ierr!=0) && (ierr2==0) )
351     {
352     traite=(-1);
353     m2d_d_segment(&seg);
354     }
355     else
356     {
357     m2d_ac_front(&ft,1);
358     m2d_ac_front(&ft,2);
359     m2d_ac_front(&ftn,2);
360     ft->n1=n1;
361     ft->n2=sol;
362     ft->seg=seg;
363     ft->seg->front++;
364     ftn->n1=sol;
365     ftn->n2=n2;
366     ftn->seg=seg2;
367     ftn->seg->front++;
368     ftp->suiv=ft;
369     ft->prec=ftp;
370     ft->suiv=ft2;
371     ftn->prec=ft2->prec;
372     ftn->suiv=fts;
373     fts->prec=ftn;
374     ft2->prec->suiv=ftn;
375     ft2->prec=ft;
376     m2d_ord_front(ft);
377     m2d_ord_front(ftn);
378     m2d_i_triangle(face,n1,sol,n2,2);
379     traite=1;
380     }
381     }
382     }
383     if ( traite==(-1))
384     {
385     (ft->etat)++;
386     anglep=0;
387     angles=0;
388     mesh->tete_front=mesh->tete_front->suivant;
389     mesh->tete_front->precedent=NULL;
390     for (ft2=mesh->tete_front;ft2->suivant!=NULL;ft2=ft2->suivant);
391     ft2->suivant=ft;
392     ft->precedent=ft2;
393     ft->suivant=NULL;
394     traite=1;
395     }
396     }
397    
398     }
399    
400     }