ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_rech2.cpp
Revision: 283
Committed: Tue Sep 13 21:11:20 2011 UTC (13 years, 8 months ago) by francois
File size: 8608 byte(s)
Log Message:
structure de l'écriture

File Contents

# User Rev Content
1 francois 283
2    
3     #include <stdio.h>
4     #include <math.h>
5     #include "m3d_struct.h"
6     #include "m3d_const.h"
7     #include "m3d_hotes.h"
8     #include "m3d_erreur.h"
9     #include "prototype.h"
10     extern int debug ;
11     extern float biais ;
12     extern GEST_MEM *gest ;
13     int m3d_rech2(FACE *face,NOEUD **nresu,float critere,int *hist,FACE **finter,int *nb_face)
14     {
15    
16     /* variables locales */
17     float *coord ;
18     NOEUD *noe_p ;
19     /* tableaux de recherche */
20    
21     NOEUD *tab_adj[NB_MAX_CONNEC] ;
22     NOEUD *tab_lie[NB_MAX_CONNEC] ;
23     NOEUD *lis_possible[NB_MAX_CONNEC] ;
24     NOEUD *tab_resu[NB_MAX_CONNEC] ;
25     int iordre[NB_MAX_CONNEC] ;
26     float tab_crit[NB_MAX_CONNEC] ;
27     float tab[NB_MAX_CONNEC] ;
28    
29     /* parametres de la recherche */
30     int nb_adj, nb_lie, nb_noe_pos ;
31     float rayon, prosca, hauteur2, reps, reps2, reps3 ;
32     float xi,yi, zi ;
33    
34     /* utilitaires geometriques */
35     float vab[3], vac[3], vbc[3], vn[3], norme, pvec[3],vap[3], dist, dab, dbc, dac ;
36     float vip[3], dip, perimetre, hauteur, crit, rayon2 ;
37     /* divers indices */
38     int i, ind, ierr, nb ;
39    
40     ierr = FAUX ;
41     *nresu = NULL ;
42     coord = gest->coord ;
43    
44     /* barycentre */
45     xi = (coord[x((face->n1)->num)] + coord[x((face->n2)->num)] + coord[x((face->n3)->num)])/3. ;
46     yi = (coord[y((face->n1)->num)] + coord[y((face->n2)->num)] + coord[y((face->n3)->num)])/3. ;
47     zi = (coord[z((face->n1)->num)] + coord[z((face->n2)->num)] + coord[z((face->n3)->num)])/3. ;
48    
49     /* calcul de la normale */
50     vab[0] = coord[x((face->n2)->num)] - coord[x((face->n1)->num)] ;
51     vab[1] = coord[y((face->n2)->num)] - coord[y((face->n1)->num)] ;
52     vab[2] = coord[z((face->n2)->num)] - coord[z((face->n1)->num)] ;
53     dab = NORME(vab) ;
54     vac[0] = coord[x((face->n3)->num)] - coord[x((face->n1)->num)] ;
55     vac[1] = coord[y((face->n3)->num)] - coord[y((face->n1)->num)] ;
56     vac[2] = coord[z((face->n3)->num)] - coord[z((face->n1)->num)] ;
57     dac = NORME(vac) ;
58     vbc[0] = coord[x((face->n3)->num)] - coord[x((face->n2)->num)] ;
59     vbc[1] = coord[y((face->n3)->num)] - coord[y((face->n2)->num)] ;
60     vbc[2] = coord[z((face->n3)->num)] - coord[z((face->n2)->num)] ;
61     dbc = NORME(vbc) ;
62    
63     /* calcul du critere 2 D */
64     pvec[0] = PVECX(vab,vac) ;
65     pvec[1] = PVECY(vab,vac) ;
66     pvec[2] = PVECZ(vab,vac) ;
67    
68     perimetre = dab + dbc + dac ;
69     hauteur = perimetre/3. ;
70     hauteur2 = hauteur * hauteur ;
71    
72     vn[0] = PVECX(vab,vac) ;
73     vn[1] = PVECY(vab,vac) ;
74     vn[2] = PVECZ(vab,vac) ;
75    
76     rayon = hauteur * 2. ;
77    
78     reps = rayon * EPSILON ;
79     reps2 = reps * reps ;
80     reps3 = reps2 * reps ;
81    
82    
83    
84     /* determination des points adjacents et des points lies a la face courante */
85     nb_adj = 0 ;
86     nb_lie = 0 ;
87     if (!m3d_r_pts(coord,face,tab_adj,&nb_adj,tab_lie,&nb_lie))
88     {
89     // if (debug) aff_text("erreur dans m3d_r_pts M3D_RECH2\n ") ;
90     return(FAUX) ;
91     }
92     nb_lie = 0 ;
93     /* ******************************************** */
94     /* traitement des noeuds adjacents PRIORITAIRES */
95     /* ******************************************** */
96     /* selection du meilleur point ADJACENT */
97     /* strategie employee, on choisit le noeud adjacent qui donnera le meilleur tetra */
98     /* tri des points adjacents par qualite croissante, se definir un seuil au dessous duquel on ne descend pas */
99    
100     nb = 0 ;
101     for (i=0;i<nb_adj;i++)
102     {
103     noe_p = tab_adj[i] ;
104     if (noe_p->flag!=(size_t)face) /* deja traite */
105     {
106     noe_p->flag = (size_t)face ;
107     /* calcul du vecteur PA */
108     vap[0] = coord[x(noe_p->num)] - coord[x((face->n1)->num)] ;
109     vap[1] = coord[y(noe_p->num)] - coord[y((face->n1)->num)] ;
110     vap[2] = coord[z(noe_p->num)] - coord[z((face->n1)->num)] ;
111     if (PROSCA(vap,vn)>reps3)
112     {
113     crit = m3d_e_qual(coord,(face->n1)->num,(face->n2)->num,(face->n3)->num,noe_p->num) ;
114     if (crit>critere)
115     {
116     tab_crit[nb] = crit ;
117     tab_resu[nb] = noe_p ;
118     nb ++ ;
119    
120     }
121     }
122     }
123     }
124    
125     /* tri par ordre de qualite croissante */
126     if (nb>0)
127     {
128     for (i=0;i<nb;i++) tab[i] = 1./tab_crit[i] ;
129     for (i=0;i<nb;i++) iordre[i] = i+1 ;/* attention passage c fortran */
130     trirea(tab,&nb,iordre) ;
131    
132     /* parcours du vecteur des noeuds adjacents selectes */
133     i = 0 ;
134     while (i<nb)
135     {
136     ind = iordre[i] -1 ;
137     noe_p = (NOEUD*)tab_resu[ind] ;
138     /* TEST : LE NOEUD EST-IL SOLUTION ? */
139     if (m3d_test2(face,noe_p,coord,finter,nb_face,&ierr))
140     {
141     *nresu = noe_p ;
142     /* FONDAMENTAL */
143     /* ne pas oublier de deflagger les noeuds */
144     for (i=0;i<nb_adj;i++)
145     {
146     noe_p = (NOEUD*)tab_adj[i] ;
147     noe_p->flag = 0 ;
148     }
149     *hist = ADJACENT ;
150     return(VRAI) ;
151     }
152     if (ierr == VRAI)
153     {
154     // if (debug) aff_text(" erreur dans m3d_test (adj) M3D_RECH \n ") ;
155     return(FAUX) ;
156     }
157     i++ ;
158     }
159     }
160     i = 0 ;
161     /* noeuds proches */
162     while (i < 5)
163     {
164     ind = m3d_r_noe(coord,xi,yi,zi,rayon,lis_possible,&nb_noe_pos,vn) ;
165     if (ind == VRAI) break ;
166     i++ ;
167     rayon = rayon/2. ;
168     }
169     if (ind == FAUX)
170     {
171     // if (debug) aff_text("erreur dans m3d_r_noe M3D_RECH \n ") ;
172     m3d_erreur(ERR_SYST) ;
173     return(FAUX) ;
174     }
175    
176     /* on a determine l'ensemble des points se trouvant dans la sphere */
177    
178     /* ******************************************************************* */
179     /* recherche du meilleur point de la liste */
180     /* ******************************************************************* */
181    
182     nb = 0 ;
183     for (i=0;i<nb_noe_pos;i++)
184     {
185     noe_p = (NOEUD*)lis_possible[i] ;
186     if (noe_p->flag!=(size_t)face) /* deja traite */
187     /* RAX */
188     {
189     noe_p->flag = (size_t)face ;
190     /* calcul du vecteur PA */
191     vap[0] = coord[x(noe_p->num)] - coord[x((face->n1)->num)] ;
192     vap[1] = coord[y(noe_p->num)] - coord[y((face->n1)->num)] ;
193     vap[2] = coord[z(noe_p->num)] - coord[z((face->n1)->num)] ;
194     if (PROSCA(vap,vn)>reps3)
195     {
196     vip[0] = coord[x(noe_p->num)] - xi ;
197     vip[1] = coord[y(noe_p->num)] - yi ;
198     vip[2] = coord[z(noe_p->num)] - zi ;
199     dip = PROSCA(vip,vip) ;
200     if (dip<4. * hauteur2)
201     {
202     crit = m3d_e_qual(coord,(face->n1)->num,(face->n2)->num,(face->n3)->num,noe_p->num) ;
203     if (crit>critere)
204     {
205     tab_crit[nb] = crit ;
206     tab_resu[nb] = noe_p ;
207     nb ++ ;
208     }
209     }
210     }
211     }
212     }
213     /* a ce stade pour chaque point possible, on dispose du critere en chaque point */
214     /* FONDAMENTAL */
215     /* ne pas oublier de deflagger les noeuds */
216     for (i=0;i<nb_adj;i++)
217     {
218     noe_p = (NOEUD*)tab_adj[i] ;
219     noe_p->flag = 0 ;
220     }
221     for (i=0;i<nb_noe_pos;i++)
222     {
223     noe_p = (NOEUD*)lis_possible[i] ;
224     noe_p->flag = 0 ;
225     }
226    
227     if (nb>0)
228     {
229     for (i=0;i<nb;i++) tab[i] = 1./tab_crit[i] ;
230     for (i=0;i<nb;i++) iordre[i] = i+1 ; /* attention passage c fortran */
231     trirea(tab,&nb,iordre) ;
232    
233     /*
234     --------------------------------------------------------------------------------
235     A ce niveau, on a constitue une liste de points ranges par critere croissants
236     auxquels on va faire subir les tests de selection !
237     --------------------------------------------------------------------------------
238     */
239    
240     /* parcours du vecteur des noeuds selectes */
241     i = 0 ;
242     while (i<nb)
243     {
244     ind = iordre[i] -1 ;/* -1 a cause du passage c -->fortran */
245     noe_p = tab_resu[ind] ;
246     if (m3d_test2(face,noe_p,coord,finter,nb_face,&ierr))
247     {
248     *nresu = noe_p ;
249     *hist = PROCHE ;
250     return(VRAI) ;
251     }
252     if (ierr == VRAI)
253     {
254     // if (debug) aff_text("erreur dans m3d_test(proche) M3D_RECH \n") ;
255     return(FAUX) ;
256     }
257     i++ ;
258     }
259     }
260     *nresu=NULL ;
261     return(VRAI) ;
262     }
263    
264