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

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