1 |
francois |
283 |
|
2 |
|
|
|
3 |
|
|
#include <stdio.h> |
4 |
|
|
#include <stdlib.h> |
5 |
|
|
#include <math.h> |
6 |
|
|
#include "r3d_struct.h" |
7 |
|
|
#include "m3d_const.h" |
8 |
|
|
#include "m3d_hotes.h" |
9 |
|
|
#include "prototype2.h" |
10 |
|
|
extern GEST_MEM *gest_r ; |
11 |
|
|
extern int debug ; |
12 |
|
|
int r3d_gene(FACE *face,NOEUD **nresu,int *hist,float critere) |
13 |
|
|
{ |
14 |
|
|
|
15 |
|
|
/* variables locales */ |
16 |
|
|
float *coord ; |
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], dist, dab, dbc, dac ; |
21 |
|
|
float crit ; |
22 |
|
|
int test_inter, nb, val ; |
23 |
|
|
float perimetre, hauteur, h ; |
24 |
|
|
float tab_xi[12] ; |
25 |
|
|
int ierr ; |
26 |
|
|
float hmin, hmax, elan ; |
27 |
|
|
|
28 |
|
|
nb = 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 |
|
|
elan = hmax/hmin ; |
57 |
|
|
|
58 |
|
|
if (elan < 2.) hmin = hmin/2. ; |
59 |
|
|
|
60 |
|
|
tab_xi[x(0)] = xi ; |
61 |
|
|
tab_xi[y(0)] = yi ; |
62 |
|
|
tab_xi[z(0)] = zi ; |
63 |
|
|
/* |
64 |
|
|
tab_xi[x(1)] = coord[x((face->n1)->num)] ; |
65 |
|
|
tab_xi[y(1)] = coord[y((face->n1)->num)] ; |
66 |
|
|
tab_xi[z(1)] = coord[z((face->n1)->num)] ; |
67 |
|
|
|
68 |
|
|
tab_xi[x(2)] = coord[x((face->n2)->num)] ; |
69 |
|
|
tab_xi[y(2)] = coord[y((face->n2)->num)] ; |
70 |
|
|
tab_xi[z(2)] = coord[z((face->n2)->num)] ; |
71 |
|
|
|
72 |
|
|
tab_xi[x(3)] = coord[x((face->n3)->num)] ; |
73 |
|
|
tab_xi[y(3)] = coord[y((face->n3)->num)] ; |
74 |
|
|
tab_xi[z(3)] = coord[z((face->n3)->num)] ; |
75 |
|
|
*/ |
76 |
|
|
|
77 |
|
|
/* calcul du critere 2 D */ |
78 |
|
|
pvec[0] = PVECX(vab,vac) ; |
79 |
|
|
pvec[1] = PVECY(vab,vac) ; |
80 |
|
|
pvec[2] = PVECZ(vab,vac) ; |
81 |
|
|
/* determination du critere */ |
82 |
|
|
|
83 |
|
|
perimetre = dab + dbc + dac ; |
84 |
|
|
hauteur = perimetre/3. ; |
85 |
|
|
|
86 |
|
|
vn[0] = PVECX(vab,vac) ; |
87 |
|
|
vn[1] = PVECY(vab,vac) ; |
88 |
|
|
vn[2] = PVECZ(vab,vac) ; |
89 |
|
|
|
90 |
|
|
norme = NORME(vn) ; |
91 |
|
|
if (norme<EPSILON) |
92 |
|
|
{ |
93 |
|
|
if (debug) printf("%s\n"," normale nulle M3D_GENE ") ; |
94 |
|
|
return(FAUX) ; |
95 |
|
|
} |
96 |
|
|
for (i=0;i<3;i++) vn[i] = vn[i]/norme ; |
97 |
|
|
|
98 |
|
|
/* strategie de generation */ |
99 |
|
|
/* si la face de recherche a deja ete construite en generant un point, on peut boucler */ |
100 |
|
|
/* creation du noeud */ |
101 |
|
|
noe_g = r3d_c_noe() ; |
102 |
|
|
if (noe_g == NULL) return(FAUX) ; |
103 |
|
|
i = 0 ; |
104 |
|
|
j = 0 ; |
105 |
|
|
while (j<2)/* on fait varier la hauteur */ |
106 |
|
|
{ |
107 |
|
|
switch (j) |
108 |
|
|
{ |
109 |
|
|
case 0 : |
110 |
|
|
val = (face->tab).val0 ; |
111 |
|
|
break ; |
112 |
|
|
case 1 : |
113 |
|
|
val = (face->tab).val1 ; |
114 |
|
|
break ; |
115 |
|
|
case 2 : |
116 |
|
|
val = (face->tab).val2 ; |
117 |
|
|
break ; |
118 |
|
|
case 3 : |
119 |
|
|
val = (face->tab).val3 ; |
120 |
|
|
break ; |
121 |
|
|
} |
122 |
|
|
if (val==0) |
123 |
|
|
{ |
124 |
|
|
h = hmin/(5*j+1.) ; |
125 |
|
|
coord[x(noe_g->num)] = tab_xi[x(i)] + h * vn[0] ; |
126 |
|
|
coord[y(noe_g->num)] = tab_xi[y(i)] + h * vn[1] ; |
127 |
|
|
coord[z(noe_g->num)] = tab_xi[z(i)] + h * vn[2] ; |
128 |
|
|
/* ----------------------------------------------------------- */ |
129 |
|
|
/* remarque : on ne cree le noeud que si le noeud est SOLUTION */ |
130 |
|
|
/* ----------------------------------------------------------- */ |
131 |
|
|
ierr = FAUX ; |
132 |
|
|
crit = m3d_e_qual(coord,(face->n1)->num,(face->n2)->num,(face->n3)->num,noe_g->num) ; |
133 |
|
|
if (crit>critere) |
134 |
|
|
{ |
135 |
|
|
test_inter = r3d_cpfront(coord,face,noe_g,&ierr) ; |
136 |
|
|
if (ierr == VRAI) |
137 |
|
|
{ |
138 |
|
|
if (debug) printf("%s\n"," Erreur r3d_cpfront M3D_GENE ") ; |
139 |
|
|
return(FAUX) ; |
140 |
|
|
} |
141 |
|
|
if (test_inter==FAUX) |
142 |
|
|
/* on a trouve un noeud solution */ |
143 |
|
|
{ |
144 |
|
|
*nresu = noe_g ; |
145 |
|
|
if (face->hist == 0) *hist = PROCHE ; |
146 |
|
|
else *hist = GENERATION ; |
147 |
|
|
switch (j) |
148 |
|
|
{ |
149 |
|
|
case 0 : |
150 |
|
|
(face->tab).val0 = 1 ; |
151 |
|
|
break ; |
152 |
|
|
case 1 : |
153 |
|
|
(face->tab).val1 = 1 ; |
154 |
|
|
break ; |
155 |
|
|
case 2 : |
156 |
|
|
(face->tab).val2 = 1 ; |
157 |
|
|
break ; |
158 |
|
|
case 3 : |
159 |
|
|
(face->tab).val3 = 1 ; |
160 |
|
|
break ; |
161 |
|
|
} |
162 |
|
|
return(VRAI) ; |
163 |
|
|
} |
164 |
|
|
} |
165 |
|
|
} |
166 |
|
|
j++ ; |
167 |
|
|
} |
168 |
|
|
/* le noeud n'est pas solution, on ne l'utilise pas */ |
169 |
|
|
gest_r->nb_noeud = gest_r->nb_noeud - 1 ; |
170 |
|
|
*nresu=NULL ; |
171 |
|
|
return(VRAI) ; |
172 |
|
|
} |