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

File Contents

# Content
1 /*****************************************************************
2
3 o3d.cpp Type:Func
4
5 Optimisateur de maillage 3D
6
7 Date de creation : 16-4-1999 16 :18 :57
8 Derniere version : 16-4-1999 16 :18 :57
9
10 Vincent FRANCOIS
11
12 *****************************************************************/
13
14
15
16
17
18 /**************************/
19 /* include */
20 #include <stdio.h>
21 #include <math.h>
22 #include "const.h"
23 #include "memoire.h"
24 #include "struct.h"
25 #include "struct3d.h"
26 #include "prototype.h"
27
28 /**************************/
29 /* variables globales */
30 extern struct environnement env;
31 extern struct s_mesh *mesh;
32 int tab_solution[7][1430][8];
33 int tab_face[7][120][3];
34
35 extern int test_front(void);
36
37 /**************************/
38 /* programme principal */
39
40
41 void o3d(void)
42 {
43 int i,j;
44 int cas,num,fin,fin2;
45 struct s_tetra *tet,*tet1,*tmp,*tmp2;
46 struct s_noeud *no[4];
47 float coord[12];
48 float crit[6],crit_avant,crit_opt,nv_crit;
49 struct coquille coque[6];
50 float vec12[4],vec13[4],vec14[4],vec23[4],vec24[4],vec34[4];
51 float l1,l2,l3,l4,l5,l6;
52 int k;
53 int iordre[6];
54 float ordre_exec[6];
55 int nbclass;
56
57 for (i=0;i<mesh->nb_tetra;i++)
58 {
59 tet=ADRESSE(i,tetra,mesh->);
60 tet->opt=0;
61 }
62 o3d_data();
63 o3d_data2();
64 aff_text(M3D_OPTI1);
65 for (i=0;i<env.opti;i++)
66 {
67 fin=0;
68 while (fin==0)
69 {
70 voir();
71 tet=mesh->tete_tetra[i];
72 if (tet==NULL) {fin=1;fin2=1;} else fin2=0;
73 while (fin2==0)
74 {
75 if ((tet->opt!=0)||(tet->etat!=ACTIF))
76 {
77 tet=tet->suivant;
78 if (tet==NULL) {fin=1;fin2=1;}
79 }
80 else fin2=1;
81 }
82 if (fin==1) continue;
83 if (tet->etat!=ACTIF) continue;
84 /* premier essai bouge de point */
85 crit_avant=tet->crit;
86 crit[0]=-1.;
87 crit[1]=-1.;
88 crit[2]=-1.;
89 crit[3]=-1.;
90 no[0]=ADRESSE(tet->n1,noeud,mesh->);
91 no[1]=ADRESSE(tet->n2,noeud,mesh->);
92 no[2]=ADRESSE(tet->n3,noeud,mesh->);
93 no[3]=ADRESSE(tet->n4,noeud,mesh->);
94 o3d_move(no[0]->num,coord,crit);
95 o3d_move(no[1]->num,coord+3,crit+1);
96 o3d_move(no[2]->num,coord+6,crit+2);
97 o3d_move(no[3]->num,coord+9,crit+3);
98 MAXI(crit_opt,crit[0],crit[1]);
99 MAXI(crit_opt,crit_opt,crit[2]);
100 MAXI(crit_opt,crit_opt,crit[3]);
101 if (crit_opt>crit_avant)
102 {
103 if (crit_opt==crit[0]) num=0;
104 if (crit_opt==crit[1]) num=1;
105 if (crit_opt==crit[2]) num=2;
106 if (crit_opt==crit[3]) num=3;
107 no[num]->x=coord[3*num];
108 no[num]->y=coord[3*num+1];
109 no[num]->z=coord[3*num+2];
110 for (j=0;j<no[num]->nb_tetra;j++)
111 {
112 tet1=no[num]->tetra[j];
113 cas=(int)(tet1->crit*10.);
114 tet1->crit=m3d_cal_qual(tet1->n1,tet1->n2,tet1->n3,tet1->n4);
115 tmp=tet1->suivant;
116 tmp2=tet1->precedent;
117 if (tet1->precedent!=NULL) tet1->precedent->suivant=tmp;
118 else mesh->tete_tetra[cas]=tmp;
119 if (tet1->suivant!=NULL) tet1->suivant->precedent=tmp2;
120 else mesh->queue_tetra[cas]=tmp2;
121 tet1->precedent=NULL;
122 tet1->suivant=NULL;
123 m3d_ord_tet(tet1);
124 }
125 }
126 tet->opt=1;
127 MAXI(crit_opt,crit_opt,crit_avant);
128 /* deuxieme essai remaillage d'une coquille */
129 if (crit_opt<0.1*env.opti)
130 {
131 o3d_mail_coq(tet->n1,tet->n2,crit,coque);
132 o3d_mail_coq(tet->n1,tet->n3,crit+1,coque+1);
133 o3d_mail_coq(tet->n1,tet->n4,crit+2,coque+2);
134 o3d_mail_coq(tet->n2,tet->n3,crit+3,coque+3);
135 o3d_mail_coq(tet->n2,tet->n4,crit+4,coque+4);
136 o3d_mail_coq(tet->n3,tet->n4,crit+5,coque+5);
137 MAXI(nv_crit,crit[0],crit[1]);
138 MAXI(nv_crit,nv_crit,crit[2]);
139 MAXI(nv_crit,nv_crit,crit[3]);
140 MAXI(nv_crit,nv_crit,crit[4]);
141 MAXI(nv_crit,nv_crit,crit[5]);
142 if (nv_crit>crit_opt)
143 {
144 if (nv_crit==crit[0]) o3d_update_coq(coque);
145 else if (nv_crit==crit[1]) o3d_update_coq(coque+1);
146 else if (nv_crit==crit[2]) o3d_update_coq(coque+2);
147 else if (nv_crit==crit[3]) o3d_update_coq(coque+3);
148 else if (nv_crit==crit[4]) o3d_update_coq(coque+4);
149 else if (nv_crit==crit[5]) o3d_update_coq(coque+5);
150 }
151 /* troisieme essai suppression d une face */
152 /* troisieme essai suppression d une face */
153 else if (!o3d_inv_face(tet))
154 /* quatrieme essai suppression d un noeud et d une arete */
155 {
156 VEC(vec12,no[0],no[1]);
157 VEC(vec13,no[0],no[2]);
158 VEC(vec14,no[0],no[3]);
159 VEC(vec23,no[1],no[2]);
160 VEC(vec24,no[1],no[3]);
161 VEC(vec34,no[2],no[3]);
162 l1=PSCA(vec12,vec12);
163 l2=PSCA(vec13,vec13);
164 l3=PSCA(vec14,vec14);
165 l4=PSCA(vec23,vec23);
166 l5=PSCA(vec24,vec24);
167 l6=PSCA(vec34,vec34);
168 MINI(ordre_exec[0],l1,l2);
169 MINI(ordre_exec[0],ordre_exec[0],l3);
170 MINI(ordre_exec[1],l1,l4);
171 MINI(ordre_exec[1],ordre_exec[1],l5);
172 MINI(ordre_exec[2],l2,l4);
173 MINI(ordre_exec[2],ordre_exec[2],l6);
174 MINI(ordre_exec[3],l3,l5);
175 MINI(ordre_exec[3],ordre_exec[3],l6);
176 nbclass=4;
177 for (k=0;k<nbclass;k++) iordre[k]=k+1;
178 trirea(ordre_exec,&nbclass,iordre);
179 if (!o3d_deraffine(no[iordre[0]-1]))
180 if (!o3d_deraffine(no[iordre[1]-1]))
181 if (!o3d_deraffine(no[iordre[2]-1]))
182 o3d_deraffine(no[iordre[3]-1]);
183 }
184 }
185 }
186 }
187 aff_text(M3D_OPTI2);
188 for (i=env.opti-1;i>-1;i--)
189 {
190 fin=0;
191 while (fin==0)
192 {
193 voir();
194 tet=mesh->tete_tetra[i];
195 if (tet==NULL) {fin=1;fin2=1;} else fin2=0;
196 while (fin2==0)
197 {
198 if ((tet->opt==2) ||(tet->etat!=ACTIF))
199 {
200 tet=tet->suivant;
201 if (tet==NULL) {fin=1;fin2=1;}
202 }
203 else fin2=1;
204 }
205 if (fin==1) continue;
206 if (tet->etat!=ACTIF) continue;
207 crit_avant=tet->crit;
208 crit[0]=-1.;
209 crit[1]=-1.;
210 crit[2]=-1.;
211 crit[3]=-1.;
212 no[0]=ADRESSE(tet->n1,noeud,mesh->);
213 no[1]=ADRESSE(tet->n2,noeud,mesh->);
214 no[2]=ADRESSE(tet->n3,noeud,mesh->);
215 no[3]=ADRESSE(tet->n4,noeud,mesh->);
216 o3d_move(no[0]->num,coord,crit);
217 o3d_move(no[1]->num,coord+3,crit+1);
218 o3d_move(no[2]->num,coord+6,crit+2);
219 o3d_move(no[3]->num,coord+9,crit+3);
220 MAXI(crit_opt,crit[0],crit[1]);
221 MAXI(crit_opt,crit_opt,crit[2]);
222 MAXI(crit_opt,crit_opt,crit[3]);
223 if (crit_opt>crit_avant)
224 {
225 if (crit_opt==crit[0]) num=0;
226 if (crit_opt==crit[1]) num=1;
227 if (crit_opt==crit[2]) num=2;
228 if (crit_opt==crit[3]) num=3;
229 no[num]->x=coord[3*num];
230 no[num]->y=coord[3*num+1];
231 no[num]->z=coord[3*num+2];
232 for (j=0;j<no[num]->nb_tetra;j++)
233 {
234 tet1=no[num]->tetra[j];
235 tet1->crit=m3d_cal_qual(tet1->n1,tet1->n2,tet1->n3,tet1->n4);
236 cas=(int)(tet1->crit*10.);
237 tmp=tet1->suivant;
238 tmp2=tet1->precedent;
239 if (tet1->precedent!=NULL) tet1->precedent->suivant=tmp;
240 else mesh->tete_tetra[cas]=tmp;
241 if (tet1->suivant!=NULL) tet1->suivant->precedent=tmp2;
242 else mesh->queue_tetra[cas]=tmp2;
243 tet1->precedent=NULL;
244 tet1->suivant=NULL;
245 m3d_ord_tet(tet1);
246 }
247 }
248 tet->opt=2;
249 MAXI(crit_opt,crit_opt,crit_avant);
250 if (crit_opt<0.1*env.opti)
251 {
252 o3d_mail_coq(tet->n1,tet->n2,crit,coque);
253 o3d_mail_coq(tet->n1,tet->n3,crit+1,coque+1);
254 o3d_mail_coq(tet->n1,tet->n4,crit+2,coque+2);
255 o3d_mail_coq(tet->n2,tet->n3,crit+3,coque+3);
256 o3d_mail_coq(tet->n2,tet->n4,crit+4,coque+4);
257 o3d_mail_coq(tet->n3,tet->n4,crit+5,coque+5);
258 MAXI(nv_crit,crit[0],crit[1]);
259 MAXI(nv_crit,nv_crit,crit[2]);
260 MAXI(nv_crit,nv_crit,crit[3]);
261 MAXI(nv_crit,nv_crit,crit[4]);
262 MAXI(nv_crit,nv_crit,crit[5]);
263 if (nv_crit>crit_opt)
264 {
265 if (nv_crit==crit[0]) o3d_update_coq(coque);
266 else if (nv_crit==crit[1]) o3d_update_coq(coque+1);
267 else if (nv_crit==crit[2]) o3d_update_coq(coque+2);
268 else if (nv_crit==crit[3]) o3d_update_coq(coque+3);
269 else if (nv_crit==crit[4]) o3d_update_coq(coque+4);
270 else if (nv_crit==crit[5]) o3d_update_coq(coque+5);
271 }
272 else
273 o3d_inv_face(tet);
274 }
275
276 }
277 }
278
279 }