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

File Contents

# Content
1 /*****************************************************************
2
3 geo_point_interieur.cpp Type:Func
4
5 Position d un point sur une face
6
7 Date de creation : 14-8-1997 15 :40 :14
8 Derniere version : 14-8-1997 15 :40 :14
9
10 Vincent FRANCOIS
11
12 *****************************************************************/
13
14
15
16
17
18 /**************************/
19 /* include */
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <math.h>
24 #include "const.h"
25 #include "memoire.h"
26 #include "struct.h"
27 #include "prototype.h"
28
29 /**************************/
30 /* variables globales */
31 extern struct environnement env;
32 extern struct s_mesh *mesh;
33 extern struct s_maillage *maillage;
34 extern struct s_acis *acis;
35
36
37
38 /**************************/
39 /* programme principal */
40
41 int geo_point_interieur(float u,float v)
42 {
43 float du,dv,duu,dvv;
44 int *test_quad,*test_front;
45 struct s_quadtree **liste,*quad_depart,*quad;
46 struct s_front *fr,*fref,*ftp,*ft,*fts;
47 struct s_noeud *no1,*no2,*nop,*nos;
48 int nb_liste,ok,i,j,pass,type,typeref;
49 float dis,u1,v1,u2,v2,u2tmp,v2tmp,us,vs,up,vp,p1,p2,eps,det,ui,vi,d,lg_min;
50 float w[4],pn1[4],n1n2[4],n2s[4],npn1[4],nn1n2[4],nn2s[4];
51 float vecp[4],vec[4],vecs[4];
52
53 w[0]=0.;w[1]=0.;w[2]=1.;
54 /* cherche de l element du front le plus proche */
55 /* calcul du decalage local */
56 if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-u; else du=0.;
57 if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-v; else dv=0.;
58 eval_decale(&u1,du,u,U);
59 eval_decale(&v1,dv,v,V);
60 u=u1;v=v1;
61 /* variable de recherche */
62 test_quad=(int *)calloc(mesh->nb_quadtree+1,sizeof(int));
63 ERREUR_ALLOC(test_quad);
64 liste=(struct s_quadtree **)calloc(mesh->nb_quadtree+1,sizeof(struct s_quadtree *));
65 ERREUR_ALLOC(test_quad);
66 test_front=(int *)calloc(mesh->nb_front+1,sizeof(int));
67 ERREUR_ALLOC(test_front);
68
69 /* recherche des frontieres proche du point u,v */
70 nb_liste=0;
71 qu_rechercher(u-du,v-dv,0.,mesh->root,liste,&nb_liste);
72 if (nb_liste==0) return(0);
73 quad_depart=liste[0];
74 MAXI(dis,quad_depart->t_u,quad_depart->t_v);
75 dis=dis/2.;
76 fref=NULL;
77 ok=0;
78 while (ok<2)
79 {
80 nb_liste=0;
81 qu_rechercher(u-du,v-dv,dis,mesh->root,liste,&nb_liste);
82 pass=0;
83 for (i=0;i<nb_liste;i++)
84 {
85 quad=liste[i];
86 if (test_quad[quad->num]==0)
87 {
88 for (j=0;j<quad->nb_front;j++)
89 {
90 fr=quad->front[j];
91 if (test_front[fr->num]==0)
92 {
93 test_front[fr->num]=1;
94 no1=ADRESSE(fr->seg->n1,noeud,mesh->);
95 no2=ADRESSE(fr->seg->n2,noeud,mesh->);
96 if (mesh->rev_u!=0.) duu=0.5*mesh->rev_u-no1->u; else duu=0.;
97 if (mesh->rev_v!=0.) dvv=0.5*mesh->rev_v-no1->v; else dvv=0.;
98 eval_decale(&u2,duu,no2->u,U);
99 eval_decale(&v2,dvv,no2->v,V);
100 u2=u2-duu;
101 v2=v2-dvv;
102 eval_decale(&u1,du,no1->u,LIBRE);
103 eval_decale(&v1,dv,no1->v,LIBRE);
104 eval_decale(&u2tmp,du,u2,LIBRE);
105 eval_decale(&v2tmp,dv,v2,LIBRE);
106 u2=u2tmp;
107 v2=v2tmp;
108 /*eval_decale(&u1,du,no1->u,LIBRE);
109 eval_decale(&v1,dv,no1->v,LIBRE);
110 eval_decale(&u2,du,no2->u,LIBRE);
111 eval_decale(&v2,dv,no2->v,LIBRE);*/
112 p1=(u2-u1)*(u-u1)+(v2-v1)*(v-v1);
113 p2=(u1-u2)*(u-u2)+(v1-v2)*(v-v2);
114 eps=0.0001*(u1-u2)*(u1-u2)+0.0001*(v1-v2)*(v1-v2);
115 type=2;
116 if ((p1>(-eps)) && (p2>(-eps)))
117 {
118 det=(u1-u2)*(u1-u2)+(v1-v2)*(v1-v2);
119 ui=(u1*(v2-v1)*(v2-v1)+(u1-u2)*(v2-v1)*(v1-v)+u*(u1-u2)*(u1-u2))/det;
120 vi=(v1*(u1-u2)*(u1-u2)+(u1-u2)*(v1-v2)*(u-u1)+v*(v1-v2)*(v1-v2))/det;
121 d=(float)sqrt((double)((u-ui)*(u-ui)+(v-vi)*(v-vi)));
122 type=1;
123 }
124 else d=(float)(0.5*((sqrt((double)((u-u1)*(u-u1)+(v-v1)*(v-v1))))+(sqrt((double)((u-u2)*(u-u2)+(v-v2)*(v-v2))))));
125 if (pass==0)
126 {
127 pass=1;
128 lg_min=d;
129 fref=fr;
130 typeref=type;
131 }
132 else if (d<lg_min)
133 {
134 lg_min=d;
135 fref=fr;
136 typeref=type;
137 }
138 }
139 }
140 test_quad[quad->num]=1;
141 }
142 }
143 dis=dis*1.25;
144 if ((fref!=NULL) && (ok==0)) ok=1;
145 if (ok==1) ok=2;
146 }
147
148 free(test_quad);
149 free(test_front);
150 free(liste);
151
152 /* es t on a l interieur */
153 ft=fref;
154 fts=ft->suiv;
155 ftp=ft->prec;
156 nop=ADRESSE(ftp->n1,noeud,mesh->);
157 no1=ADRESSE(ft->n1,noeud,mesh->);
158 no2=ADRESSE(ft->n2,noeud,mesh->);
159 nos=ADRESSE(fts->n2,noeud,mesh->);
160 if (mesh->rev_u!=0.) duu=0.5*mesh->rev_u-no1->u; else duu=0.;
161 if (mesh->rev_v!=0.) dvv=0.5*mesh->rev_v-no1->v; else dvv=0.;
162 eval_decale(&up,duu,nop->u,U);
163 eval_decale(&vp,dvv,nop->v,V);
164 eval_decale(&u2,duu,no2->u,U);
165 eval_decale(&v2,dvv,no2->v,V);
166 eval_decale(&us,duu,nos->u,U);
167 eval_decale(&vs,dvv,nos->v,V);
168 up=up-duu;
169 vp=vp-dvv;
170 u2=u2-duu;
171 v2=v2-dvv;
172 us=us-duu;
173 vs=vs-dvv;
174 eval_decale(&u1,du,no1->u,LIBRE);
175 eval_decale(&v1,dv,no1->v,LIBRE);
176 eval_decale(&u2tmp,du,u2,LIBRE);u2=u2tmp;
177 eval_decale(&v2tmp,dv,v2,LIBRE);v2=v2tmp;
178 eval_decale(&u2tmp,du,up,LIBRE);up=u2tmp;
179 eval_decale(&v2tmp,dv,vp,LIBRE);vp=v2tmp;
180 eval_decale(&u2tmp,du,us,LIBRE);us=u2tmp;
181 eval_decale(&v2tmp,dv,vs,LIBRE);vs=v2tmp;
182 pn1[0]=u1-up;pn1[1]=v1-vp;pn1[2]=0.;
183 n1n2[0]=u2-u1;n1n2[1]=v2-v1;n1n2[2]=0.;
184 n2s[0]=us-u2;n2s[1]=vs-v2;n2s[2]=0.;
185 PVEC(npn1,w,pn1);
186 PVEC(nn1n2,w,n1n2);
187 PVEC(nn2s,w,n2s);
188 vecp[0]=u-up;vecp[1]=v-vp;vecp[2]=0.;
189 vec[0]=u-u1;vec[1]=v-v1;vec[2]=0.;
190 vecs[0]=u-us;vecs[1]=v-vs;vecs[2]=0.;
191 if (typeref==2)
192 if (PSCA(vecp,npn1)>(0.0001))
193 if (PSCA(vec,nn1n2)>(0.0001))
194 if (PSCA(vecs,nn2s)>(0.0001))
195 return(1);
196 if (typeref==1)
197 if (PSCA(vec,nn1n2)>(-0.0001))
198 return(1);
199
200 return(0);
201 }