1 |
|
1 |
/*****************************************************************
|
2 |
|
|
|
3 |
|
|
m3d_intersection.cpp Type:Func
|
4 |
|
|
|
5 |
|
|
Intersection tetraedre face
|
6 |
|
|
|
7 |
|
|
Date de creation : 15-3-1999 16 :47 :49
|
8 |
|
|
Derniere version : 15-3-1999 16 :47 :49
|
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 |
|
|
/* variables globales */
|
32 |
|
|
extern struct environnement env;
|
33 |
|
|
extern struct s_mesh *mesh;
|
34 |
|
|
|
35 |
|
|
|
36 |
|
|
|
37 |
|
|
/**************************/
|
38 |
|
|
/* programme principal */
|
39 |
|
|
|
40 |
|
|
int m3d_intersection(int n1,int n2,int n3,int n4,int n5,int n6,int n7)
|
41 |
|
|
{
|
42 |
|
|
struct s_noeud *no1,*no2,*no3,*no4,*no5,*no6,*no7;
|
43 |
|
|
float bx1min,by1min,bz1min,bx1max,by1max,bz1max;
|
44 |
|
|
float bx2min,by2min,bz2min,bx2max,by2max,bz2max;
|
45 |
|
|
float normal1[4],normal2[4],normal3[4],normal4[4];
|
46 |
|
|
float n1n2[4],n1n3[4],n1n4[4],n1n5[4],n1n6[4],n1n7[4];
|
47 |
|
|
float n2n3[4],n2n4[4],n2n5[4],n2n6[4],n2n7[4];
|
48 |
|
|
float eps;
|
49 |
|
|
int inter,nb_com;
|
50 |
|
|
int test1,test2,test3;
|
51 |
|
|
|
52 |
|
|
|
53 |
|
|
/* filtre sur numero */
|
54 |
|
|
nb_com=0;
|
55 |
|
|
if ((n5==n1) || (n5==n2) || (n5==n3) || (n5==n4)) nb_com++;
|
56 |
|
|
if ((n6==n1) || (n6==n2) || (n6==n3) || (n6==n4)) nb_com++;
|
57 |
|
|
if ((n7==n1) || (n7==n2) || (n7==n3) || (n7==n4)) nb_com++;
|
58 |
|
|
if (nb_com==3) return(FAUX);
|
59 |
|
|
/* filtres sur position */
|
60 |
|
|
no1=ADRESSE(n1,noeud,mesh->);
|
61 |
|
|
no2=ADRESSE(n2,noeud,mesh->);
|
62 |
|
|
no3=ADRESSE(n3,noeud,mesh->);
|
63 |
|
|
no4=ADRESSE(n4,noeud,mesh->);
|
64 |
|
|
no5=ADRESSE(n5,noeud,mesh->);
|
65 |
|
|
no6=ADRESSE(n6,noeud,mesh->);
|
66 |
|
|
no7=ADRESSE(n7,noeud,mesh->);
|
67 |
|
|
MINI(bx1min,no1->x,no2->x);MINI(by1min,no1->y,no2->y);MINI(bz1min,no1->z,no2->z);
|
68 |
|
|
MINI(bx1min,bx1min,no3->x);MINI(by1min,by1min,no3->y);MINI(bz1min,bz1min,no3->z);
|
69 |
|
|
MINI(bx1min,bx1min,no4->x);MINI(by1min,by1min,no4->y);MINI(bz1min,bz1min,no4->z);
|
70 |
|
|
MAXI(bx1max,no1->x,no2->x);MAXI(by1max,no1->y,no2->y);MAXI(bz1max,no1->z,no2->z);
|
71 |
|
|
MAXI(bx1max,bx1max,no3->x);MAXI(by1max,by1max,no3->y);MAXI(bz1max,bz1max,no3->z);
|
72 |
|
|
MAXI(bx1max,bx1max,no4->x);MAXI(by1max,by1max,no4->y);MAXI(bz1max,bz1max,no4->z);
|
73 |
|
|
MINI(bx2min,no5->x,no6->x);MINI(by2min,no5->y,no6->y);MINI(bz2min,no5->z,no6->z);
|
74 |
|
|
MINI(bx2min,bx2min,no7->x);MINI(by2min,by2min,no7->y);MINI(bz2min,bz2min,no7->z);
|
75 |
|
|
MAXI(bx2max,no5->x,no6->x);MAXI(by2max,no5->y,no6->y);MAXI(bz2max,no5->z,no6->z);
|
76 |
|
|
MAXI(bx2max,bx2max,no7->x);MAXI(by2max,by2max,no7->y);MAXI(bz2max,bz2max,no7->z);
|
77 |
|
|
inter=FAUX;
|
78 |
|
|
if (bx1max>=bx2min)
|
79 |
|
|
if (by1max>=by2min)
|
80 |
|
|
if (bz1max>=bz2min)
|
81 |
|
|
if (bx1min<=bx2max)
|
82 |
|
|
if (by1min<=by2max)
|
83 |
|
|
if (bz1min<=bz2max)
|
84 |
|
|
inter=VRAI;
|
85 |
|
|
/* on est oblige de calculer */
|
86 |
|
|
if (inter==VRAI)
|
87 |
|
|
{
|
88 |
|
|
inter=FAUX;
|
89 |
|
|
if ((n5==n1) || (n5==n2) || (n5==n3) || (n5==n4)) test1=0; else test1=1;
|
90 |
|
|
if ((n6==n1) || (n6==n2) || (n6==n3) || (n6==n4)) test2=0; else test2=1;
|
91 |
|
|
if ((n7==n1) || (n7==n2) || (n7==n3) || (n7==n4)) test3=0; else test3=1;
|
92 |
|
|
VEC(n1n2,no1,no2);
|
93 |
|
|
VEC(n1n3,no1,no3);
|
94 |
|
|
VEC(n1n4,no1,no4);
|
95 |
|
|
VEC(n2n3,no2,no3);
|
96 |
|
|
VEC(n2n4,no2,no4);
|
97 |
|
|
VEC(n1n5,no1,no5);
|
98 |
|
|
VEC(n1n6,no1,no6);
|
99 |
|
|
VEC(n1n7,no1,no7);
|
100 |
|
|
VEC(n2n5,no2,no5);
|
101 |
|
|
VEC(n2n6,no2,no6);
|
102 |
|
|
VEC(n2n7,no2,no7);
|
103 |
|
|
PVEC(normal1,n1n3,n1n2);
|
104 |
|
|
PVEC(normal2,n1n2,n1n4);
|
105 |
|
|
PVEC(normal3,n2n3,n2n4);
|
106 |
|
|
PVEC(normal4,n1n4,n1n3);
|
107 |
|
|
eps=0.333333333*(DIFF(n1n3)+DIFF(n1n2)+DIFF(n1n5));
|
108 |
|
|
eps=0.0018*eps*eps;
|
109 |
|
|
if (test1==1)
|
110 |
|
|
if (PSCA(normal1,n1n5)<eps)
|
111 |
|
|
if (PSCA(normal2,n1n5)<eps)
|
112 |
|
|
if (PSCA(normal3,n2n5)<eps)
|
113 |
|
|
if (PSCA(normal4,n1n5)<eps)
|
114 |
|
|
return(VRAI);
|
115 |
|
|
eps=0.333333333*(DIFF(n1n3)+DIFF(n1n2)+DIFF(n1n6));
|
116 |
|
|
eps=0.0018*eps*eps;
|
117 |
|
|
if (test2==1)
|
118 |
|
|
if (PSCA(normal1,n1n6)<eps)
|
119 |
|
|
if (PSCA(normal2,n1n6)<eps)
|
120 |
|
|
if (PSCA(normal3,n2n6)<eps)
|
121 |
|
|
if (PSCA(normal4,n1n6)<eps)
|
122 |
|
|
return(VRAI);
|
123 |
|
|
eps=0.333333333*(DIFF(n1n3)+DIFF(n1n2)+DIFF(n1n7));
|
124 |
|
|
eps=0.0018*eps*eps;
|
125 |
|
|
if (test3==1)
|
126 |
|
|
if (PSCA(normal1,n1n7)<eps)
|
127 |
|
|
if (PSCA(normal2,n1n7)<eps)
|
128 |
|
|
if (PSCA(normal3,n2n7)<eps)
|
129 |
|
|
if (PSCA(normal4,n1n7)<eps)
|
130 |
|
|
return(VRAI);
|
131 |
|
|
if (m3d_int_faces(n1,n3,n2,n5,n6,n7)==VRAI) return(VRAI);
|
132 |
|
|
if (m3d_int_faces(n1,n2,n4,n5,n6,n7)==VRAI) return(VRAI);
|
133 |
|
|
if (m3d_int_faces(n2,n3,n4,n5,n6,n7)==VRAI) return(VRAI);
|
134 |
|
|
if (m3d_int_faces(n1,n4,n3,n5,n6,n7)==VRAI) return(VRAI);
|
135 |
|
|
}
|
136 |
|
|
return(inter);
|
137 |
|
|
}
|