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

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