1 |
francois |
283 |
#include <stdio.h> |
2 |
|
|
#include "m3d_struct.h" |
3 |
|
|
#include "m3d_const.h" |
4 |
|
|
#include "m3d_macro.h" |
5 |
|
|
#include "prototype.h" |
6 |
|
|
extern float tab_vn[5][3] ; |
7 |
|
|
extern GEST_MEM *gest ; |
8 |
|
|
extern float eps, eps2, eps3, eps4 ; |
9 |
|
|
extern int tab_plan[4] ; |
10 |
|
|
int m3d_intersection(float *coord,int in0,int in1,int in2,int in3,int in4,int in5,int in6) |
11 |
|
|
{ |
12 |
|
|
float v45[3], v56[3], v46[3], vec[3], va1a2[3], va1_1[3], va1_2[3], pvec1[3], pvec2[3], prosca, isigne ,prosca1, prosca2 ; |
13 |
|
|
int nb = 0 ; |
14 |
|
|
int isom4 = -1 , isom5 = -1 , isom6 = -1 ; |
15 |
|
|
int isom0 = -1, isom1 = -1, isom2 = -1, isom3 = -1 ; |
16 |
|
|
int isom_p1 = -1 , isom_p2 = -1, isom_p3 = -1, inter ; |
17 |
|
|
int inum1, inum2_1, inum2_2, num_plan1, num_plan2 ; |
18 |
|
|
int ina1, ina2, ipt ; |
19 |
|
|
int iptlie1, iptlie2, vec1[3], vec2[3] ; |
20 |
|
|
int iflie1 = -1, iflie2 = -1, iflie3 = -1 ; |
21 |
|
|
|
22 |
|
|
/* bloc commun */ |
23 |
|
|
|
24 |
|
|
isom4 = isom5 = isom6 = -1 ; |
25 |
|
|
|
26 |
|
|
if (in4 == in0) isom4 = 0 ; |
27 |
|
|
else if (in4 == in1) isom4 = 1 ; |
28 |
|
|
else if (in4 == in2) isom4 = 2 ; |
29 |
|
|
else if (in4 == in3) isom4 = 3 ; |
30 |
|
|
|
31 |
|
|
if (in5 == in0) isom5 = 0 ; |
32 |
|
|
else if (in5 == in1) isom5 = 1 ; |
33 |
|
|
else if (in5 == in2) isom5 = 2 ; |
34 |
|
|
else if (in5 == in3) isom5 = 3 ; |
35 |
|
|
|
36 |
|
|
if (in6 == in0) isom6 = 0 ; |
37 |
|
|
else if (in6 == in1) isom6 = 1 ; |
38 |
|
|
else if (in6 == in2) isom6 = 2 ; |
39 |
|
|
else if (in6 == in3) isom6 = 3 ; |
40 |
|
|
|
41 |
|
|
if (isom4 != -1) nb ++ ; |
42 |
|
|
if (isom5!= -1) nb ++ ; |
43 |
|
|
if (isom6 != -1) nb ++ ; |
44 |
|
|
|
45 |
|
|
if (in4 == in0) isom0 = 4 ; |
46 |
|
|
else if (in5 == in0) isom0 = 5 ; |
47 |
|
|
else if (in6 == in0) isom0 = 6 ; |
48 |
|
|
|
49 |
|
|
if (in4==in1) isom1 = 4 ; |
50 |
|
|
else if (in5==in1) isom1 = 5 ; |
51 |
|
|
else if (in6==in1) isom1 = 6 ; |
52 |
|
|
|
53 |
|
|
if (in4==in2) isom2 = 4 ; |
54 |
|
|
else if (in5==in2) isom2 = 5 ; |
55 |
|
|
else if (in6==in2) isom2 = 6 ; |
56 |
|
|
|
57 |
|
|
if (in4==in3) isom3 = 4 ; |
58 |
|
|
else if (in5==in3) isom3 = 5 ; |
59 |
|
|
else if (in6==in3) isom3 = 6 ; |
60 |
|
|
|
61 |
|
|
if (nb == 3) return(FAUX) ; |
62 |
|
|
|
63 |
|
|
VECTEUR(v45,(coord+in4),(coord+in5)) |
64 |
|
|
VECTEUR(v56,(coord+in5),(coord+in6)) |
65 |
|
|
VECTEUR(v46,(coord+in4),(coord+in6)) |
66 |
|
|
|
67 |
|
|
tab_vn[4][0] = PVECX(v45,v46) ; |
68 |
|
|
tab_vn[4][1] = PVECY(v45,v46) ; |
69 |
|
|
tab_vn[4][2] = PVECZ(v45,v46) ; |
70 |
|
|
|
71 |
|
|
/* ********************************** */ |
72 |
|
|
/* ---------------------------------- */ |
73 |
|
|
/* adjacence */ |
74 |
|
|
/* ---------------------------------- */ |
75 |
|
|
/* ********************************** */ |
76 |
|
|
nb = 0 ; |
77 |
|
|
/* |
78 |
|
|
if (nb == 2) |
79 |
|
|
{ |
80 |
|
|
if (isom4 == -1) |
81 |
|
|
{ |
82 |
|
|
inum1 = in4 ; |
83 |
|
|
ina1 = in5 ; |
84 |
|
|
ina2 = in6 ; |
85 |
|
|
} |
86 |
|
|
else if (isom5 == -1) |
87 |
|
|
{ |
88 |
|
|
inum1 = in5 ; |
89 |
|
|
ina1 = in4 ; |
90 |
|
|
ina2 = in6 ; |
91 |
|
|
} |
92 |
|
|
else |
93 |
|
|
{ |
94 |
|
|
inum1 = in6 ; |
95 |
|
|
ina1 = in4 ; |
96 |
|
|
ina2 = in5 ; |
97 |
|
|
} |
98 |
|
|
|
99 |
|
|
if (isom0 != -1) |
100 |
|
|
{ |
101 |
|
|
ipt = in0 ; |
102 |
|
|
if (isom1 != -1) |
103 |
|
|
{ |
104 |
|
|
num_plan1 = 0 ; |
105 |
|
|
num_plan2 = 1 ; |
106 |
|
|
inum2_1 = in2 ; |
107 |
|
|
inum2_2 = in3 ; |
108 |
|
|
} |
109 |
|
|
else if (isom2 != -1) |
110 |
|
|
{ |
111 |
|
|
num_plan1 = 0 ; |
112 |
|
|
num_plan2 = 3 ; |
113 |
|
|
inum2_1 = in1 ; |
114 |
|
|
inum2_2 = in3 ; |
115 |
|
|
} |
116 |
|
|
else if (isom3 != -1) |
117 |
|
|
{ |
118 |
|
|
num_plan1 = 1 ; |
119 |
|
|
num_plan2 = 3 ; |
120 |
|
|
inum2_1 = in1 ; |
121 |
|
|
inum2_2 = in2 ; |
122 |
|
|
} |
123 |
|
|
} |
124 |
|
|
else if (isom1 != -1) |
125 |
|
|
{ |
126 |
|
|
ipt = in1 ; |
127 |
|
|
if (isom2 != -1) |
128 |
|
|
{ |
129 |
|
|
num_plan1 = 0 ; |
130 |
|
|
num_plan2 = 2 ; |
131 |
|
|
inum2_1 = in0 ; |
132 |
|
|
inum2_2 = in3 ; |
133 |
|
|
} |
134 |
|
|
else if (isom3 != -1) |
135 |
|
|
{ |
136 |
|
|
num_plan1 = 1 ; |
137 |
|
|
num_plan2 = 2 ; |
138 |
|
|
inum2_1 = in0 ; |
139 |
|
|
inum2_2 = in2 ; |
140 |
|
|
} |
141 |
|
|
} |
142 |
|
|
else if (isom2 != -1) |
143 |
|
|
{ |
144 |
|
|
ipt = in2; |
145 |
|
|
if (isom3 != -1) |
146 |
|
|
{ |
147 |
|
|
num_plan1 = 2 ; |
148 |
|
|
num_plan2 = 3 ; |
149 |
|
|
inum2_1 = in1 ; |
150 |
|
|
inum2_2 = in0 ; |
151 |
|
|
} |
152 |
|
|
} |
153 |
|
|
if (tab_plan[num_plan1] && tab_plan[num_plan2]) return(FAUX) ; |
154 |
|
|
|
155 |
|
|
VECTEUR(vec,(coord+ipt),(coord+inum1)) |
156 |
|
|
prosca1 = PROSCA(vec,tab_vn[num_plan1]) ; |
157 |
|
|
prosca2 = PROSCA(vec,tab_vn[num_plan2]) ; |
158 |
|
|
|
159 |
|
|
if (prosca1 > eps3) return(FAUX) ; |
160 |
|
|
if (prosca2 > eps3) return(FAUX) ; |
161 |
|
|
|
162 |
|
|
if ((prosca1 < -eps3) && (prosca2 < -eps3)) |
163 |
|
|
{ |
164 |
|
|
return(VRAI) ; |
165 |
|
|
} |
166 |
|
|
|
167 |
|
|
if (- prosca1 <= eps3) |
168 |
|
|
{ |
169 |
|
|
if (num_plan1 == 0) return(FAUX) ; |
170 |
|
|
VECTEUR(va1a2,(coord + ina1),(coord+ina2)) |
171 |
|
|
VECTEUR(va1_1,(coord + ina1),(coord+inum1)) |
172 |
|
|
VECTEUR(va1_2,(coord + ina1),(coord+inum2_1)) |
173 |
|
|
|
174 |
|
|
pvec1[0] = PVECX(va1a2,va1_1) ; |
175 |
|
|
pvec1[1] = PVECY(va1a2,va1_1) ; |
176 |
|
|
pvec1[2] = PVECZ(va1a2,va1_1) ; |
177 |
|
|
|
178 |
|
|
pvec2[0] = PVECX(va1a2,va1_2) ; |
179 |
|
|
pvec2[1] = PVECY(va1a2,va1_2) ; |
180 |
|
|
pvec2[2] = PVECZ(va1a2,va1_2) ; |
181 |
|
|
|
182 |
|
|
if (PROSCA(pvec1,pvec2) > 0.) |
183 |
|
|
{ |
184 |
|
|
return(VRAI) ; |
185 |
|
|
} |
186 |
|
|
else return(FAUX) ; |
187 |
|
|
} |
188 |
|
|
if (- prosca2 < eps3) |
189 |
|
|
{ |
190 |
|
|
if (tab_plan[num_plan2]) return(FAUX) ; |
191 |
|
|
VECTEUR(va1a2,(coord + ina1),(coord+ina2)) |
192 |
|
|
VECTEUR(va1_1,(coord + ina1),(coord+inum1)) |
193 |
|
|
VECTEUR(va1_2,(coord + ina1),(coord+inum2_2)) |
194 |
|
|
|
195 |
|
|
pvec1[0] = PVECX(va1a2,va1_1) ; |
196 |
|
|
pvec1[1] = PVECY(va1a2,va1_1) ; |
197 |
|
|
pvec1[2] = PVECZ(va1a2,va1_1) ; |
198 |
|
|
|
199 |
|
|
pvec2[0] = PVECX(va1a2,va1_2) ; |
200 |
|
|
pvec2[1] = PVECY(va1a2,va1_2) ; |
201 |
|
|
pvec2[2] = PVECZ(va1a2,va1_2) ; |
202 |
|
|
|
203 |
|
|
if (PROSCA(pvec1,pvec2) > 0.) |
204 |
|
|
{ |
205 |
|
|
return(VRAI) ; |
206 |
|
|
} |
207 |
|
|
else return(FAUX) ; |
208 |
|
|
} |
209 |
|
|
} |
210 |
|
|
*/ |
211 |
|
|
/* |
212 |
|
|
if (isom4 == -1) if (m3d_intetra(coord,in0,in1,in4)) return(VRAI) ; |
213 |
|
|
if (isom5 == -1) if (m3d_intetra(coord,in0,in1,in5)) return(VRAI) ; |
214 |
|
|
if (isom6 == -1) if (m3d_intetra(coord,in0,in1,in6)) return(VRAI) ; |
215 |
|
|
*/ |
216 |
|
|
|
217 |
|
|
/* tests d'intersection a optimiser */ |
218 |
|
|
inter = FAUX ; |
219 |
|
|
/* intersection avec la face 4 */ |
220 |
|
|
|
221 |
|
|
if (!tab_plan[1]) |
222 |
|
|
if (!tab_plan[3]) |
223 |
|
|
m3d_seg_face(coord,in0,in3,in4,in5,in6,tab_vn[4],&inter) ; |
224 |
|
|
if (inter) |
225 |
|
|
{ |
226 |
|
|
return(VRAI) ; |
227 |
|
|
} |
228 |
|
|
|
229 |
|
|
if (!tab_plan[1]) |
230 |
|
|
if (!tab_plan[2]) |
231 |
|
|
m3d_seg_face(coord,in1,in3,in4,in5,in6,tab_vn[4],&inter) ; |
232 |
|
|
if (inter) |
233 |
|
|
{ |
234 |
|
|
return(VRAI) ; |
235 |
|
|
} |
236 |
|
|
|
237 |
|
|
if (!tab_plan[2]) |
238 |
|
|
if (!tab_plan[3]) |
239 |
|
|
m3d_seg_face(coord,in2,in3,in4,in5,in6,tab_vn[4],&inter) ; |
240 |
|
|
if (inter) |
241 |
|
|
{ |
242 |
|
|
return(VRAI) ; |
243 |
|
|
} |
244 |
|
|
|
245 |
|
|
if (!tab_plan[1]) |
246 |
|
|
{ |
247 |
|
|
m3d_seg_face(coord,in4,in5,in0,in1,in3,tab_vn[1],&inter) ; |
248 |
|
|
if (inter) |
249 |
|
|
{ |
250 |
|
|
return(VRAI) ; |
251 |
|
|
} |
252 |
|
|
|
253 |
|
|
m3d_seg_face(coord,in4,in6,in0,in1,in3,tab_vn[1],&inter) ; |
254 |
|
|
if (inter) |
255 |
|
|
{ |
256 |
|
|
return(VRAI) ; |
257 |
|
|
} |
258 |
|
|
|
259 |
|
|
m3d_seg_face(coord,in5,in6,in0,in1,in3,tab_vn[1],&inter) ; |
260 |
|
|
if (inter) |
261 |
|
|
{ |
262 |
|
|
return(VRAI) ; |
263 |
|
|
} |
264 |
|
|
} |
265 |
|
|
|
266 |
|
|
|
267 |
|
|
if (!tab_plan[2]) |
268 |
|
|
{ |
269 |
|
|
m3d_seg_face(coord,in4,in5,in1,in2,in3,tab_vn[2],&inter) ; |
270 |
|
|
if (inter) |
271 |
|
|
{ |
272 |
|
|
return(VRAI) ; |
273 |
|
|
} |
274 |
|
|
|
275 |
|
|
m3d_seg_face(coord,in4,in6,in1,in2,in3,tab_vn[2],&inter) ; |
276 |
|
|
if (inter) |
277 |
|
|
{ |
278 |
|
|
return(VRAI) ; |
279 |
|
|
} |
280 |
|
|
|
281 |
|
|
m3d_seg_face(coord,in5,in6,in1,in2,in3,tab_vn[2],&inter) ; |
282 |
|
|
if (inter) |
283 |
|
|
{ |
284 |
|
|
return(VRAI) ; |
285 |
|
|
} |
286 |
|
|
} |
287 |
|
|
|
288 |
|
|
if (!tab_plan[3]) |
289 |
|
|
{ |
290 |
|
|
m3d_seg_face(coord,in4,in5,in0,in3,in2,tab_vn[3],&inter) ; |
291 |
|
|
if (inter) |
292 |
|
|
{ |
293 |
|
|
return(VRAI) ; |
294 |
|
|
} |
295 |
|
|
m3d_seg_face(coord,in4,in6,in0,in3,in2,tab_vn[3],&inter) ; |
296 |
|
|
if (inter) |
297 |
|
|
{ |
298 |
|
|
return(VRAI) ; |
299 |
|
|
} |
300 |
|
|
|
301 |
|
|
m3d_seg_face(coord,in5,in6,in0,in3,in2,tab_vn[3],&inter) ; |
302 |
|
|
if (inter) |
303 |
|
|
{ |
304 |
|
|
return(VRAI) ; |
305 |
|
|
} |
306 |
|
|
} |
307 |
|
|
|
308 |
|
|
return(FAUX) ; |
309 |
|
|
|
310 |
|
|
} |