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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     m3d_int_faces Type:func
4    
5     Intersection entre faces triangulaires
6    
7     Date de creation : 16-3-1999 14 :1 :50
8     Derniere version : 16-3-1999 14 :1 :50
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_faces(int n1, int n2, int n3, int n4, int n5, int n6)
42     {
43     int inter,nb_com;
44     struct s_noeud *no1,*no2,*no3,*no4,*no5,*no6;
45     float bx1min,by1min,bz1min,bx1max,by1max,bz1max;
46     float bx2min,by2min,bz2min,bx2max,by2max,bz2max;
47     float n1n2[4],n1n3[4],n1n4[4],n1n5[4],n1n6[6],normal[4];
48     float ps1,ps2,ps3;
49     float eps1,eps2,eps3;
50    
51    
52     /* filtrage */
53     nb_com=0;
54     if ((n4==n1) || (n4==n2) || (n4==n3)) nb_com++;
55     if ((n5==n1) || (n5==n2) || (n5==n3)) nb_com++;
56     if ((n6==n1) || (n6==n2) || (n6==n3)) nb_com++;
57     if (nb_com==3) return(FAUX);
58    
59     no1=ADRESSE(n1,noeud,mesh->);
60     no2=ADRESSE(n2,noeud,mesh->);
61     no3=ADRESSE(n3,noeud,mesh->);
62     no4=ADRESSE(n4,noeud,mesh->);
63     no5=ADRESSE(n5,noeud,mesh->);
64     no6=ADRESSE(n6,noeud,mesh->);
65     MINI(bx1min,no1->x,no2->x);MINI(by1min,no1->y,no2->y);MINI(bz1min,no1->z,no2->z);
66     MINI(bx1min,bx1min,no3->x);MINI(by1min,by1min,no3->y);MINI(bz1min,bz1min,no3->z);
67     MAXI(bx1max,no1->x,no2->x);MAXI(by1max,no1->y,no2->y);MAXI(bz1max,no1->z,no2->z);
68     MAXI(bx1max,bx1max,no3->x);MAXI(by1max,by1max,no3->y);MAXI(bz1max,bz1max,no3->z);
69     MINI(bx2min,no4->x,no5->x);MINI(by2min,no4->y,no5->y);MINI(bz2min,no4->z,no5->z);
70     MINI(bx2min,bx2min,no6->x);MINI(by2min,by2min,no6->y);MINI(bz2min,bz2min,no6->z);
71     MAXI(bx2max,no4->x,no5->x);MAXI(by2max,no4->y,no5->y);MAXI(bz2max,no4->z,no5->z);
72     MAXI(bx2max,bx2max,no6->x);MAXI(by2max,by2max,no6->y);MAXI(bz2max,bz2max,no6->z);
73     inter=FAUX;
74     if (bx1max>=bx2min)
75     if (by1max>=by2min)
76     if (bz1max>=bz2min)
77     if (bx1min<=bx2max)
78     if (by1min<=by2max)
79     if (bz1min<=bz2max)
80     inter=VRAI;
81     if (inter==VRAI)
82     {
83     inter=FAUX;
84     VEC(n1n2,no1,no2);
85     VEC(n1n3,no1,no3);
86     VEC(n1n4,no1,no4);
87     VEC(n1n5,no1,no5);
88     VEC(n1n6,no1,no6);
89     PVEC(normal,n1n2,n1n3);
90     ps1=PSCA(normal,n1n4);
91     ps2=PSCA(normal,n1n5);
92     ps3=PSCA(normal,n1n6);
93     eps1=0.33333333*(DIFF(n1n2)+DIFF(n1n3)+DIFF(n1n4));
94     eps2=0.33333333*(DIFF(n1n2)+DIFF(n1n3)+DIFF(n1n5));
95     eps3=0.33333333*(DIFF(n1n2)+DIFF(n1n3)+DIFF(n1n6));
96     eps1=0.0018*eps1*eps1;
97     eps2=0.0018*eps2*eps2;
98     eps3=0.0018*eps3*eps3;
99     if ((ps1<-eps1)&&(ps2<-eps2)&&(ps3<-eps3)) return(FAUX);
100     if ((ps1>eps1)&&(ps2>eps2)&&(ps3>eps3)) return(FAUX);
101     if (m3d_int_seg_face(n1,n2,n3,n4,n5)==VRAI) return(VRAI);
102     if (m3d_int_seg_face(n1,n2,n3,n5,n6)==VRAI) return(VRAI);
103     if (m3d_int_seg_face(n1,n2,n3,n4,n6)==VRAI) return(VRAI);
104     if (m3d_int_seg_face(n4,n5,n6,n1,n2)==VRAI) return(VRAI);
105     if (m3d_int_seg_face(n4,n5,n6,n1,n3)==VRAI) return(VRAI);
106     if (m3d_int_seg_face(n4,n5,n6,n2,n3)==VRAI) return(VRAI);
107     }
108     return(inter);
109     }