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

File Contents

# Content
1 /*****************************************************************
2
3 o3d_mail_coq.cpp Type:Func
4
5 Remaillage d une coquille
6
7 Date de creation : 22-4-1999 9 :5 :7
8 Derniere version : 22-4-1999 9 :5 :7
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 extern int tab_solution[7][1430][8];
33 extern int tab_face[7][120][3];
34
35
36
37 /**************************/
38 /* programme principal */
39
40 void o3d_mail_coq(int n1,int n2, float *crit, struct coquille *coque)
41 {
42 int i,j,nb_coq,coq[20];
43 int poly[20];
44 int tet_noeud[40];
45 int nb_tet_noeud;
46 int nb_poly;
47 int nsolution,nface;
48 struct s_tetra *tet;
49 struct s_noeud *no1,*noa,*nob,*noc,*nod,*noe;
50 struct s_noeud *no2;
51 float crit_face[120],eps;
52 float crit1,crit2,crit_solution[1430];
53 float volume,volume_ori;
54 float ab[4],ac[4],ad[4],vec[4];
55 int numero_solution;
56 float crit_opt;
57
58
59 no1=ADRESSE(n1,noeud,mesh->);
60 no2=ADRESSE(n2,noeud,mesh->);
61 /* validite du segment */
62 for (i=0;i<no1->nb_segment;i++)
63 for (j=0;j<no2->nb_segment;j++)
64 if (no1->segment[i]->num==no2->segment[j]->num)
65 if (no1->segment[i]->type!=BODY)
66 {
67 *crit=0.;
68 coque->n=0;
69 return;
70 }
71
72 /* recherche de la coquille */
73 nb_coq=0;
74 for (i=0;i<no1->nb_tetra;i++)
75 {
76 if (no1->tetra[i]->etat==ACTIF)
77 for (j=0;j<no2->nb_tetra;j++)
78 {
79 if (no2->tetra[j]->etat==ACTIF)
80 if (no1->tetra[i]->num==no2->tetra[j]->num)
81 {
82 coq[nb_coq]=no1->tetra[i]->num;
83 nb_coq++;
84 }
85 }
86 }
87 if ((nb_coq<4) || (nb_coq>10))
88 {
89 *crit=0.;
90 coque->n=0;
91 return;
92 }
93 /* on repere les noeuds libres de chaque tetra */
94 nb_tet_noeud=0;
95 volume_ori=0.;
96 coque->n=nb_coq;
97 for (i=0;i<nb_coq;i++)
98 {
99 tet=ADRESSE(coq[i],tetra,mesh->);
100 coque->tet[i]=tet;
101 if ((tet->n1!=n1) && (tet->n1!=n2)) tet_noeud[nb_tet_noeud++]=tet->n1;
102 if ((tet->n2!=n1) && (tet->n2!=n2)) tet_noeud[nb_tet_noeud++]=tet->n2;
103 if ((tet->n3!=n1) && (tet->n3!=n2)) tet_noeud[nb_tet_noeud++]=tet->n3;
104 if ((tet->n4!=n1) && (tet->n4!=n2)) tet_noeud[nb_tet_noeud++]=tet->n4;
105 noa=ADRESSE(tet->n1,noeud,mesh->);
106 nob=ADRESSE(tet->n2,noeud,mesh->);
107 noc=ADRESSE(tet->n3,noeud,mesh->);
108 nod=ADRESSE(tet->n4,noeud,mesh->);
109 VEC(ab,noa,nob);
110 VEC(ac,noa,noc);
111 VEC(ad,noa,nod);
112 PVEC(vec,ab,ac);
113 volume_ori=volume_ori+(float)fabs((double)PSCA(vec,ad));
114 }
115 /* numeratation de la coquille */
116 poly[0]=tet_noeud[0];tet_noeud[0]=(-1);
117 poly[1]=tet_noeud[1];tet_noeud[1]=(-1);
118 nb_poly=2;
119 while (nb_poly!=(nb_coq+1))
120 {
121 for (j=0;j<nb_coq;j++)
122 {
123 if (tet_noeud[2*j]==poly[nb_poly-1])
124 {
125 poly[nb_poly++]=tet_noeud[2*j+1];
126 tet_noeud[2*j]=(-1);
127 tet_noeud[2*j+1]=(-1);
128 }
129 if (tet_noeud[2*j+1]==poly[nb_poly-1])
130 {
131 poly[nb_poly++]=tet_noeud[2*j];
132 tet_noeud[2*j]=(-1);
133 tet_noeud[2*j+1]=(-1);
134 }
135 }
136 }
137 /* qualite de chaque solution */
138 if (nb_coq==4) {nsolution=2;nface=4;}
139 if (nb_coq==5) {nsolution=5;nface=10;}
140 if (nb_coq==6) {nsolution=14;nface=20;}
141 if (nb_coq==7) {nsolution=42;nface=35;}
142 if (nb_coq==8) {nsolution=132;nface=56;}
143 if (nb_coq==9) {nsolution=429;nface=84;}
144 if (nb_coq==10) {nsolution=1430;nface=120;}
145
146 for (i=0;i<nface;i++)
147 {
148 crit1=o3d_cal_qual(poly[tab_face[nb_coq-4][i][0]],poly[tab_face[nb_coq-4][i][1]],poly[tab_face[nb_coq-4][i][2]],n1);
149 crit2=o3d_cal_qual(poly[tab_face[nb_coq-4][i][0]],poly[tab_face[nb_coq-4][i][1]],poly[tab_face[nb_coq-4][i][2]],n2);
150 MINI(crit_face[i],crit1,crit2);
151 }
152 /* examen de chaque solution */
153 crit_opt=0.;
154 numero_solution=(-1);
155 for (i=0;i<nsolution;i++)
156 {
157 volume=0.;
158 for (j=0;j<nb_coq-2;j++)
159 {
160 noa=ADRESSE(poly[tab_face[nb_coq-4][tab_solution[nb_coq-4][i][j]][0]],noeud,mesh->);
161 nob=ADRESSE(poly[tab_face[nb_coq-4][tab_solution[nb_coq-4][i][j]][1]],noeud,mesh->);
162 noc=ADRESSE(poly[tab_face[nb_coq-4][tab_solution[nb_coq-4][i][j]][2]],noeud,mesh->);
163 nod=ADRESSE(n1,noeud,mesh->);
164 VEC(ab,noa,nob);
165 VEC(ac,noa,noc);
166 VEC(ad,noa,nod);
167 PVEC(vec,ab,ac);
168 volume=volume+(float)fabs((double)PSCA(vec,ad));
169 nod=ADRESSE(n2,noeud,mesh->);
170 VEC(ad,noa,nod);
171 volume=volume+(float)fabs((double)PSCA(vec,ad));
172 }
173 eps=0.0018*(float)pow((double)volume,0.666666666);
174 if (EGAL(volume,volume_ori,eps))
175 {
176 crit_solution[i]=1.;
177 for (j=0;j<nb_coq-2;j++)
178 MINI(crit_solution[i],crit_solution[i],crit_face[tab_solution[nb_coq-4][i][j]]);
179 }
180 else crit_solution[i]=0.;
181 if (crit_opt<crit_solution[i])
182 {
183 crit_opt=crit_solution[i];
184 numero_solution=i;
185 }
186
187 }
188 /* bonne solution */
189 if (numero_solution==(-1))
190 {
191 *crit=0.;
192 coque->n=0;
193 return;
194 }
195 *crit=crit_opt;
196 nod=ADRESSE(n1,noeud,mesh->);
197 noe=ADRESSE(n2,noeud,mesh->);
198 for (j=0;j<nb_coq-2;j++)
199 {
200 noa=ADRESSE(poly[tab_face[nb_coq-4][tab_solution[nb_coq-4][numero_solution][j]][0]],noeud,mesh->);
201 nob=ADRESSE(poly[tab_face[nb_coq-4][tab_solution[nb_coq-4][numero_solution][j]][1]],noeud,mesh->);
202 noc=ADRESSE(poly[tab_face[nb_coq-4][tab_solution[nb_coq-4][numero_solution][j]][2]],noeud,mesh->);
203 coque->new_tetra[8*j]=noa->num;
204 coque->new_tetra[8*j+1]=nob->num;
205 coque->new_tetra[8*j+2]=noc->num;
206 coque->new_tetra[8*j+3]=nod->num;
207 coque->new_tetra[8*j+4]=noa->num;
208 coque->new_tetra[8*j+5]=nob->num;
209 coque->new_tetra[8*j+6]=noc->num;
210 coque->new_tetra[8*j+7]=noe->num;
211 }
212 }