1 |
francois |
283 |
#include <stdio.h> |
2 |
|
|
#include <math.h> |
3 |
|
|
#include "m3d_struct.h" |
4 |
|
|
#include "m3d_const.h" |
5 |
|
|
#include "m3d_hotes.h" |
6 |
|
|
#include "m3d_erreur.h" |
7 |
|
|
#include "prototype.h" |
8 |
|
|
extern GEST_MEM *gest ; |
9 |
|
|
extern int debug ; |
10 |
|
|
int m3d_rech3(FACE *face,NOEUD **nresu) |
11 |
|
|
{ |
12 |
|
|
int i, j, k, j1, j2, j3, j4 ; |
13 |
|
|
int is_j1, is_j2, is_j3, is_j4, nump,nb, num, card, nele ; |
14 |
|
|
int nb_noe_rec = 0 ; |
15 |
|
|
int nb_ele_rec = 0 ; |
16 |
|
|
float vab[3], vac[3], vn[3], pvec[3], norme, vap[3] ; |
17 |
|
|
FILE *stream ; |
18 |
|
|
float *coord ; |
19 |
|
|
int iptr ; |
20 |
|
|
|
21 |
|
|
coord = gest->coord ; |
22 |
|
|
j1 = j2 = j3 = j4 = 0 ; |
23 |
|
|
|
24 |
|
|
card = gest->card ; |
25 |
|
|
num = face->n1->num ; |
26 |
|
|
iptr = gest->tab_card[num] ; |
27 |
|
|
k = 0 ; |
28 |
|
|
nele = 0 ; |
29 |
|
|
nele = gest->tab_ref[iptr+k] ; |
30 |
|
|
while (nele>-1) |
31 |
|
|
{ |
32 |
|
|
j1 = gest->tab_rec[4*nele] ; |
33 |
|
|
j2 = gest->tab_rec[4*nele+1] ; |
34 |
|
|
j3 = gest->tab_rec[4*nele+2] ; |
35 |
|
|
j4 = gest->tab_rec[4*nele+3] ; |
36 |
|
|
|
37 |
|
|
nb = 0 ; |
38 |
|
|
is_j1 = is_j2 = is_j3 = is_j4 = 0 ; |
39 |
|
|
|
40 |
|
|
if ((face->n1->num == j1) || (face->n2->num == j1) || (face->n3->num == j1)) { |
41 |
|
|
nb++ ; |
42 |
|
|
is_j1 = 1; |
43 |
|
|
} |
44 |
|
|
if ((face->n1->num == j2) || (face->n2->num == j2) || (face->n3->num == j2)) { |
45 |
|
|
nb++ ; |
46 |
|
|
is_j2 = 1; |
47 |
|
|
} |
48 |
|
|
if ((face->n1->num == j3) || (face->n2->num == j3) || (face->n3->num == j3)) { |
49 |
|
|
nb++ ; |
50 |
|
|
is_j3 = 1; |
51 |
|
|
} |
52 |
|
|
if ((face->n1->num == j4) || (face->n2->num == j4) || (face->n3->num == j4)) { |
53 |
|
|
nb++ ; |
54 |
|
|
is_j4 = 1; |
55 |
|
|
} |
56 |
|
|
if (nb == 3) |
57 |
|
|
{ |
58 |
|
|
if (!is_j1) nump = j1 ; |
59 |
|
|
if (!is_j2) nump = j2 ; |
60 |
|
|
if (!is_j3) nump = j3 ; |
61 |
|
|
if (!is_j4) nump = j4 ; |
62 |
|
|
|
63 |
|
|
/* calcul de la normale */ |
64 |
|
|
vab[0] = coord[x((face->n2)->num)] - coord[x((face->n1)->num)] ; |
65 |
|
|
vab[1] = coord[y((face->n2)->num)] - coord[y((face->n1)->num)] ; |
66 |
|
|
vab[2] = coord[z((face->n2)->num)] - coord[z((face->n1)->num)] ; |
67 |
|
|
|
68 |
|
|
vac[0] = coord[x((face->n3)->num)] - coord[x((face->n1)->num)] ; |
69 |
|
|
vac[1] = coord[y((face->n3)->num)] - coord[y((face->n1)->num)] ; |
70 |
|
|
vac[2] = coord[z((face->n3)->num)] - coord[z((face->n1)->num)] ; |
71 |
|
|
|
72 |
|
|
vn[0] = PVECX(vab,vac) ; |
73 |
|
|
vn[1] = PVECY(vab,vac) ; |
74 |
|
|
vn[2] = PVECZ(vab,vac) ; |
75 |
|
|
norme = NORME(vn) ; |
76 |
|
|
if (norme<EPSILON) |
77 |
|
|
{ |
78 |
|
|
if (debug) printf("%s\n"," normale nulle M3D_RECH3 ") ; |
79 |
|
|
m3d_erreur(ERR_FIN) ; |
80 |
|
|
return(FAUX) ; |
81 |
|
|
} |
82 |
|
|
for (j=0;j<3;j++) vn[j] = vn[j]/norme ; |
83 |
|
|
|
84 |
|
|
vap[0] = coord[x(nump)] - coord[x((face->n1)->num)] ; |
85 |
|
|
vap[1] = coord[y(nump)] - coord[y((face->n1)->num)] ; |
86 |
|
|
vap[2] = coord[z(nump)] - coord[z((face->n1)->num)] ; |
87 |
|
|
|
88 |
|
|
if (PROSCA(vap,vn) > EPSILON) /* on a trouve le noeud solution */ |
89 |
|
|
{ |
90 |
|
|
ADRESSE(noeud,nump,*nresu) |
91 |
|
|
return(VRAI) ; |
92 |
|
|
} |
93 |
|
|
} |
94 |
|
|
k++ ; |
95 |
|
|
nele = gest->tab_ref[iptr+k] ; |
96 |
|
|
} |
97 |
|
|
*nresu = NULL ; |
98 |
|
|
return(VRAI) ; |
99 |
|
|
} |
100 |
|
|
|