ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_gene2.cpp
Revision: 283
Committed: Tue Sep 13 21:11:20 2011 UTC (13 years, 8 months ago) by francois
File size: 5946 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 GEST_MEM *gest ;
11     extern int debug ;
12     int m3d_gene2(FACE *face,NOEUD **nresu,int *hist,FACE **finter,int *nb_face,float critere)
13     {
14     int nb_gen ;
15     float *coord ;
16     char mess[255];
17     /* variables locales */
18    
19     NOEUD *noe_g ;
20     int i, j ;
21     float xi,yi, zi ;
22     float vab[3], vac[3], vbc[3], vn[3], norme, pvec[3], dab, dbc, dac ;
23     float crit ;
24     float perimetre, hauteur, h ;
25     float tab_xi[12] ;
26     int ierr ;
27     int val ;
28     OCT *oct ;
29     float hmin, hmax, elan ;
30    
31     val = 10 ;
32     *nresu = NULL ;
33     coord = gest->coord ;
34     /* barycentre du point */
35     xi = (coord[x((face->n1)->num)] + coord[x((face->n2)->num)] + coord[x((face->n3)->num)])/3. ;
36     yi = (coord[y((face->n1)->num)] + coord[y((face->n2)->num)] + coord[y((face->n3)->num)])/3. ;
37     zi = (coord[z((face->n1)->num)] + coord[z((face->n2)->num)] + coord[z((face->n3)->num)])/3. ;
38    
39     /* calcul de la normale */
40     vab[0] = coord[x((face->n2)->num)] - coord[x((face->n1)->num)] ;
41     vab[1] = coord[y((face->n2)->num)] - coord[y((face->n1)->num)] ;
42     vab[2] = coord[z((face->n2)->num)] - coord[z((face->n1)->num)] ;
43     dab = NORME(vab) ;
44     vac[0] = coord[x((face->n3)->num)] - coord[x((face->n1)->num)] ;
45     vac[1] = coord[y((face->n3)->num)] - coord[y((face->n1)->num)] ;
46     vac[2] = coord[z((face->n3)->num)] - coord[z((face->n1)->num)] ;
47     dac = NORME(vac) ;
48     vbc[0] = coord[x((face->n3)->num)] - coord[x((face->n2)->num)] ;
49     vbc[1] = coord[y((face->n3)->num)] - coord[y((face->n2)->num)] ;
50     vbc[2] = coord[z((face->n3)->num)] - coord[z((face->n2)->num)] ;
51     dbc = NORME(vbc) ;
52    
53     hmin = min(dab,dac) ;
54     hmin = min(hmin,dbc) ;
55    
56     hmax = max(dab,dac) ;
57     hmax = max(hmin,dbc) ;
58    
59    
60     elan = hmax/hmin ;
61    
62     if (elan < 2.) hmin = hmin/2. ;
63    
64     tab_xi[x(0)] = xi ;
65     tab_xi[y(0)] = yi ;
66     tab_xi[z(0)] = zi ;
67    
68     /* calcul du critere 2 D */
69     pvec[0] = PVECX(vab,vac) ;
70     pvec[1] = PVECY(vab,vac) ;
71     pvec[2] = PVECZ(vab,vac) ;
72     /* determination du critere */
73    
74     perimetre = dab + dbc + dac ;
75     hauteur = perimetre/3. ;
76    
77     vn[0] = PVECX(vab,vac) ;
78     vn[1] = PVECY(vab,vac) ;
79     vn[2] = PVECZ(vab,vac) ;
80    
81     norme = NORME(vn) ;
82    
83     for (i=0;i<3;i++) vn[i] = vn[i]/norme ;
84    
85     /* strategie de generation */
86     /* si la face de recherche a deja ete construite en generant un point, on peut boucler */
87    
88     noe_g = m3d_c_noe() ;
89     if (noe_g == NULL) return(FAUX) ;
90     i = 0 ;
91     j = 0 ;
92     while (j<3)/* on fait varier la hauteur */
93     {
94     switch (j)
95     {
96     case 0 :
97     val = (face->tab).val0 ;
98     break ; ;
99     case 1 :
100     val = (face->tab).val1 ;
101     break ;
102     case 2 :
103     val = (face->tab).val2 ;
104     break ;
105     case 3 :
106     val = (face->tab).val3 ;
107     break ;
108     }
109     if (val==0)
110     {
111     h = hmin/(5*j+1.) ;
112     coord[x(noe_g->num)] = tab_xi[x(i)] + h * vn[0] ;
113     coord[y(noe_g->num)] = tab_xi[y(i)] + h * vn[1] ;
114     coord[z(noe_g->num)] = tab_xi[z(i)] + h * vn[2] ;
115     ierr = FAUX ;
116     crit = m3d_e_qual(coord,(face->n1)->num,(face->n2)->num,(face->n3)->num,noe_g->num) ;
117     /* test sur le critere */
118     if (crit>critere)
119     {
120     /* test sur le critere */
121     if (!m3d_cpfront2(coord,face,noe_g,finter,nb_face,&ierr))
122     {
123     if (ierr == VRAI)
124     {
125     return(FAUX) ;
126     }
127     oct = NULL ;
128     m3d_io_noe(coord+3*(noe_g->num),gest->root,&oct,&ierr) ;
129     if (ierr == VRAI)
130     {
131     if (debug)
132     {
133     sprintf(mess,"%s\n"," Erreur dans m3d_io_noe M3D_GENE2 ") ;
134     //aff_text(mess);
135     }
136     return(FAUX) ;
137     }
138     if (oct == NULL)
139     {
140     if (debug)
141     {
142     sprintf(mess,"%s\n"," Erreur m3d_io_noe M3D_GENE ") ;
143     //aff_text(mess);
144     sprintf(mess,"%s\n"," Aucun oct trouve M3D_GENE ") ;
145     //aff_text(mess);
146     sprintf(mess," xg:%f yg:%f zg:%f\n",coord[x(noe_g->num)],coord[y(noe_g->num)],coord[z(noe_g->num)]) ;
147     //aff_text(mess);
148     }
149     m3d_erreur(ERR_SYST) ;
150     return(FAUX) ;
151     }
152     /* chainage noeud octree */
153     /* insertion en tete */
154     noe_g->suivant = oct->lis_noe ;
155     oct->lis_noe = noe_g ;
156     noe_g->oct = oct ;
157     /* maillage virtuel */
158     *nresu = noe_g ;
159     if (face->hist == 0) *hist = PROCHE ;
160     else *hist = FACE_GENEREE ;
161     switch (j)
162     {
163     case 0 :
164     (face->tab).val0 = 1 ;
165     break ;
166     case 1 :
167     (face->tab).val1 = 1 ;
168     break ;
169     case 2 :
170     (face->tab).val2 = 1 ;
171     break ;
172     case 3 :
173     (face->tab).val3 = 1 ;
174     break ;
175     }
176     return(VRAI) ;
177     }
178     }
179     }
180     j++ ;
181     }
182     gest->nb_noeud = gest->nb_noeud - 1 ;
183     *nresu=NULL ;
184     return(VRAI) ;
185     }