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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     qu_ins_obj.c Type:Func
4    
5     insertion d un element dans l'arbre quaternaire
6    
7     Date de creation : Wed Feb 12 12:04:57 1997
8    
9     Derniere version : Fri May 9 08:33:50 1997
10    
11    
12    
13    
14    
15    
16    
17    
18    
19     Vincent FRANCOIS
20    
21     *****************************************************************/
22    
23    
24    
25    
26    
27     /**************************/
28     /* include */
29     #include <stdio.h>
30     #include <string.h>
31     #include "const.h"
32     #include "memoire.h"
33     #include "struct.h"
34     #include "prototype.h"
35    
36    
37     /**************************/
38     /* variables globales */
39     extern struct environnment env;
40     extern struct s_mesh *mesh;
41    
42    
43    
44     /**************************/
45     /* programme principal */
46    
47     void qu_ins_obj(int type,int num,struct s_quadtree *quad)
48     {
49     struct s_noeud *no,*no1,*no2,*no3;
50     struct s_segment *seg;
51     struct s_triangle *tri;
52     struct s_frontiere *fr;
53     struct s_front *ft;
54     float bumin,bvmax,bumax,bvmin,rev_u,rev_v,du,dv;
55     float u1,v1,u2,v2,u3,v3;
56    
57     rev_u=mesh->rev_u;
58     rev_v=mesh->rev_v;
59    
60     if (type==NOEUD)
61     {
62     no=ADRESSE(num,noeud,mesh->);
63     bumin=no->u;
64     bvmin=no->v;
65     bumax=no->u;
66     bvmax=no->v;
67     du=0.;
68     dv=0.;
69     }
70     if (type==SEGMENT)
71     {
72     seg=ADRESSE(num,segment,mesh->);
73     no1=ADRESSE(seg->n1,noeud,mesh->);
74     no2=ADRESSE(seg->n2,noeud,mesh->);
75     if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-no1->u; else du=0.;
76     if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-no1->v; else dv=0.;
77     eval_decale(&u1,du,no1->u,U);
78     eval_decale(&v1,dv,no1->v,V);
79     eval_decale(&u2,du,no2->u,U);
80     eval_decale(&v2,dv,no2->v,V);
81     MINI(bumin,u1,u2);
82     MAXI(bumax,u1,u2);
83     MINI(bvmin,v1,v2);
84     MAXI(bvmax,v1,v2);
85     }
86     if (type==TRIANGLE)
87     {
88     tri=ADRESSE(num,triangle,mesh->);
89     no1=ADRESSE(tri->n1,noeud,mesh->);
90     no2=ADRESSE(tri->n2,noeud,mesh->);
91     no3=ADRESSE(tri->n3,noeud,mesh->);
92     if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-no1->u; else du=0.;
93     if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-no1->v; else dv=0.;
94     eval_decale(&u1,du,no1->u,U);
95     eval_decale(&v1,dv,no1->v,V);
96     eval_decale(&u2,du,no2->u,U);
97     eval_decale(&v2,dv,no2->v,V);
98     eval_decale(&u3,du,no3->u,U);
99     eval_decale(&v3,dv,no3->v,V);
100     MINI(bumin,u1,u2);
101     MINI(bumin,bumin,u3);
102     MAXI(bumax,u1,u2);
103     MAXI(bumax,bumax,u3);
104     MINI(bvmin,v1,v2);
105     MINI(bvmin,bvmin,v3);
106     MAXI(bvmax,v1,v2);
107     MINI(bvmin,bvmin,v3);
108     }
109     if (type==FRONTIERE)
110     {
111     fr=ADRESSE(num,frontiere,mesh->);
112     no1=fr->no1;
113     no2=fr->no2;
114     if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-no1->u; else du=0.;
115     if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-no1->v; else dv=0.;
116     eval_decale(&u1,du,no1->u,U);
117     eval_decale(&v1,dv,no1->v,V);
118     eval_decale(&u2,du,no2->u,U);
119     eval_decale(&v2,dv,no2->v,V);
120     MINI(bumin,u1,u2);
121     MAXI(bumax,u1,u2);
122     MINI(bvmin,v1,v2);
123     MAXI(bvmax,v1,v2);
124     }
125     if (type==FRONT)
126     {
127     ft=ADRESSE(num,front,mesh->);
128     no1=ADRESSE(ft->n1,noeud,mesh->);
129     no2=ADRESSE(ft->n2,noeud,mesh->);
130     if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-no1->u; else du=0.;
131     if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-no1->v; else dv=0.;
132     eval_decale(&u1,du,no1->u,U);
133     eval_decale(&v1,dv,no1->v,V);
134     eval_decale(&u2,du,no2->u,U);
135     eval_decale(&v2,dv,no2->v,V);
136     MINI(bumin,u1,u2);
137     MAXI(bumax,u1,u2);
138     MINI(bvmin,v1,v2);
139     MAXI(bvmax,v1,v2);
140     }
141     /* recaler la boite */
142     bumin=bumin-du;
143     bumax=bumax-du;
144     bvmin=bvmin-dv;
145     bvmax=bvmax-dv;
146     if ((rev_u==0.)&&(rev_v==0.))
147     {
148     qu_parcour2(bumin,bvmin,bumax,bvmax,quad,type,num);
149     return;
150     }
151     if ((rev_u!=0.)&&(rev_v==0.))
152     {
153     if ((bumin>=0.) && (bumax<rev_u))
154     {
155     qu_parcour2(bumin,bvmin,bumax,bvmax,quad,type,num);
156     return;
157     }
158     if (bumin<0.)
159     {
160     qu_parcour2(0.,bvmin,bumax,bvmax,quad,type,num);
161     qu_parcour2(bumin+rev_u,bvmin,rev_u,bvmax,quad,type,num);
162     return;
163     }
164     if (bumax>=rev_u)
165     {
166     qu_parcour2(bumin,bvmin,rev_u,bvmax,quad,type,num);
167     qu_parcour2(0.,bvmin,bumax-rev_u,bvmax,quad,type,num);
168     return;
169     }
170     }
171     if ((rev_u==0.)&&(rev_v!=0.))
172     {
173     if ((bvmin>=0.) && (bvmax<rev_v))
174     {
175     qu_parcour2(bumin,bvmin,bumax,bvmax,quad,type,num);
176     return;
177     }
178     if (bvmin<0.)
179     {
180     qu_parcour2(bumin,0.,bumax,bvmax,quad,type,num);
181     qu_parcour2(bumin,bvmin+rev_v,bumax,rev_v,quad,type,num);
182     return;
183     }
184     if (bvmax>=rev_v)
185     {
186     qu_parcour2(bumin,bvmin,bumax,rev_v,quad,type,num);
187     qu_parcour2(bumin,0.,bumax,bvmax-rev_v,quad,type,num);
188     return;
189     }
190     }
191     if ((rev_u!=0.)&&(rev_v!=0.))
192     {
193     if ((bumin>=0.) && (bumax<rev_u) && (bvmin>=0.) && (bvmax<rev_v))
194     {
195     qu_parcour2(bumin,bvmin,bumax,bvmax,quad,type,num);
196     return;
197     }
198     if ((bumin<0.)&&(bvmin<0.))
199     {
200     qu_parcour2(0.,0.,bumax,bvmax,quad,type,num);
201     qu_parcour2(bumin+rev_u,0.,rev_u,bvmax,quad,type,num);
202     qu_parcour2(0.,bvmin+rev_v,bumin,rev_v,quad,type,num);
203     qu_parcour2(bumin+rev_u,bvmin+rev_v,rev_u,rev_v,quad,type,num);
204     return;
205     }
206     if ((bumin<0.)&&(bvmax>=rev_v))
207     {
208     qu_parcour2(0.,bvmin,bumax,rev_v,quad,type,num);
209     qu_parcour2(0.,0.,bumax,bvmax-rev_v,quad,type,num);
210     qu_parcour2(bumin+rev_u,0.,rev_u,bvmax-rev_v,quad,type,num);
211     qu_parcour2(bumin+rev_u,bvmin,rev_u,rev_v,quad,type,num);
212     return;
213     }
214     if ((bumax>=rev_u)&&(bvmax>=rev_v))
215     {
216     qu_parcour2(bumin,bvmin,rev_u,rev_v,quad,type,num);
217     qu_parcour2(0.,bvmin,bumax-rev_u,rev_v,quad,type,num);
218     qu_parcour2(0.,0.,bumax-rev_u,bvmax-rev_v,quad,type,num);
219     qu_parcour2(bumin,0.,rev_u,bvmax-rev_v,quad,type,num);
220     return;
221     }
222     if ((bumax>=rev_u)&&(bvmin<0.))
223     {
224     qu_parcour2(bumin,0.,rev_u,bvmax,quad,type,num);
225     qu_parcour2(0.,0.,bumax-rev_u,bvmax,quad,type,num);
226     qu_parcour2(0.,bvmin+rev_v,bumax-rev_u,rev_v,quad,type,num);
227     qu_parcour2(bumin,bvmin+rev_v,rev_u,rev_v,quad,type,num);
228     return;
229     }
230     if (bumin<0.)
231     {
232     qu_parcour2(0.,bvmin,bumax,bvmax,quad,type,num);
233     qu_parcour2(bumin+rev_u,bvmin,rev_u,bvmax,quad,type,num);
234     return;
235     }
236     if (bvmin<0.)
237     {
238     qu_parcour2(bumin,0.,bumax,bvmax,quad,type,num);
239     qu_parcour2(bumin,bvmin+rev_v,bumax,rev_v,quad,type,num);
240     return;
241     }
242     if (bumax>=rev_u)
243     {
244     qu_parcour2(bumin,bvmin,rev_u,bvmax,quad,type,num);
245     qu_parcour2(0.,bvmin,bumax,bvmax,quad,type,num);
246     return;
247     }
248     if (bvmax>=rev_v)
249     {
250     qu_parcour2(bumin,bvmin,bumax,rev_v,quad,type,num);
251     qu_parcour2(bumin,0.,bumax,bvmax-rev_v,quad,type,num);
252     return;
253     }
254    
255     }
256    
257     }