ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_rech.cpp
Revision: 283
Committed: Tue Sep 13 21:11:20 2011 UTC (13 years, 8 months ago) by francois
File size: 8792 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_rech(FACE *face,NOEUD **nresu,float critere,int *hist)
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_RECH \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     if (noe_p->mark!=NO_CONNEC)
106     {
107     noe_p->flag = (size_t)face ;
108     /* calcul du vecteur PA */
109     vap[0] = coord[x(noe_p->num)] - coord[x((face->n1)->num)] ;
110     vap[1] = coord[y(noe_p->num)] - coord[y((face->n1)->num)] ;
111     vap[2] = coord[z(noe_p->num)] - coord[z((face->n1)->num)] ;
112     if (PROSCA(vap,vn)>reps3)
113     {
114     crit = m3d_e_qual(coord,(face->n1)->num,(face->n2)->num,(face->n3)->num,noe_p->num) ;
115     if (crit>critere)
116     {
117     tab_crit[nb] = crit ;
118     tab_resu[nb] = noe_p ;
119     nb ++ ;
120    
121     }
122     }
123     }
124     }
125    
126     /* tri par ordre de qualite croissante */
127     if (nb>0)
128     {
129     for (i=0;i<nb;i++) tab[i] = 1./tab_crit[i] ;
130     for (i=0;i<nb;i++) iordre[i] = i+1 ;/* attention passage c fortran */
131     trirea(tab,&nb,iordre) ;
132    
133     /* parcours du vecteur des noeuds adjacents selectes */
134     i = 0 ;
135     while (i<nb)
136     {
137     ind = iordre[i] -1 ;
138     noe_p = (NOEUD*)tab_resu[ind] ;
139     /* TEST : LE NOEUD EST-IL SOLUTION ? */
140     if (m3d_test(face,noe_p,coord,&ierr))
141     {
142     *nresu = noe_p ;
143     /* FONDAMENTAL */
144     /* ne pas oublier de deflagger les noeuds */
145     for (i=0;i<nb_adj;i++)
146     {
147     noe_p = (NOEUD*)tab_adj[i] ;
148     noe_p->flag = 0 ;
149     }
150     *hist = ADJACENT ;
151     return(VRAI) ;
152     }
153     if (ierr == VRAI)
154     {
155     // if (debug) aff_text(" erreur dans m3d_test (adj) M3D_RECH \n") ;
156     return(FAUX) ;
157     }
158     i++ ;
159     }
160     }
161     i = 0 ;
162     /* noeuds proches */
163     while (i < 5)
164     {
165     ind = m3d_r_noe(coord,xi,yi,zi,rayon,lis_possible,&nb_noe_pos,vn) ;
166     if (ind == VRAI) break ;
167     i++ ;
168     rayon = rayon/2. ;
169     }
170     if (ind == FAUX)
171     {
172     // if (debug) aff_text("erreur dans m3d_r_noe M3D_RECH \n") ;
173     m3d_erreur(ERR_SYST) ;
174     return(FAUX) ;
175     }
176    
177     /* on a determine l'ensemble des points se trouvant dans la sphere */
178    
179     /* ******************************************************************* */
180     /* recherche du meilleur point de la liste */
181     /* ******************************************************************* */
182    
183     nb = 0 ;
184     for (i=0;i<nb_noe_pos;i++)
185     {
186     noe_p = (NOEUD*)lis_possible[i] ;
187     if (noe_p->flag!=(size_t)face) /* deja traite */
188     /* RAX */
189     if (noe_p->mark!=NO_CONNEC)
190     {
191     noe_p->flag = (size_t)face ;
192     /* calcul du vecteur PA */
193     vap[0] = coord[x(noe_p->num)] - coord[x((face->n1)->num)] ;
194     vap[1] = coord[y(noe_p->num)] - coord[y((face->n1)->num)] ;
195     vap[2] = coord[z(noe_p->num)] - coord[z((face->n1)->num)] ;
196     if (PROSCA(vap,vn)>reps3)
197     {
198     vip[0] = coord[x(noe_p->num)] - xi ;
199     vip[1] = coord[y(noe_p->num)] - yi ;
200     vip[2] = coord[z(noe_p->num)] - zi ;
201     dip = PROSCA(vip,vip) ;
202     if (dip<4. * hauteur2)
203     {
204     crit = m3d_e_qual(coord,(face->n1)->num,(face->n2)->num,(face->n3)->num,noe_p->num) ;
205     if (crit>critere)
206     {
207     tab_crit[nb] = crit ;
208     tab_resu[nb] = noe_p ;
209     nb ++ ;
210     }
211     }
212     }
213     }
214     }
215     /* a ce stade pour chaque point possible, on dispose du critere en chaque point */
216     /* FONDAMENTAL */
217     /* ne pas oublier de deflagger les noeuds */
218     for (i=0;i<nb_adj;i++)
219     {
220     noe_p = (NOEUD*)tab_adj[i] ;
221     noe_p->flag = 0 ;
222     }
223     for (i=0;i<nb_noe_pos;i++)
224     {
225     noe_p = (NOEUD*)lis_possible[i] ;
226     noe_p->flag = 0 ;
227     }
228    
229     if (nb>0)
230     {
231     for (i=0;i<nb;i++) tab[i] = 1./tab_crit[i] ;
232     for (i=0;i<nb;i++) iordre[i] = i+1 ; /* attention passage c fortran */
233     trirea(tab,&nb,iordre) ;
234    
235     /*
236     --------------------------------------------------------------------------------
237     A ce niveau, on a constitue une liste de points ranges par critere croissants
238     auxquels on va faire subir les tests de selection !
239     --------------------------------------------------------------------------------
240     */
241    
242     /* parcours du vecteur des noeuds selectes */
243     i = 0 ;
244     while (i<nb)
245     {
246     ind = iordre[i] -1 ;/* -1 a cause du passage c -->fortran */
247     noe_p = tab_resu[ind] ;
248     if (m3d_test(face,noe_p,coord,&ierr))
249     {
250     *nresu = noe_p ;
251     *hist = PROCHE ;
252     return(VRAI) ;
253     }
254     if (ierr == VRAI)
255     {
256     // if (debug) aff_text("erreur dans m3d_test(proche) M3D_RECH \n") ;
257     return(FAUX) ;
258     }
259     i++ ;
260     }
261     }
262     *nresu=NULL ;
263     return(VRAI) ;
264     }
265    
266