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

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