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

File Contents

# User Rev Content
1 5
2    
3     #include <stdio.h>
4     #include <stdlib.h>
5     #include <math.h>
6     #include "r3d_struct.h"
7     #include "m3d_const.h"
8     #include "m3d_hotes.h"
9     #include "prototype2.h"
10     extern GEST_MEM *gest_r ;
11     extern int debug ;
12     int r3d_gene(FACE *face,NOEUD **nresu,int *hist,float critere)
13     {
14    
15     /* variables locales */
16     float *coord ;
17     NOEUD *noe_g ;
18     int i, j ;
19     float xi,yi, zi;
20     float vab[3], vac[3], vbc[3], vn[3], norme, pvec[3], dist, dab, dbc, dac ;
21     float crit ;
22     int test_inter, nb, val ;
23     float perimetre, hauteur, h ;
24     float tab_xi[12] ;
25     int ierr ;
26     float hmin, hmax, elan ;
27    
28     nb = val = 0 ;
29     *nresu = NULL ;
30     coord = gest_r->coord ;
31     /* barycentre du point */
32     xi = (coord[x((face->n1)->num)] + coord[x((face->n2)->num)] + coord[x((face->n3)->num)])/3. ;
33     yi = (coord[y((face->n1)->num)] + coord[y((face->n2)->num)] + coord[y((face->n3)->num)])/3. ;
34     zi = (coord[z((face->n1)->num)] + coord[z((face->n2)->num)] + coord[z((face->n3)->num)])/3. ;
35    
36     /* calcul de la normale */
37     vab[0] = coord[x((face->n2)->num)] - coord[x((face->n1)->num)] ;
38     vab[1] = coord[y((face->n2)->num)] - coord[y((face->n1)->num)] ;
39     vab[2] = coord[z((face->n2)->num)] - coord[z((face->n1)->num)] ;
40     dab = NORME(vab) ;
41     vac[0] = coord[x((face->n3)->num)] - coord[x((face->n1)->num)] ;
42     vac[1] = coord[y((face->n3)->num)] - coord[y((face->n1)->num)] ;
43     vac[2] = coord[z((face->n3)->num)] - coord[z((face->n1)->num)] ;
44     dac = NORME(vac) ;
45     vbc[0] = coord[x((face->n3)->num)] - coord[x((face->n2)->num)] ;
46     vbc[1] = coord[y((face->n3)->num)] - coord[y((face->n2)->num)] ;
47     vbc[2] = coord[z((face->n3)->num)] - coord[z((face->n2)->num)] ;
48     dbc = NORME(vbc) ;
49    
50     hmin = min(dab,dac) ;
51     hmin = min(hmin,dbc) ;
52    
53     hmax = max(dab,dac) ;
54     hmax = max(hmin,dbc) ;
55    
56     elan = hmax/hmin ;
57    
58     if (elan < 2.) hmin = hmin/2. ;
59    
60     tab_xi[x(0)] = xi ;
61     tab_xi[y(0)] = yi ;
62     tab_xi[z(0)] = zi ;
63     /*
64     tab_xi[x(1)] = coord[x((face->n1)->num)] ;
65     tab_xi[y(1)] = coord[y((face->n1)->num)] ;
66     tab_xi[z(1)] = coord[z((face->n1)->num)] ;
67    
68     tab_xi[x(2)] = coord[x((face->n2)->num)] ;
69     tab_xi[y(2)] = coord[y((face->n2)->num)] ;
70     tab_xi[z(2)] = coord[z((face->n2)->num)] ;
71    
72     tab_xi[x(3)] = coord[x((face->n3)->num)] ;
73     tab_xi[y(3)] = coord[y((face->n3)->num)] ;
74     tab_xi[z(3)] = coord[z((face->n3)->num)] ;
75     */
76    
77     /* calcul du critere 2 D */
78     pvec[0] = PVECX(vab,vac) ;
79     pvec[1] = PVECY(vab,vac) ;
80     pvec[2] = PVECZ(vab,vac) ;
81     /* determination du critere */
82    
83     perimetre = dab + dbc + dac ;
84     hauteur = perimetre/3. ;
85    
86     vn[0] = PVECX(vab,vac) ;
87     vn[1] = PVECY(vab,vac) ;
88     vn[2] = PVECZ(vab,vac) ;
89    
90     norme = NORME(vn) ;
91     if (norme<EPSILON)
92     {
93     if (debug) printf("%s\n"," normale nulle M3D_GENE ") ;
94     return(FAUX) ;
95     }
96     for (i=0;i<3;i++) vn[i] = vn[i]/norme ;
97    
98     /* strategie de generation */
99     /* si la face de recherche a deja ete construite en generant un point, on peut boucler */
100     /* creation du noeud */
101     noe_g = r3d_c_noe() ;
102     if (noe_g == NULL) return(FAUX) ;
103     i = 0 ;
104     j = 0 ;
105     while (j<2)/* on fait varier la hauteur */
106     {
107     switch(j)
108     {
109     case 0 : val = (face->tab).val0 ;break ;
110     case 1 : val = (face->tab).val1 ;break ;
111     case 2 : val = (face->tab).val2 ;break ;
112     case 3 : val = (face->tab).val3 ;break ;
113     }
114     if (val==0)
115     {
116     h = hmin/(5*j+1.) ;
117     coord[x(noe_g->num)] = tab_xi[x(i)] + h * vn[0] ;
118     coord[y(noe_g->num)] = tab_xi[y(i)] + h * vn[1] ;
119     coord[z(noe_g->num)] = tab_xi[z(i)] + h * vn[2] ;
120     /* ----------------------------------------------------------- */
121     /* remarque : on ne cree le noeud que si le noeud est SOLUTION */
122     /* ----------------------------------------------------------- */
123     ierr = FAUX ;
124     crit = m3d_e_qual(coord,(face->n1)->num,(face->n2)->num,(face->n3)->num,noe_g->num) ;
125     if (crit>critere)
126     {
127     test_inter = r3d_cpfront(coord,face,noe_g,&ierr) ;
128     if (ierr == VRAI)
129     {
130     if (debug) printf("%s\n"," Erreur r3d_cpfront M3D_GENE ") ;
131     return(FAUX) ;
132     }
133     if (test_inter==FAUX)
134     /* on a trouve un noeud solution */
135     {
136     *nresu = noe_g ;
137     if (face->hist == 0) *hist = PROCHE ;
138     else *hist = GENERATION ;
139     switch(j)
140     {
141     case 0 : (face->tab).val0 = 1 ;break ;
142     case 1 : (face->tab).val1 = 1 ;break ;
143     case 2 : (face->tab).val2 = 1 ;break ;
144     case 3 : (face->tab).val3 = 1 ;break ;
145     }
146     return(VRAI) ;
147     }
148     }
149     }
150     j++ ;
151     }
152     /* le noeud n'est pas solution, on ne l'utilise pas */
153     gest_r->nb_noeud = gest_r->nb_noeud - 1 ;
154     *nresu=NULL ;
155     return(VRAI) ;
156     }