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

# User Rev Content
1 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     }