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

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