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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     eval_fdn2a.c Type:func
4    
5     Calcul de la densite en un point u,v pour un plan
6    
7     Date de creation : Tue Feb 18 10:01:34 1997
8    
9     Derniere version : Mon Jun 30 12:04:05 1997
10    
11    
12    
13    
14    
15    
16    
17    
18    
19    
20    
21     Vincent FRANCOIS
22    
23     *****************************************************************/
24    
25    
26    
27    
28    
29     /**************************/
30     /* include */
31     #include <stdio.h>
32     #include <string.h>
33     #include <stdlib.h>
34     #include "const.h"
35     #include "memoire.h"
36     #include "struct.h"
37     #include "prototype.h"
38    
39    
40     /**************************/
41     /* variables globales */
42     extern struct environnement env;
43     extern struct s_mesh *mesh;
44    
45    
46    
47     /**************************/
48     /* programme principal */
49    
50     float eval_fdn2a(struct s_face *face,float u,float v)
51     {
52     float du,dv;
53     int *test_quad,*test_frontiere;
54     struct s_quadtree **liste,*quad_depart,*quad;
55     struct s_frontiere *fr;
56     int nb_liste,numseg,ok,i,j,pass,num;
57     float dis,u1,v1,u2,v2,p1,p2,eps,det,ui,vi,d,lg_min,dista[100],densi[100];
58     float nume,deno,dens,dismin,disref;
59    
60    
61     /* calcul du decalage local */
62     if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-u; else du=0.;
63     if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-v; else dv=0.;
64     eval_decale(&u1,du,u,U);
65     eval_decale(&v1,dv,v,V);
66     u=u1;v=v1;
67     /* variable de recherche */
68     test_quad=(int *)calloc(mesh->nb_quadtree,sizeof(int));
69     ERREUR_ALLOC(test_quad);
70     liste=(struct s_quadtree **)calloc(mesh->nb_quadtree+1,sizeof(struct s_quadtree *));
71     ERREUR_ALLOC(test_quad);
72     test_frontiere=(int *)calloc(mesh->nb_frontiere,sizeof(int));
73     ERREUR_ALLOC(test_frontiere);
74    
75     /* recherche des frontieres proche du point u,v */
76     nb_liste=0;
77     qu_rechercher(u-du,v-dv,0.,mesh->root,liste,&nb_liste);
78     quad_depart=liste[0];
79     MAXI(dis,quad_depart->t_u,quad_depart->t_v);
80     dis=dis/2.;
81     numseg=0;
82     ok=0;
83     disref=mesh->root->t_u*mesh->root->t_u+mesh->root->t_v*mesh->root->t_v;
84     while (ok==0)
85     {
86     nb_liste=0;
87     qu_rechercher(u-du,v-dv,dis,mesh->root,liste,&nb_liste);
88     pass=0;
89     for (i=0;i<nb_liste;i++)
90     {
91     quad=liste[i];
92     if (test_quad[quad->num]==0)
93     {
94     for (j=0;j<quad->nb_frontiere;j++)
95     {
96     fr=quad->frontiere[j];
97     if (test_frontiere[fr->num]==0)
98     {
99     test_frontiere[fr->num]=1;
100     eval_decale(&u1,du,fr->no1->u,LIBRE);
101     eval_decale(&v1,dv,fr->no1->v,LIBRE);
102     eval_decale(&u2,du,fr->no2->u,LIBRE);
103     eval_decale(&v2,dv,fr->no2->v,LIBRE);
104     p1=(u2-u1)*(u-u1)+(v2-v1)*(v-v1);
105     p2=(u1-u2)*(u-u2)+(v1-v2)*(v-v2);
106     eps=0.0001*(u1-u2)*(u1-u2)+0.0001*(v1-v2)*(v1-v2);
107     if ((p1>(-eps)) && (p2>(-eps)))
108     {
109     det=(u1-u2)*(u1-u2)+(v1-v2)*(v1-v2);
110     ui=(u1*(v2-v1)*(v2-v1)+(u1-u2)*(v2-v1)*(v1-v)+u*(u1-u2)*(u1-u2))/det;
111     vi=(v1*(u1-u2)*(u1-u2)+(u1-u2)*(v1-v2)*(u-u1)+v*(v1-v2)*(v1-v2))/det;
112     d=eval_distance(face,u,v,ui,vi,du,dv);
113     }
114     else d=0.5*(eval_distance(face,u,v,u1,v1,du,dv)+eval_distance(face,u,v,u2,v2,du,dv));
115     if (pass==0)
116     {
117     lg_min=d;
118     pass=1;
119     }
120     if (d<lg_min) lg_min=d;
121     if (d<4*(env.dens-0.5*(fr->no1->dens+fr->no2->dens)))
122     {
123     if (numseg<4)
124     {
125     dista[numseg]=d;
126     densi[numseg]=0.5*(fr->no1->dens+fr->no2->dens);
127     numseg++;
128     }
129     else
130     {
131     if (dista[0]<dista[1]) num=1; else num=0;
132     if (dista[num]<dista[2]) num=2;
133     if (dista[num]<dista[3]) num=3;
134     if (d<dista[num])
135     {
136     dista[num]=d;
137     densi[num]=0.5*(fr->no1->dens+fr->no2->dens);
138     }
139     }
140     }
141     }
142     }
143     test_quad[quad->num]=1;
144     }
145     }
146     dis=dis*1.25;
147     if (lg_min>4*env.dens) ok=1;
148     if (dis*dis>disref) ok=1;
149     }
150    
151     free(test_quad);
152     free(test_frontiere);
153     free(liste);
154     if (numseg==0) dens=env.dens;
155     else
156     {
157     dismin=dista[0];
158     for (i=1;i<numseg;i++)
159     MINI(dismin,dismin,dista[i]);
160     nume=0.;
161     deno=0.;
162     for (i=0;i<numseg;i++)
163     {
164     nume=nume+(4*env.dens-dista[i])*densi[i];
165     deno=deno+4*env.dens-dista[i];
166     }
167     nume=nume+dismin*env.dens;
168     deno=deno+dismin;
169     dens=nume/deno;
170     }
171     return(dens);
172     }