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