1 |
|
5 |
#include <stdio.h>
|
2 |
|
|
#include <stdlib.h>
|
3 |
|
|
#include "m3d_struct.h"
|
4 |
|
|
#include "m3d_const.h"
|
5 |
|
|
#include "m3d_hotes.h"
|
6 |
|
|
#include "m3d_erreur.h"
|
7 |
|
|
#include "prototype.h"
|
8 |
|
|
#define NB_TRAITE 1000
|
9 |
|
|
#define NB_ITER 2
|
10 |
|
|
extern GEST_MEM *gest ;
|
11 |
|
|
extern int debug ;
|
12 |
|
|
extern float crit_min ;
|
13 |
|
|
extern int lissage ;
|
14 |
|
|
/* routine de tete du mailleur */
|
15 |
|
|
int m3d_best(void)
|
16 |
|
|
{
|
17 |
|
|
int i, *numele, nb, nb_tetra, j ;
|
18 |
|
|
TETRAEDRE *tetra, *tab_del[10000],*tab_tetra[NB_TRAITE] ;
|
19 |
|
|
NOEUD *m3d_c_noe() ;
|
20 |
|
|
FACE *tab_coq[100] ;
|
21 |
|
|
FACE *tab_front[20] ;
|
22 |
|
|
float crit;
|
23 |
|
|
int tabele[3000] ;
|
24 |
|
|
int *neww ;
|
25 |
|
|
int tab_connec[400] ;
|
26 |
|
|
int old[100] ;
|
27 |
|
|
float vcoord[300] ;
|
28 |
|
|
int nb_node, nb_face ;
|
29 |
|
|
int ierr = 0 ;
|
30 |
|
|
int nb_cree ;
|
31 |
|
|
int nb_noeud = 0 ;
|
32 |
|
|
int level, gtrouve,nb_essai,k ;
|
33 |
|
|
float *coord ;
|
34 |
|
|
NOEUD *noe_g ;
|
35 |
|
|
OCT *oct ;
|
36 |
|
|
/* table de 100 faces */
|
37 |
|
|
|
38 |
|
|
if (!lissage) return(VRAI) ;
|
39 |
|
|
/* sortie de maillage */
|
40 |
|
|
/* examen de la qualite des tetras */
|
41 |
|
|
coord = gest->coord ;
|
42 |
|
|
numele = gest->numele ;
|
43 |
|
|
|
44 |
|
|
/* ************************************************************ */
|
45 |
|
|
/* BOUGE DE POINTS */
|
46 |
|
|
/* ************************************************************ */
|
47 |
|
|
|
48 |
|
|
for (j=0;j<NB_ITER;j++)
|
49 |
|
|
{
|
50 |
|
|
for (i=gest->nb_init;i<gest->nb_noeud;i++)
|
51 |
|
|
{
|
52 |
|
|
if (!m3d_move(i))
|
53 |
|
|
{
|
54 |
|
|
return(FAUX) ;
|
55 |
|
|
}
|
56 |
|
|
}
|
57 |
|
|
}
|
58 |
|
|
|
59 |
|
|
/* TETRAEDRES A DETRUIRE */
|
60 |
|
|
nb = 0 ;
|
61 |
|
|
for (i=0;i<gest->nb_tetra;i++)
|
62 |
|
|
{
|
63 |
|
|
/* adresse du tetra */
|
64 |
|
|
ADRESSE(tetra,i,tetra)
|
65 |
|
|
if (tetra->mark!=KILLED)
|
66 |
|
|
{
|
67 |
|
|
/* calcul du critere */
|
68 |
|
|
crit = m3d_e_qual(gest->coord,numele[4*i],numele[4*i+1],numele[4*i+2],numele[4*i+3]) ;
|
69 |
|
|
if (crit<crit_min)
|
70 |
|
|
{
|
71 |
|
|
tab_del[nb] = tetra ;
|
72 |
|
|
nb++ ;
|
73 |
|
|
if (nb>9999) return(FAUX) ;
|
74 |
|
|
}
|
75 |
|
|
}
|
76 |
|
|
}
|
77 |
|
|
|
78 |
|
|
/* determination de la coquille */
|
79 |
|
|
neww = (int*)calloc(2*gest->nb_noeud,sizeof(int)) ;
|
80 |
|
|
ERREUR_ALLOC_FAUX(neww)
|
81 |
|
|
for (i=0;i<nb;i++)
|
82 |
|
|
{
|
83 |
|
|
/* autour du tetra */
|
84 |
|
|
tetra = tab_del[i] ;
|
85 |
|
|
if (tetra->mark != KILLED)
|
86 |
|
|
{
|
87 |
|
|
level = 1 ;
|
88 |
|
|
gtrouve = FAUX ;
|
89 |
|
|
while ((gtrouve == FAUX) && (level<7))
|
90 |
|
|
{
|
91 |
|
|
nb_node = 0 ;
|
92 |
|
|
nb_face = 0 ;
|
93 |
|
|
nb_tetra = 0 ;
|
94 |
|
|
for (j=0;j<100;j++) old[j] = -1 ;
|
95 |
|
|
ierr = FAUX ;
|
96 |
|
|
/* ************************************************************ */
|
97 |
|
|
/* REMAILLAGE AUTOUR D'UNE ARETE */
|
98 |
|
|
/* ************************************************************ */
|
99 |
|
|
|
100 |
|
|
if (!m3d_arete(tetra,level,&nb_node,&nb_face,vcoord,tabele,neww,old,tab_tetra,&nb_tetra,tab_coq))
|
101 |
|
|
{
|
102 |
|
|
return(FAUX) ;
|
103 |
|
|
}
|
104 |
|
|
if (nb_node != 0)
|
105 |
|
|
{
|
106 |
|
|
nb_cree = 0 ;
|
107 |
|
|
r3dtet(vcoord,nb_node,&nb_noeud,tabele,nb_face,tab_connec,&nb_cree,&ierr) ;
|
108 |
|
|
r3d_lib() ;
|
109 |
|
|
if (ierr == FAUX) gtrouve = VRAI ;/* remaillage possible */
|
110 |
|
|
else ierr = FAUX ;
|
111 |
|
|
}
|
112 |
|
|
level++ ;
|
113 |
|
|
}
|
114 |
|
|
|
115 |
|
|
level = 0 ;
|
116 |
|
|
while ((gtrouve == FAUX) && (level<4))
|
117 |
|
|
{
|
118 |
|
|
nb_node = 0 ;
|
119 |
|
|
nb_face = 0 ;
|
120 |
|
|
nb_tetra = 0 ;
|
121 |
|
|
for (j=0;j<100;j++) old[j] = -1 ;
|
122 |
|
|
ierr = FAUX ;
|
123 |
|
|
/* ************************************************************ */
|
124 |
|
|
/* SUPRESSION D'UNE FACE */
|
125 |
|
|
/* ************************************************************ */
|
126 |
|
|
|
127 |
|
|
if (!m3d_coq(tetra,level,&nb_node,&nb_face,vcoord,tabele,neww,old,tab_tetra,&nb_tetra,tab_coq))
|
128 |
|
|
{
|
129 |
|
|
return(FAUX) ;
|
130 |
|
|
}
|
131 |
|
|
if (nb_node != 0)
|
132 |
|
|
{
|
133 |
|
|
nb_cree = 0 ;
|
134 |
|
|
r3dtet(vcoord,nb_node,&nb_noeud,tabele,nb_face,tab_connec,&nb_cree,&ierr) ;
|
135 |
|
|
r3d_lib() ;
|
136 |
|
|
if (ierr == FAUX) gtrouve = VRAI ;/* remaillage possible */
|
137 |
|
|
else ierr = FAUX ;
|
138 |
|
|
}
|
139 |
|
|
level++ ;
|
140 |
|
|
}
|
141 |
|
|
|
142 |
|
|
if (gtrouve == FAUX)
|
143 |
|
|
/* ************************************************************ */
|
144 |
|
|
/* INSERTION DE POINTS */
|
145 |
|
|
/* ************************************************************ */
|
146 |
|
|
{
|
147 |
|
|
nb_node = 0 ;
|
148 |
|
|
nb_face = 0 ;
|
149 |
|
|
nb_tetra = 0 ;
|
150 |
|
|
for (j=0;j<100;j++) old[j] = -1 ;
|
151 |
|
|
if (!m3d_break(tetra,&nb_node,&nb_face,vcoord,tabele,neww,old,tab_tetra,&nb_tetra,tab_coq,tab_connec))
|
152 |
|
|
{
|
153 |
|
|
return(FAUX) ;
|
154 |
|
|
}
|
155 |
|
|
if (nb_node != 0)
|
156 |
|
|
{
|
157 |
|
|
gtrouve = VRAI ;
|
158 |
|
|
nb_cree = nb_face ;
|
159 |
|
|
nb_noeud = nb_node + 1 ;
|
160 |
|
|
}
|
161 |
|
|
}
|
162 |
|
|
|
163 |
|
|
if (gtrouve == VRAI) /* on a remaille la coquille */
|
164 |
|
|
{
|
165 |
|
|
/* retour a la numerotation initiale */
|
166 |
|
|
for (j=0;j<nb_cree;j++)
|
167 |
|
|
{
|
168 |
|
|
for (k=0;k<4;k++)
|
169 |
|
|
{
|
170 |
|
|
/* le noeud est un noeud deja existant */
|
171 |
|
|
if (tab_connec[4*j+k]<nb_node) tab_connec[4*j+k] = old[(tab_connec[4*j+k])] ;
|
172 |
|
|
else /* un npeud a ete cree */
|
173 |
|
|
{
|
174 |
|
|
if (old[(tab_connec[4*j+k])] == -1) /* creation du noeud */
|
175 |
|
|
{
|
176 |
|
|
noe_g = m3d_c_noe() ;
|
177 |
|
|
if (noe_g == NULL) return(FAUX) ;
|
178 |
|
|
coord[x(noe_g->num)] = vcoord[x(tab_connec[4*j+k])] ;
|
179 |
|
|
coord[y(noe_g->num)] = vcoord[y(tab_connec[4*j+k])] ;
|
180 |
|
|
coord[z(noe_g->num)] = vcoord[z(tab_connec[4*j+k])] ;
|
181 |
|
|
old[(tab_connec[4*j+k])] = noe_g->num ;
|
182 |
|
|
}
|
183 |
|
|
tab_connec[4*j+k] = old[(tab_connec[4*j+k])] ;
|
184 |
|
|
}
|
185 |
|
|
}
|
186 |
|
|
}
|
187 |
|
|
/* destruction des tetraedres */
|
188 |
|
|
nb_essai = 10 ;
|
189 |
|
|
for (j=0;j<nb_essai;j++)
|
190 |
|
|
{
|
191 |
|
|
tab_front[2*j] = NULL ;
|
192 |
|
|
tab_front[2*j+1] = NULL ;
|
193 |
|
|
}
|
194 |
|
|
for (j=0;j<nb_tetra;j++)
|
195 |
|
|
{
|
196 |
|
|
if (tab_tetra[j]->mark != KILLED)
|
197 |
|
|
if (!m3d_d_tetra(tab_tetra[j],tab_front)) return(FAUX) ;
|
198 |
|
|
}
|
199 |
|
|
/* reconstruction du maillage */
|
200 |
|
|
if (!m3d_recons(tab_front,tab_connec,nb_cree))
|
201 |
|
|
{
|
202 |
|
|
return(FAUX) ;
|
203 |
|
|
}
|
204 |
|
|
}
|
205 |
|
|
}
|
206 |
|
|
}
|
207 |
|
|
crit_min = 0.1 ;
|
208 |
|
|
free(neww) ;
|
209 |
|
|
return(VRAI) ;
|
210 |
|
|
}
|
211 |
|
|
|