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

File Contents

# Content
1 /*****************************************************************
2
3 m3d_int_seg_face.cpp Type:Func
4
5 Intersection face segment
6
7 Date de creation : 16-3-1999 14 :14 :21
8 Derniere version : 16-3-1999 14 :14 :21
9
10 Vincent FRANCOIS
11
12 *****************************************************************/
13
14
15
16
17
18 /**************************/
19 /* include */
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <math.h>
24 #include "const.h"
25 #include "memoire.h"
26 #include "struct.h"
27 #include "struct3d.h"
28 #include "prototype.h"
29
30
31 /**************************/
32 /* variables globales */
33 extern struct environnment env;
34 extern struct s_mesh *mesh;
35
36
37
38 /**************************/
39 /* programme principal */
40
41 int m3d_int_seg_face(int n1,int n2,int n3,int n4,int n5)
42 {
43 struct s_noeud *no1,*no2,*no3,*no4,*no5;
44 float g1[4],g2[4],g3[4],det,g1b[4],g2b[4],g3b[4],n1n4[4];
45 float alpha1,alpha2,alpha3,alpha4;
46 float eps;
47 int inter,nb_com;
48
49 /* filtrage */
50 nb_com=0;
51 if ((n4==n1) || (n4==n2) || (n4==n3)) nb_com++;
52 if ((n5==n1) || (n5==n2) || (n5==n3)) nb_com++;
53 if (nb_com==2) return(FAUX);
54
55 inter=FAUX;
56 no1=ADRESSE(n1,noeud,mesh->);
57 no2=ADRESSE(n2,noeud,mesh->);
58 no3=ADRESSE(n3,noeud,mesh->);
59 no4=ADRESSE(n4,noeud,mesh->);
60 no5=ADRESSE(n5,noeud,mesh->);
61 VEC(g1,no1,no2);
62 VEC(g2,no1,no3);
63 VEC(g3,no4,no5);
64 det=g1[0]*g2[1]*g3[2]+g1[1]*g2[2]*g3[0]+g1[2]*g2[0]*g3[1]
65 -g1[2]*g2[1]*g3[0]-g1[0]*g2[2]*g3[1]-g1[1]*g2[0]*g3[2];
66 eps=0.3333333*(DIFF(g1)+DIFF(g2)+DIFF(g3));
67 eps=0.0018*eps*eps;
68 if (EGAL(det,0.0,eps)) /* cas 2D */
69 {
70 if (m3d_int_seg_seg(n1,n2,n4,n5)==VRAI) return(VRAI);
71 if (m3d_int_seg_seg(n1,n3,n4,n5)==VRAI) return(VRAI);
72 if (m3d_int_seg_seg(n2,n3,n4,n5)==VRAI) return(VRAI);
73 }
74 else
75 {
76 if ((n4==n1) || (n4==n2) || (n4==n3)) return(FAUX);
77 if ((n5==n1) || (n5==n2) || (n5==n3)) return(FAUX);
78 g1b[0]=1.0/det*(g2[1]*g3[2]-g2[2]*g3[1]);
79 g1b[1]=1.0/det*(g3[0]*g2[2]-g2[0]*g3[2]);
80 g1b[2]=1.0/det*(g2[0]*g3[1]-g2[1]*g3[0]);
81 g2b[0]=1.0/det*(g3[1]*g1[2]-g1[1]*g3[2]);
82 g2b[1]=1.0/det*(g1[0]*g3[2]-g3[0]*g1[2]);
83 g2b[2]=1.0/det*(g3[0]*g1[1]-g1[0]*g3[1]);
84 g3b[0]=1.0/det*(g1[1]*g2[2]-g1[2]*g2[1]);
85 g3b[1]=1.0/det*(g2[0]*g1[2]-g1[0]*g2[2]);
86 g3b[2]=1.0/det*(g1[0]*g2[1]-g1[1]*g2[0]);
87 VEC(n1n4,no1,no4);
88 alpha1=PSCA(n1n4,g1b);
89 alpha2=PSCA(n1n4,g2b);
90 alpha3=(-PSCA(n1n4,g3b));
91 alpha4=1-alpha1-alpha2;
92 eps=0.0001;
93 if ((alpha1>-eps) && (alpha1<1.+eps))
94 if ((alpha2>-eps) && (alpha2<1.+eps))
95 if ((alpha3>-eps) && (alpha3<1.+eps))
96 if ((alpha4>-eps) && (alpha4<1.+eps))
97 return(VRAI);
98 return(FAUX);
99 }
100
101 return(inter);
102 }