ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/r3d_rech.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 7533 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

File Contents

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