1 |
|
5 |
#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 |
|
|
}
|