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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     m1d_dis.c Type:func
4    
5     discretisation des edges
6    
7     Date de creation : Fri Nov 29 15:23:59 1996
8    
9     Derniere version : Tue Jun 3 13:26:21 1997
10    
11    
12    
13    
14    
15    
16     Vincent FRANCOIS
17    
18     *****************************************************************/
19    
20    
21    
22    
23    
24     /**************************/
25     /* include */
26     #include <stdio.h>
27     #include <string.h>
28     #include <math.h>
29     #include <stdlib.h>
30     #include "const.h"
31     #include "struct.h"
32     #include "memoire.h"
33     #include "prototype.h"
34    
35    
36     /**************************/
37     /* variables globales */
38     extern struct s_param *para;
39     extern struct environnement env;
40     extern struct s_acis *acis;
41     extern struct s_mesh *mesh;
42    
43    
44    
45     /**************************/
46     /* programme principal */
47    
48     void m1d_dis(void)
49     {
50     struct s_edge *edge;
51     struct s_straight *straight;
52     struct s_ellipse *ellipse;
53     struct s_segment *seg;
54     struct s_noeud *no,*no1,*no2;
55     int i,j,num;
56     float a,inf,dens,l,vec[4],coord[4];
57     float t,ti,tii,aprec,tprec,limit;
58     int n1,n2,n,noe,pointe;
59    
60    
61     for (i=0;i<acis->nb_edge;i++)
62     {
63     voir();
64     edge=ADRESSE(i,edge,acis->);
65     if (strcmp(acis->type_entite[edge->curve],"straight-curve")==0)
66     {
67     straight=(struct s_straight *)acis->entity[edge->curve];
68     memcpy(vec,straight->param->dir,3*sizeof(float));
69     NORME(vec);
70     l=vec[3]*edge->t2;
71     }
72     if (strcmp(acis->type_entite[edge->curve],"ellipse-curve")==0)
73     {
74     ellipse=(struct s_ellipse *)acis->entity[edge->curve];
75     l=(ellipse->param->a+ellipse->param->b)/2*edge->t2;
76     }
77     num=(int)(edge->t2/PI*36)+1;
78     for (j=0;j<num+1;j++)
79     {
80     dens=eval_fdn1(edge,edge->t1+j*1./num*edge->t2);
81     if (j==0) inf=dens;
82     else if (dens<inf) inf=dens;
83     }
84     num=(int)(10*l/inf)+1;
85     a=0.;
86     for (j=0;j<num;j++)
87     {
88     voir();
89     ti=edge->t1+edge->t2*j/num;
90     tii=edge->t1+edge->t2*(j+1)/num;
91     t=0.7886751345*ti+0.2113248654*tii;
92     eval_edge(edge,t,DERIVE,coord);
93     a=a+(float)sqrt(coord[0]*coord[0]+coord[1]*coord[1]+coord[2]*coord[2])/eval_fdn1(edge,t);
94     t=0.7886751345*tii+0.2113248654*ti;
95     eval_edge(edge,t,DERIVE,coord);
96     a=a+(float)sqrt(coord[0]*coord[0]+coord[1]*coord[1]+coord[2]*coord[2])/eval_fdn1(edge,t);
97     }
98     a=a*edge->t2/num/2;
99     n=(int)floor((double)a);
100     if (a-floor((double)a)>0.5) n++;
101     if (n<1) n=1;
102     limit=a/(float)n;
103     j=0;
104     a=0.;
105     if (edge->sense==0) n1=edge->start_vertex->noeud->num;
106     else n1=edge->end_vertex->noeud->num;
107     for (noe=0;noe<n;noe++)
108     {
109     if (noe!=n-1)
110     {
111     while (a<limit)
112     {
113     voir();
114     aprec=a;
115     tprec=tii;
116     ti=edge->t1+edge->t2*j/num;
117     tii=edge->t1+edge->t2*(j+1)/num;
118     t=0.7886751345*ti+0.2113248654*tii;
119     eval_edge(edge,t,DERIVE,coord);
120     a=a+edge->t2/num/2*(float)sqrt(coord[0]*coord[0]+coord[1]*coord[1]+coord[2]*coord[2])/eval_fdn1(edge,t);
121     t=0.7886751345*tii+0.2113248654*ti;
122     eval_edge(edge,t,DERIVE,coord);
123     a=a+edge->t2/num/2*(float)sqrt(coord[0]*coord[0]+coord[1]*coord[1]+coord[2]*coord[2])/eval_fdn1(edge,t);
124     j++;
125     }
126     t=tprec+(tii-tprec)*(limit-aprec)/(a-aprec);
127     NEW_ENTITE(no,noeud,mesh->);
128     no->num=mesh->nb_noeud-1;
129     eval_edge(edge,t,FONCTION,coord);
130     no->x=coord[0];
131     no->y=coord[1];
132     no->z=coord[2];
133     no->dens=env.dens;
134     no->type=EDGE;
135     no->num_ent=edge->num;
136     no->pos=t;
137     n2=no->num;
138     }
139     else
140     if (edge->sense==0) n2=edge->end_vertex->noeud->num;
141     else n2=edge->start_vertex->noeud->num;
142     NEW_ENTITE(seg,segment,mesh->);
143     seg->num=mesh->nb_segment-1;
144     seg->n1=n1;
145     seg->n2=n2;
146     seg->type=EDGE;
147     seg->num_ent=edge->num;
148     no=ADRESSE(seg->n1,noeud,mesh->);
149     NEW_POINTEUR(pointe,segment,no->);
150     no->segment[pointe]=seg;
151     no=ADRESSE(seg->n2,noeud,mesh->);
152     NEW_POINTEUR(pointe,segment,no->);
153     no->segment[pointe]=seg;
154     NEW_POINTEUR(pointe,segment,edge->);
155     edge->segment[pointe]=seg;
156     n1=n2;
157     a=a-limit;
158     no1=ADRESSE(seg->n1,noeud,mesh->);
159     no2=ADRESSE(seg->n2,noeud,mesh->);
160     VEC(vec,no1,no2);
161     seg->longueur=(float)sqrt(PSCA(vec,vec));
162     }
163     }
164    
165    
166     }