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

File Contents

# User Rev Content
1 francois 283
2     #include <stdio.h>
3     #include <math.h>
4     #include <stdlib.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_gene(FACE *face,NOEUD **nresu,int *hist,float critere)
13     {
14    
15     /* variables locales */
16     float *coord ;
17     NOEUD *noe_g ;
18     char mess[255];
19     OCT *oct ;
20     int i, j ;
21     float xi,yi, zi, val ;
22     float vab[3], vac[3], vbc[3], vn[3], norme, pvec[3], dab, dbc, dac ;
23     float crit ;
24     int test_inter, nb ;
25     float perimetre, hauteur, h ;
26     float tab_xi[12] ;
27     int ierr ;
28     float hmin, hmax, elan ;
29    
30     *nresu = NULL ;
31     coord = gest->coord ;
32     /* barycentre du point */
33     xi = (coord[x((face->n1)->num)] + coord[x((face->n2)->num)] + coord[x((face->n3)->num)])/3. ;
34     yi = (coord[y((face->n1)->num)] + coord[y((face->n2)->num)] + coord[y((face->n3)->num)])/3. ;
35     zi = (coord[z((face->n1)->num)] + coord[z((face->n2)->num)] + coord[z((face->n3)->num)])/3. ;
36    
37     /* calcul de la normale */
38     vab[0] = coord[x((face->n2)->num)] - coord[x((face->n1)->num)] ;
39     vab[1] = coord[y((face->n2)->num)] - coord[y((face->n1)->num)] ;
40     vab[2] = coord[z((face->n2)->num)] - coord[z((face->n1)->num)] ;
41     dab = NORME(vab) ;
42     vac[0] = coord[x((face->n3)->num)] - coord[x((face->n1)->num)] ;
43     vac[1] = coord[y((face->n3)->num)] - coord[y((face->n1)->num)] ;
44     vac[2] = coord[z((face->n3)->num)] - coord[z((face->n1)->num)] ;
45     dac = NORME(vac) ;
46     vbc[0] = coord[x((face->n3)->num)] - coord[x((face->n2)->num)] ;
47     vbc[1] = coord[y((face->n3)->num)] - coord[y((face->n2)->num)] ;
48     vbc[2] = coord[z((face->n3)->num)] - coord[z((face->n2)->num)] ;
49     dbc = NORME(vbc) ;
50    
51     hmin = min(dab,dac) ;
52     hmin = min(hmin,dbc) ;
53    
54     hmax = max(dab,dac) ;
55     hmax = max(hmin,dbc) ;
56    
57     elan = hmax/hmin ;
58    
59     if (elan < 2.) hmin = hmin/2. ;
60    
61     tab_xi[x(0)] = xi ;
62     tab_xi[y(0)] = yi ;
63     tab_xi[z(0)] = zi ;
64     /*
65     tab_xi[x(1)] = coord[x((face->n1)->num)] ;
66     tab_xi[y(1)] = coord[y((face->n1)->num)] ;
67     tab_xi[z(1)] = coord[z((face->n1)->num)] ;
68    
69     tab_xi[x(2)] = coord[x((face->n2)->num)] ;
70     tab_xi[y(2)] = coord[y((face->n2)->num)] ;
71     tab_xi[z(2)] = coord[z((face->n2)->num)] ;
72    
73     tab_xi[x(3)] = coord[x((face->n3)->num)] ;
74     tab_xi[y(3)] = coord[y((face->n3)->num)] ;
75     tab_xi[z(3)] = coord[z((face->n3)->num)] ;
76     */
77    
78     /* calcul du critere 2 D */
79     pvec[0] = PVECX(vab,vac) ;
80     pvec[1] = PVECY(vab,vac) ;
81     pvec[2] = PVECZ(vab,vac) ;
82     /* determination du critere */
83    
84     perimetre = dab + dbc + dac ;
85     hauteur = perimetre/3. ;
86    
87     vn[0] = PVECX(vab,vac) ;
88     vn[1] = PVECY(vab,vac) ;
89     vn[2] = PVECZ(vab,vac) ;
90    
91     norme = NORME(vn) ;
92    
93     for (i=0;i<3;i++) vn[i] = vn[i]/norme ;
94    
95     /* strategie de generation */
96     /* si la face de recherche a deja ete construite en generant un point, on peut boucler */
97     /* creation du noeud */
98     noe_g = m3d_c_noe() ;
99     if (noe_g == NULL) return(FAUX) ;
100     i = 0 ;
101     j = 0 ;
102     val = 10 ;
103     while (j<3)/* on fait varier la hauteur */
104     {
105     switch (j)
106     {
107     case 0 :
108     val = (face->tab).val0 ;
109     break ;
110     case 1 :
111     val = (face->tab).val1 ;
112     break ;
113     case 2 :
114     val = (face->tab).val2 ;
115     break ;
116     case 3 :
117     val = (face->tab).val3 ;
118     break ;
119     default :
120     return(FAUX) ;
121     }
122     if (val==0)
123     {
124     h = hmin/(5*j+1.) ;
125     coord[x(noe_g->num)] = tab_xi[x(i)] + h * vn[0] ;
126     coord[y(noe_g->num)] = tab_xi[y(i)] + h * vn[1] ;
127     coord[z(noe_g->num)] = tab_xi[z(i)] + h * vn[2] ;
128     /* ----------------------------------------------------------- */
129     /* remarque : on ne cree le noeud que si le noeud est SOLUTION */
130     /* ----------------------------------------------------------- */
131     ierr = FAUX ;
132     crit = m3d_e_qual(coord,(face->n1)->num,(face->n2)->num,(face->n3)->num,noe_g->num) ;
133     if (crit>critere)
134     {
135     test_inter = m3d_cpfront(coord,face,noe_g,&ierr) ;
136     if (ierr == VRAI)
137     {
138     return(FAUX) ;
139     }
140     if (test_inter==FAUX)
141     /* on a trouve un noeud solution */
142     {
143     oct = NULL ;
144     m3d_io_noe(coord+3*(noe_g->num),gest->root,&oct,&ierr) ;
145     if (ierr == VRAI)
146     {
147     if (debug)
148     {
149     sprintf(mess,"%s\n"," Erreur m3d_io_noe M3D_GENE ") ;
150     //aff_text(mess);
151     sprintf(mess,"xg:%f yg:%fzg:%f\n",coord[x(noe_g->num)],coord[y(noe_g->num)],coord[z(noe_g->num)]);
152     //aff_text(mess);
153     }
154     return(FAUX) ;
155     }
156     if (oct == NULL)
157     {
158     if (debug)
159     {
160     sprintf(mess,"%s\n"," Erreur m3d_io_noe M3D_GENE ") ;
161     //aff_text(mess);
162     sprintf(mess,"%s\n"," Aucun oct trouve M3D_GENE ") ;
163     //aff_text(mess);
164     sprintf(mess," xg:%f yg:%f zg:%f\n",coord[x(noe_g->num)],coord[y(noe_g->num)],coord[z(noe_g->num)]) ;
165     //aff_text(mess);
166     }
167     m3d_erreur(ERR_SYST) ;
168     return(FAUX) ;
169     }
170     /* chainage noeud octree */
171     /* insertion en tete */
172     noe_g->suivant = oct->lis_noe ;
173     oct->lis_noe = noe_g ;
174     noe_g->oct = oct ;
175     *nresu = noe_g ;
176     if (face->hist == 0) *hist = PROCHE ;
177     else *hist = GENERATION ;
178     switch (j)
179     {
180     case 0 :
181     (face->tab).val0 = 1 ;
182     break ;
183     case 1 :
184     (face->tab).val1 = 1 ;
185     break ;
186     case 2 :
187     (face->tab).val2 = 1 ;
188     break ;
189     case 3 :
190     (face->tab).val3 = 1 ;
191     break ;
192     }
193     return(VRAI) ;
194     }
195     }
196     }
197     j++ ;
198     }
199     /* le noeud n'est pas solution, on ne l'utilise pas */
200     gest->nb_noeud = gest->nb_noeud - 1 ;
201     *nresu=NULL ;
202     return(VRAI) ;
203     }