ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/acismesh/m2d_gen_noe.cpp
Revision: 1
Committed: Mon Jun 11 22:53:07 2007 UTC (17 years, 11 months ago)
File size: 8113 byte(s)
Log Message:

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     m2d_gen_noe.c Type:Func
4    
5     Generation d un noeud
6    
7     Date de creation : Thu Feb 20 16:15:20 1997
8    
9     Derniere version : Wed May 28 11:49:31 1997
10    
11    
12    
13    
14    
15    
16    
17    
18     Vincent FRANCOIS
19    
20     *****************************************************************/
21    
22    
23    
24    
25    
26     /**************************/
27     /* include */
28     #include <stdio.h>
29     #include <string.h>
30     #include <math.h>
31     #include <stdlib.h>
32     #include "const.h"
33     #include "memoire.h"
34     #include "struct.h"
35     #include "prototype.h"
36    
37    
38     /**************************/
39     /* variables globales */
40     extern struct environnement env;
41     extern struct s_mesh *mesh;
42     extern struct s_acis *acis;
43    
44    
45    
46     /**************************/
47     /* programme principal */
48    
49     int m2d_gen_noe(struct s_face *face,struct s_front *ele,struct s_front **ele2,int *numo)
50     {
51     struct s_plane *plane;
52     struct s_noeud *no1,*no2,*no,*noc1,*noc2;
53     struct s_front *ft,*ftref;
54     struct s_quadtree *quad,**liste,*quad_depart;
55     float du,dv,u1,v1,u2,v2,d1a,d1b,d22,d2,d,teta,ui,vi,t,ti,tii,uu,vv;
56     float w[4],vec[4],n[4];
57     float e,f,g,nume,deno,long_reel,up,vp,terme1,terme2,u,v,x,y,z;
58     float lg_min,alpharef=0.,alpha,dref,dis,uc1,vc1,uc2,vc2,d1,uref,vref,disref;
59     float vec2[4],vec1[4],v2p[4],cosa,sina;
60     int nref,nb_liste,*test_quad,*test_front;
61     int i,j,ok,pass;
62    
63     plane=NULL;
64     if (strcmp(acis->type_entite[face->surface],"plane-surface")==0)
65     plane=(struct s_plane *)acis->entity[face->surface];
66     w[0]=0.;w[1]=0.;w[2]=1.;
67     no1=ADRESSE(ele->n1,noeud,mesh->);
68     no2=ADRESSE(ele->n2,noeud,mesh->);
69    
70     if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-no1->u; else du=0.;
71     if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-no1->v; else dv=0.;
72    
73     eval_decale(&u1,du,no1->u,U);
74     eval_decale(&v1,dv,no1->v,V);
75     eval_decale(&u2,du,no2->u,U);
76     eval_decale(&v2,dv,no2->v,V);
77     vec[0]=u2-u1;
78     vec[1]=v2-v1;
79     vec[2]=0.;
80     PVEC(n,w,vec);
81     NORME(vec);
82     NORME(n);
83     d1a=0.5*(no1->dens+no2->dens);
84     d1b=ele->seg->longueur;
85     d=0.35*d1a+0.65*d1b;
86     d22=d*d-d1b*d1b/4.;
87     d2=(float)sqrt((double)d22);
88     d2=d2/ele->etat;
89     ui=0.5*(u1+u2);
90     vi=0.5*(v1+v2);
91    
92    
93     /* calcul de u,v decale de du dv */
94     if (plane!=NULL)
95     {
96     u=ui+d2*n[0];
97     v=vi+d2*n[1];
98     }
99     else
100     {
101     e=eval_face(face,&ui,&vi,E,&x,&y,&z,du,dv);
102     f=eval_face(face,&ui,&vi,F,&x,&y,&z,du,dv);
103     g=eval_face(face,&ui,&vi,G,&x,&y,&z,du,dv);
104     nume=e*(u2-u1)*(u2-u1)+g*(v2-v1)*(v2-v1)+2*f*(u2-u1)*(v2-v1);
105     deno=(v2-v1)*(u2-u1)*(e-g)+f*((v2-v1)*(v2-v1)-(u2-u1)*(u2-u1));
106     if (EGAL(deno,0.,0.0001)) teta=PI/2.;
107     else teta=(float)atan((double)(nume/deno));
108     if (teta<0.) teta=teta+PI;
109     long_reel=0.;
110     i=0;
111     while (long_reel<d2)
112     {
113     ti=i*1./PAS2;
114     tii=(i+1)*1./PAS2;
115     t=0.7886751347*ti+0.2113248654*tii;
116     u=(float)(ui+vec[0]*(t*cos((double)teta))+n[0]*(t*sin((double)teta)));
117     v=(float)(vi+vec[1]*(t*cos((double)teta))+n[1]*(t*sin((double)teta)));
118     e=eval_face(face,&u,&v,E,&x,&y,&z,du,dv);
119     f=eval_face(face,&u,&v,F,&x,&y,&z,du,dv);
120     g=eval_face(face,&u,&v,G,&x,&y,&z,du,dv);
121     up=(float)(vec[0]*cos((double)teta)+n[0]*sin((double)teta));
122     vp=(float)(vec[1]*cos((double)teta)+n[1]*sin((double)teta));
123     terme1=e*up*up+2*f*up*vp+g*vp*vp;
124     terme1=(float)sqrt((double)terme1);
125     t=0.7886751347*tii+0.2113248654*ti;
126     u=(float)(ui+vec[0]*(t*cos((double)teta))+n[0]*(t*sin((double)teta)));
127     v=(float)(vi+vec[1]*(t*cos((double)teta))+n[1]*(t*sin((double)teta)));
128     e=eval_face(face,&u,&v,E,&x,&y,&z,du,dv);
129     f=eval_face(face,&u,&v,F,&x,&y,&z,du,dv);
130     g=eval_face(face,&u,&v,G,&x,&y,&z,du,dv);
131     up=vec[0]*cos(teta)+n[0]*sin(teta);
132     vp=vec[1]*cos(teta)+n[1]*sin(teta);
133     terme2=e*up*up+2*f*up*vp+g*vp*vp;
134     terme2=(float)sqrt((double)terme2);
135     long_reel=long_reel+0.5/PAS2*(terme1+terme2);
136     i++;
137     }
138     t=d2*tii/long_reel;
139     u=(float)(ui+vec[0]*(t*cos((double)teta))+n[0]*(t*sin((double)teta)));
140     v=(float)(vi+vec[1]*(t*cos((double)teta))+n[1]*(t*sin((double)teta)));
141     }
142    
143     /* recherche d un noeud proche eventuel */
144     dref=d2;
145     nref=(-1);
146     ftref=NULL;
147     /* variable de recherche */
148     test_quad=(int *)calloc(mesh->nb_quadtree,sizeof(int));
149     ERREUR_ALLOC(test_quad);
150     liste=(struct s_quadtree **)calloc(mesh->nb_quadtree+1,sizeof(struct s_quadtree *));
151     ERREUR_ALLOC(liste);
152     test_front=(int *)calloc(mesh->nb_front_tot,sizeof(int));
153     ERREUR_ALLOC(test_front);
154     nb_liste=0;
155     eval_decale(&uu,-du,u,U);
156     eval_decale(&vv,-dv,v,V);
157     qu_rechercher(u-du,v-dv,0.,mesh->root,liste,&nb_liste);
158     quad_depart=liste[0];
159     MAXI(dis,quad_depart->t_u,quad_depart->t_v);
160     dis=dis/2.;
161     ok=0;
162     disref=mesh->root->t_u*mesh->root->t_u+mesh->root->t_v*mesh->root->t_v;
163     while (ok==0)
164     {
165     nb_liste=0;
166     qu_rechercher(u-du,v-dv,disref,mesh->root,liste,&nb_liste);
167     pass=0;
168     for (i=0;i<nb_liste;i++)
169     {
170     quad=liste[i];
171     if (test_quad[quad->num]==0)
172     {
173     for (j=0;j<quad->nb_front;j++)
174     {
175     ft=quad->front[j];
176     if ((test_front[ft->num]==0)&&((ft->n1!=0)||(ft->n2!=0)))
177     {
178     test_front[ft->num]=1;
179     noc1=ADRESSE(ft->n1,noeud,mesh->);
180     noc2=ADRESSE(ft->n2,noeud,mesh->);
181     eval_decale(&uc1,du,noc1->u,U);
182     eval_decale(&vc1,dv,noc1->v,V);
183     eval_decale(&uc2,du,noc2->u,U);
184     eval_decale(&vc2,dv,noc2->v,V);
185     d1=eval_distance(face,u,v,uc1,vc1,du,dv);
186     if ((d1<dref)||(noc1->num==nref))
187     {
188     if (noc1->num!=ele->n1)
189     if (noc1->num!=ele->n2)
190     if (noc1->num==nref)
191     {
192     vec2[0]=uc2-uc1;
193     vec2[1]=vc2-vc1;
194     vec2[2]=0.;
195     NORME(vec2);
196     cosa=PSCA(vec1,vec2);
197     sina=(-1)*PSCA(vec2,v2p);
198     if (cosa>1.) cosa=1.;
199     if (cosa<-1.) cosa=(-1.);
200     alpha=(float)acos((double)cosa);
201     if (sina<(-0.0001)) alpha=(-alpha);
202     if (alpha<0.) alpha=alpha+2*PI;
203     if (alpha<alpharef)
204     {
205     ftref=ft;
206     alpharef=alpha;
207     }
208     }
209     else
210     {
211     vec1[0]=u1-uc1;
212     vec1[1]=v1-vc1;
213     vec1[2]=0.;
214     vec2[0]=uc2-uc1;
215     vec2[1]=vc2-vc1;
216     vec2[2]=0.;
217     PVEC(v2p,w,vec1);
218     NORME(vec1);
219     NORME(vec2);
220     NORME(v2p);
221     cosa=PSCA(vec1,vec2);
222     sina=(-1)*PSCA(vec2,v2p);
223     if (cosa>1.) cosa=1.;
224     if (cosa<-1.) cosa=(-1.);
225     alpharef=(float)acos((double)cosa);
226     if (sina<(-0.0001)) alpharef=(-alpharef);
227     if (alpharef<0.) alpharef=alpharef+2*PI;
228     dref=d1;
229     nref=noc1->num;
230     ftref=ft;
231     }
232     }
233     if (pass==0)
234     {
235     lg_min=d1;
236     pass=1;
237     }
238     if (d1<lg_min) lg_min=d1;
239     }
240     }
241     test_quad[quad->num]=1;
242     }
243     }
244     if (lg_min>d2) ok=1; else dis=dis*1.25;
245     if (dis*dis>disref) ok=1;
246     }
247     free(liste);
248     free(test_front);
249     free(test_quad);
250    
251     if (ftref!=NULL)
252     {
253     no=ADRESSE(nref,noeud,mesh->);
254     eval_decale(&uref,du,no->u,U);
255     eval_decale(&vref,dv,no->v,V);
256     d1=eval_distance(face,ui,vi,uref,vref,0.,0.);
257     if (d1<1.5*d2)
258     {
259     *ele2=ftref;
260     *numo=nref;
261     return(2);
262     }
263     }
264     eval_decale(&uref,-du,u,U);
265     eval_decale(&vref,-dv,v,V);
266     NEW_ENTITE(no,noeud,mesh->);
267     no->num=mesh->nb_noeud-1;
268     no->creation=CONSTRUIT;
269     no->type=FACE;
270     no->num_ent=face->num;
271     no->u=uref;
272     no->v=vref;
273     no->dens=eval_fdn2b(face,uref,vref,TOTAL);
274     eval_face(face,&uref,&vref,FONCTION,&no->x,&no->y,&no->z,0.,0.);
275     *ele2=NULL;
276     *numo=no->num;
277     return(1);
278     }