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

# Content
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 }