1 |
francois |
283 |
|
2 |
|
|
|
3 |
|
|
#include <stdio.h> |
4 |
|
|
#include <math.h> |
5 |
|
|
#include "r3d_struct.h" |
6 |
|
|
#include "m3d_const.h" |
7 |
|
|
#include "m3d_hotes.h" |
8 |
|
|
#include "prototype2.h" |
9 |
|
|
extern GEST_MEM *gest_r ; |
10 |
|
|
extern int debug ; |
11 |
|
|
int r3d_gene2(FACE *face,NOEUD **nresu,int *hist,FACE **finter,int *nb_face,float critere) |
12 |
|
|
{ |
13 |
|
|
int nb_gen ; |
14 |
|
|
float *coord ; |
15 |
|
|
/* variables locales */ |
16 |
|
|
|
17 |
|
|
NOEUD *noe_g ; |
18 |
|
|
int i, j ; |
19 |
|
|
float xi,yi, zi ; |
20 |
|
|
float vab[3], vac[3], vbc[3], vn[3], norme, pvec[3], dab, dbc, dac ; |
21 |
|
|
float crit ; |
22 |
|
|
int nb_essai; |
23 |
|
|
float perimetre, hauteur, h ; |
24 |
|
|
float tab_xi[12] ; |
25 |
|
|
int ierr, ind, val ; |
26 |
|
|
float hmin, hmax, elan ; |
27 |
|
|
|
28 |
|
|
val = 0 ; |
29 |
|
|
*nresu = NULL ; |
30 |
|
|
coord = gest_r->coord ; |
31 |
|
|
/* barycentre du point */ |
32 |
|
|
xi = (coord[x((face->n1)->num)] + coord[x((face->n2)->num)] + coord[x((face->n3)->num)])/3. ; |
33 |
|
|
yi = (coord[y((face->n1)->num)] + coord[y((face->n2)->num)] + coord[y((face->n3)->num)])/3. ; |
34 |
|
|
zi = (coord[z((face->n1)->num)] + coord[z((face->n2)->num)] + coord[z((face->n3)->num)])/3. ; |
35 |
|
|
|
36 |
|
|
/* calcul de la normale */ |
37 |
|
|
vab[0] = coord[x((face->n2)->num)] - coord[x((face->n1)->num)] ; |
38 |
|
|
vab[1] = coord[y((face->n2)->num)] - coord[y((face->n1)->num)] ; |
39 |
|
|
vab[2] = coord[z((face->n2)->num)] - coord[z((face->n1)->num)] ; |
40 |
|
|
dab = NORME(vab) ; |
41 |
|
|
vac[0] = coord[x((face->n3)->num)] - coord[x((face->n1)->num)] ; |
42 |
|
|
vac[1] = coord[y((face->n3)->num)] - coord[y((face->n1)->num)] ; |
43 |
|
|
vac[2] = coord[z((face->n3)->num)] - coord[z((face->n1)->num)] ; |
44 |
|
|
dac = NORME(vac) ; |
45 |
|
|
vbc[0] = coord[x((face->n3)->num)] - coord[x((face->n2)->num)] ; |
46 |
|
|
vbc[1] = coord[y((face->n3)->num)] - coord[y((face->n2)->num)] ; |
47 |
|
|
vbc[2] = coord[z((face->n3)->num)] - coord[z((face->n2)->num)] ; |
48 |
|
|
dbc = NORME(vbc) ; |
49 |
|
|
|
50 |
|
|
hmin = min(dab,dac) ; |
51 |
|
|
hmin = min(hmin,dbc) ; |
52 |
|
|
|
53 |
|
|
hmax = max(dab,dac) ; |
54 |
|
|
hmax = max(hmin,dbc) ; |
55 |
|
|
|
56 |
|
|
|
57 |
|
|
elan = hmax/hmin ; |
58 |
|
|
|
59 |
|
|
if (elan < 2.) hmin = hmin/2. ; |
60 |
|
|
|
61 |
|
|
tab_xi[x(0)] = xi ; |
62 |
|
|
tab_xi[y(0)] = yi ; |
63 |
|
|
tab_xi[z(0)] = zi ; |
64 |
|
|
|
65 |
|
|
/* calcul du critere 2 D */ |
66 |
|
|
pvec[0] = PVECX(vab,vac) ; |
67 |
|
|
pvec[1] = PVECY(vab,vac) ; |
68 |
|
|
pvec[2] = PVECZ(vab,vac) ; |
69 |
|
|
/* determination du critere */ |
70 |
|
|
|
71 |
|
|
perimetre = dab + dbc + dac ; |
72 |
|
|
hauteur = perimetre/3. ; |
73 |
|
|
|
74 |
|
|
vn[0] = PVECX(vab,vac) ; |
75 |
|
|
vn[1] = PVECY(vab,vac) ; |
76 |
|
|
vn[2] = PVECZ(vab,vac) ; |
77 |
|
|
|
78 |
|
|
norme = NORME(vn) ; |
79 |
|
|
if (norme<EPSILON) |
80 |
|
|
{ |
81 |
|
|
if (debug) printf("%s\n"," Erreur normale nulle M3D_GENE2 ") ; |
82 |
|
|
return(FAUX) ; |
83 |
|
|
} |
84 |
|
|
for (i=0;i<3;i++) vn[i] = vn[i]/norme ; |
85 |
|
|
|
86 |
|
|
/* strategie de generation */ |
87 |
|
|
/* si la face de recherche a deja ete construite en generant un point, on peut boucler */ |
88 |
|
|
|
89 |
|
|
noe_g = r3d_c_noe() ; |
90 |
|
|
if (noe_g == NULL) return(FAUX) ; |
91 |
|
|
ierr = FAUX ; |
92 |
|
|
i = 0 ; |
93 |
|
|
j = 0 ; |
94 |
|
|
while (j<2)/* on fait varier la hauteur */ |
95 |
|
|
{ |
96 |
|
|
switch (j) |
97 |
|
|
{ |
98 |
|
|
case 0 : |
99 |
|
|
val = (face->tab).val0 ; |
100 |
|
|
break ; ; |
101 |
|
|
case 1 : |
102 |
|
|
val = (face->tab).val1 ; |
103 |
|
|
break ; |
104 |
|
|
case 2 : |
105 |
|
|
val = (face->tab).val2 ; |
106 |
|
|
break ; |
107 |
|
|
case 3 : |
108 |
|
|
val = (face->tab).val3 ; |
109 |
|
|
break ; |
110 |
|
|
} |
111 |
|
|
if (val==0) |
112 |
|
|
{ |
113 |
|
|
h = hmin/(5*j+1.) ; |
114 |
|
|
coord[x(noe_g->num)] = tab_xi[x(i)] + h * vn[0] ; |
115 |
|
|
coord[y(noe_g->num)] = tab_xi[y(i)] + h * vn[1] ; |
116 |
|
|
coord[z(noe_g->num)] = tab_xi[z(i)] + h * vn[2] ; |
117 |
|
|
ierr = FAUX ; |
118 |
|
|
crit = m3d_e_qual(coord,(face->n1)->num,(face->n2)->num,(face->n3)->num,noe_g->num) ; |
119 |
|
|
/* test sur le critere */ |
120 |
|
|
if (crit>critere) |
121 |
|
|
{ |
122 |
|
|
/* test sur le critere */ |
123 |
|
|
if (!r3d_cpfront2(coord,face,noe_g,finter,nb_face,&ierr)) |
124 |
|
|
{ |
125 |
|
|
*nresu = noe_g ; |
126 |
|
|
if (face->hist == 0) *hist = PROCHE ; |
127 |
|
|
else *hist = FACE_GENEREE ; |
128 |
|
|
switch (j) |
129 |
|
|
{ |
130 |
|
|
case 0 : |
131 |
|
|
(face->tab).val0 = 1 ; |
132 |
|
|
break ; |
133 |
|
|
case 1 : |
134 |
|
|
(face->tab).val1 = 1 ; |
135 |
|
|
break ; |
136 |
|
|
case 2 : |
137 |
|
|
(face->tab).val2 = 1 ; |
138 |
|
|
break ; |
139 |
|
|
case 3 : |
140 |
|
|
(face->tab).val3 = 1 ; |
141 |
|
|
break ; |
142 |
|
|
} |
143 |
|
|
return(VRAI) ; |
144 |
|
|
} |
145 |
|
|
} |
146 |
|
|
} |
147 |
|
|
j++ ; |
148 |
|
|
} |
149 |
|
|
gest_r->nb_noeud = gest_r->nb_noeud - 1 ; |
150 |
|
|
*nresu=NULL ; |
151 |
|
|
return(VRAI) ; |
152 |
|
|
} |