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

# Content
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 }