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

File Contents

# Content
1 /*****************************************************************
2
3 eval_fdn1.c Type:Func
4
5 Calcul de la fonction de densite pour approcher une courbe a epsilon
6
7 Date de creation : Thu Nov 28 18:50:42 1996
8
9 Derniere version : Tue Jun 3 13:32:09 1997
10
11
12
13
14
15
16
17
18 Vincent FRANCOIS
19
20 *****************************************************************/
21
22
23
24
25
26 /**************************/
27 /* include */
28 #include <stdio.h>
29 #include <string.h>
30 #include <math.h>
31 #include <stdlib.h>
32 #include "const.h"
33 #include "struct.h"
34 #include "memoire.h"
35 #include "prototype.h"
36
37
38 /**************************/
39 /* variables globales */
40 extern struct s_param *para;
41 extern struct environnement env;
42 extern struct s_acis *acis;
43
44 /**************************/
45 /* programme principal */
46
47 float eval_fdn1(struct s_edge *edge,float t)
48 {
49 float dens,dens1,dis,tt;
50 struct s_edge *edge_tmp;
51 struct s_straight *straight;
52 struct s_ellipse *ellipse;
53 float coord[3],l,vec[3],par[2];
54 int i,j,num;
55
56 dens=eval_fdn1_eps(edge,t);
57 if (strcmp(acis->type_entite[edge->curve],"ellipse-curve")==0)
58 {
59 ellipse=(struct s_ellipse *)acis->entity[edge->curve];
60 l=(ellipse->param->a+ellipse->param->b)/2.*edge->t2;
61 }
62 if (strcmp(acis->type_entite[edge->curve],"straight-curve")==0)
63 {
64 straight=(struct s_straight *)acis->entity[edge->curve];
65 memcpy(vec,straight->param->dir,3*sizeof(float));
66 NORME(vec);
67 l=vec[3]*edge->t2;
68 }
69
70
71 if (edge->dens_influ==NULL)
72 {
73 /* les liaisons d influences des edges sont elles completes */
74 for (j=0;j<acis->nb_edge;j++)
75 {
76 if (edge->rap_edge[j]==0)
77 {
78 edge_tmp=ADRESSE(j,edge,acis->);
79 eval_mindis_edge_edge(edge_tmp,edge,&dis,par);
80 /* validite de la recherche ???? */
81 if ((dis<4*env.dens) && (edge_tmp!=edge))
82 {
83 edge->rap_edge[j]=1;
84 edge_tmp->rap_edge[edge->num_edge]=1;
85 }
86 else
87 {
88 edge->rap_edge[j]=-1;
89 edge_tmp->rap_edge[edge->num_edge]=-1;
90 }
91 }
92 }
93 num=(int)(l/env.dens+3);
94 edge->nb_dens=num;
95 edge->dens_influ=(float *)calloc(edge->nb_dens,sizeof(float));
96 ERREUR_ALLOC(edge->dens_influ);
97 for (j=0;j<edge->nb_dens;j++)
98 {
99 voir();
100 edge->dens_influ[j]=l*10000.;
101 eval_edge(edge,edge->t1+edge->t2*j/(edge->nb_dens-1),FONCTION,coord);
102 for (i=0;i<acis->nb_edge;i++)
103 {
104 if (edge->rap_edge[i]==1)
105 {
106 edge_tmp=ADRESSE(i,edge,acis->);
107 eval_mindis_edge(edge_tmp,coord,&dis,&tt);
108 dens1=eval_fdn1_eps(edge_tmp,tt);
109 MINI(edge->dens_influ[j],edge->dens_influ[j],(dens1+dis/4.));
110 }
111 }
112 }
113
114 }
115 eval_edge(edge,t,FONCTION,coord);
116
117 i=(int)floor((double)((t-edge->t1)*(edge->nb_dens-1)/edge->t2));
118 if (i!=edge->nb_dens-1) dens1=(t-edge->t1-i*edge->t2/(edge->nb_dens-1))*(edge->dens_influ[i+1]-edge->dens_influ[i])*(edge->nb_dens-1)/edge->t2+edge->dens_influ[i];
119 else dens1=edge->dens_influ[edge->nb_dens-1];
120
121 MINI(dens,dens,dens1);
122 return(dens);
123 }