ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_intersection.cpp
Revision: 283
Committed: Tue Sep 13 21:11:20 2011 UTC (13 years, 8 months ago) by francois
File size: 7268 byte(s)
Log Message:
structure de l'écriture

File Contents

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