1 |
//####//------------------------------------------------------------ |
2 |
//####//------------------------------------------------------------ |
3 |
//####// MAGiC |
4 |
//####// Jean Christophe Cuilliere et Vincent FRANCOIS |
5 |
//####// Departement de Genie Mecanique - UQTR |
6 |
//####//------------------------------------------------------------ |
7 |
//####// MAGIC est un projet de recherche de l equipe ERICCA |
8 |
//####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres |
9 |
//####// http://www.uqtr.ca/ericca |
10 |
//####// http://www.uqtr.ca/ |
11 |
//####//------------------------------------------------------------ |
12 |
//####//------------------------------------------------------------ |
13 |
//####// |
14 |
//####// mailleur3d_couche.cpp |
15 |
//####// |
16 |
//####//------------------------------------------------------------ |
17 |
//####//------------------------------------------------------------ |
18 |
//####// COPYRIGHT 2000-2024 |
19 |
//####// jeu 13 jun 2024 11:58:55 EDT |
20 |
//####//------------------------------------------------------------ |
21 |
//####//------------------------------------------------------------ |
22 |
|
23 |
|
24 |
#include "gestionversion.h" |
25 |
#include "mailleur3d_couche.h" |
26 |
#include "mailleur0d.h" |
27 |
#include "mailleur1d.h" |
28 |
#include "mailleur2d.h" |
29 |
#include "mg_gestionnaire.h" |
30 |
#include "mg_geometrie_outils.h" |
31 |
#include "m3d_triangle.h" |
32 |
|
33 |
#include "mailleur3d_couche.h" |
34 |
|
35 |
|
36 |
|
37 |
|
38 |
MAILLEUR3D_COUCHE::MAILLEUR3D_COUCHE(MG_MAILLAGE* mgmai,MG_GEOMETRIE *mggeo,FCT_TAILLE* fct_taille):MAILLEUR(false),mai(mgmai),geo(mggeo),metrique(fct_taille) |
39 |
{ |
40 |
|
41 |
} |
42 |
|
43 |
|
44 |
|
45 |
MAILLEUR3D_COUCHE::~MAILLEUR3D_COUCHE() |
46 |
{ |
47 |
} |
48 |
|
49 |
|
50 |
|
51 |
|
52 |
int MAILLEUR3D_COUCHE::maille(MG_GROUPE_TOPOLOGIQUE* mggt) |
53 |
{ |
54 |
return 0; |
55 |
} |
56 |
|
57 |
|
58 |
|
59 |
int MAILLEUR3D_COUCHE::maille(MG_VOLUME *vol) |
60 |
{ |
61 |
if (!vol->est_mince()) return OK; |
62 |
affiche((char*)"Mailleur d'un volume mince en pentaedre"); |
63 |
for (int i=0;i<vol->get_nb_face_correspondante();i++) |
64 |
{ |
65 |
MG_FACE* face1; |
66 |
MG_FACE* face2; |
67 |
vol->get_face_correspondante(i,&face1,&face2); |
68 |
TPL_MAP_ENTITE<MG_SOMMET*> lstsom; |
69 |
TPL_MAP_ENTITE<MG_ARETE*> lstare; |
70 |
MG_FACE* face=face1; |
71 |
TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst; |
72 |
face->get_topologie_sousjacente(&lst); |
73 |
TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it; |
74 |
for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it)) |
75 |
{ |
76 |
if (ele->get_dimension()==0) lstsom.ajouter((MG_SOMMET*)ele); |
77 |
if (ele->get_dimension()==1) lstare.ajouter((MG_ARETE*)ele); |
78 |
} |
79 |
char mess[500]; |
80 |
sprintf(mess," Maillage de la face de base %lu",face->get_id()); |
81 |
affiche(mess); |
82 |
TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its; |
83 |
for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its)) |
84 |
{ |
85 |
bool dejamaille=false; |
86 |
for (int i=0;i<som->get_lien_maillage()->get_nb();i++) |
87 |
if (mai->get_mg_noeudid(som->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;} |
88 |
if (!dejamaille) |
89 |
{ |
90 |
MAILLEUR0D m0d(mai,mai->get_mg_geometrie(),som); |
91 |
m0d.maille(); |
92 |
} |
93 |
} |
94 |
TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita; |
95 |
for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita)) |
96 |
{ |
97 |
bool dejamaille=false; |
98 |
for (int i=0;i<are->get_lien_maillage()->get_nb();i++) |
99 |
if (mai->get_mg_segmentid(are->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;} |
100 |
if (!dejamaille) |
101 |
{ |
102 |
MAILLEUR1D m1d(mai,mai->get_mg_geometrie(),metrique,are); |
103 |
m1d.maille(); |
104 |
} |
105 |
} |
106 |
bool dejamaille=false; |
107 |
for (int i=0;i<face->get_lien_maillage()->get_nb();i++) |
108 |
if (mai->get_mg_triangleid(face->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;} |
109 |
if (!dejamaille) |
110 |
{ |
111 |
MAILLEUR2D m2d(mai,mai->get_mg_geometrie(),metrique,face); |
112 |
m2d.active_affichage(affiche2); |
113 |
m2d.maille(); |
114 |
} |
115 |
MG_FACE* autreface=face2; |
116 |
sprintf(mess," Maillage de la face extrude %lu",autreface->get_id()); |
117 |
affiche(mess); |
118 |
TPL_MAP_ENTITE<MG_SOMMET*> lstasom; |
119 |
TPL_MAP_ENTITE<MG_ARETE*> lstaare; |
120 |
lst.vide(); |
121 |
autreface->get_topologie_sousjacente(&lst); |
122 |
for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it)) |
123 |
{ |
124 |
if (ele->get_dimension()==0) lstasom.ajouter((MG_SOMMET*)ele); |
125 |
if (ele->get_dimension()==1) lstaare.ajouter((MG_ARETE*)ele); |
126 |
} |
127 |
MG_GEOMETRIE_OUTILS ot; |
128 |
for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its)) |
129 |
{ |
130 |
int num=0; |
131 |
MG_NOEUD* noeud; |
132 |
do |
133 |
{ |
134 |
noeud=(MG_NOEUD*)som->get_lien_maillage()->get(num); |
135 |
num++; |
136 |
} |
137 |
while (mai->get_mg_noeudid(noeud->get_id())==NULL); |
138 |
if (noeud->get_nouveau_numero()>0) continue; |
139 |
double *xyz=noeud->get_coord(); |
140 |
double xyzproj[3]; |
141 |
double xyzprojuv[3]; |
142 |
ot.projete(xyz,autreface,xyzprojuv,xyzproj); |
143 |
TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its2; |
144 |
MG_SOMMET* somop=NULL; |
145 |
double dist=1e300; |
146 |
for (MG_SOMMET* som2=lstasom.get_premier(its2);som2!=NULL;som2=lstasom.get_suivant(its2)) |
147 |
{ |
148 |
double xyzsom2[3]; |
149 |
som2->get_point()->evaluer(xyzsom2); |
150 |
OT_VECTEUR_3D v(xyzproj,xyzsom2); |
151 |
if (v.get_longueur2()<dist) {dist=v.get_longueur2();somop=som2;} |
152 |
} |
153 |
somop->get_point()->evaluer(xyzproj); |
154 |
MG_NOEUD* no1=new MG_NOEUD(somop,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO); |
155 |
mai->ajouter_mg_noeud(no1); |
156 |
noeud->change_nouveau_numero(no1->get_id()); |
157 |
} |
158 |
for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita)) |
159 |
{ |
160 |
TPL_LISTE_ENTITE<MG_SEGMENT*> lstseg; |
161 |
for (int i=0;i<are->get_lien_maillage()->get_nb();i++) |
162 |
if (mai->get_mg_segmentid(are->get_lien_maillage()->get(i)->get_id())!=NULL) lstseg.ajouter((MG_SEGMENT*)are->get_lien_maillage()->get(i)); |
163 |
MG_ARETE *areop=NULL; |
164 |
int sens=0; |
165 |
for (int i=0;i<lstseg.get_nb();i++) |
166 |
{ |
167 |
MG_SEGMENT* seg=lstseg.get(i); |
168 |
if (seg->get_nouveau_numero()>0) continue; |
169 |
MG_NOEUD* n1=seg->get_noeud1(); |
170 |
MG_NOEUD* n2=seg->get_noeud2(); |
171 |
MG_NOEUD *no1,*no2; |
172 |
if (n1->get_nouveau_numero()>0) no1=mai->get_mg_noeudid(n1->get_nouveau_numero()); |
173 |
else |
174 |
{ |
175 |
no1=projete_noeud_sur_arete(n1,autreface,&areop,lstaare); |
176 |
} |
177 |
if (n2->get_nouveau_numero()>0) no2=mai->get_mg_noeudid(n2->get_nouveau_numero()); |
178 |
else |
179 |
{ |
180 |
no2=projete_noeud_sur_arete(n2,autreface,&areop,lstaare); |
181 |
} |
182 |
MG_SEGMENT* segnv=insere_segment_orientant(areop,no1,no2,sens); |
183 |
seg->change_nouveau_numero(segnv->get_id()); |
184 |
} |
185 |
} |
186 |
int sens=0; |
187 |
for (int i=0;i<face->get_lien_maillage()->get_nb();i++) |
188 |
{ |
189 |
MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(i); |
190 |
if (mai->get_mg_triangleid(tri->get_id())==NULL) continue; |
191 |
MG_NOEUD* n1=tri->get_noeud1(); |
192 |
MG_NOEUD* n2=tri->get_noeud2(); |
193 |
MG_NOEUD* n3=tri->get_noeud3(); |
194 |
double xyzproj[3]; |
195 |
double xyzprojuv[3]; |
196 |
MG_NOEUD *no1; |
197 |
MG_NOEUD *no2; |
198 |
MG_NOEUD *no3; |
199 |
if (n1->get_nouveau_numero()<1) |
200 |
{ |
201 |
double *xyz=n1->get_coord(); |
202 |
ot.projete(xyz,autreface,xyzprojuv,xyzproj); |
203 |
no1=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO); |
204 |
mai->ajouter_mg_noeud(no1); |
205 |
n1->change_nouveau_numero(no1->get_id()); |
206 |
} |
207 |
else no1=mai->get_mg_noeudid(n1->get_nouveau_numero()); |
208 |
if (n2->get_nouveau_numero()<1) |
209 |
{ |
210 |
double *xyz=n2->get_coord(); |
211 |
ot.projete(xyz,autreface,xyzprojuv,xyzproj); |
212 |
no2=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO); |
213 |
mai->ajouter_mg_noeud(no2); |
214 |
n2->change_nouveau_numero(no2->get_id()); |
215 |
} |
216 |
else no2=mai->get_mg_noeudid(n2->get_nouveau_numero()); |
217 |
if (n3->get_nouveau_numero()<1) |
218 |
{ |
219 |
double *xyz=n3->get_coord(); |
220 |
ot.projete(xyz,autreface,xyzprojuv,xyzproj); |
221 |
no3=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO); |
222 |
mai->ajouter_mg_noeud(no3); |
223 |
n3->change_nouveau_numero(no3->get_id()); |
224 |
} |
225 |
else no3=mai->get_mg_noeudid(n3->get_nouveau_numero()); |
226 |
MG_TRIANGLE* trinv=insere_triangle_orientant(autreface,no1,no2,no3,sens); |
227 |
tri->change_nouveau_numero(trinv->get_id()); |
228 |
} |
229 |
} |
230 |
char mess[255]; |
231 |
sprintf(mess," Maillage des autres aretes"); |
232 |
affiche(mess); |
233 |
TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst,lstbase,lstopp; |
234 |
TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it; |
235 |
vol->get_topologie_sousjacente(&lst); |
236 |
for (int i=0;i<vol->get_nb_face_correspondante();i++) |
237 |
{ |
238 |
MG_FACE* face1; |
239 |
MG_FACE* face2; |
240 |
vol->get_face_correspondante(i,&face1,&face2); |
241 |
face1->get_topologie_sousjacente(&lstbase); |
242 |
face2->get_topologie_sousjacente(&lstopp); |
243 |
lstbase.ajouter(face1); |
244 |
lstopp.ajouter(face2); |
245 |
} |
246 |
for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it)) |
247 |
if (ele->get_dimension()==1) |
248 |
if (!lstbase.existe(ele)) |
249 |
if (!lstopp.existe(ele)) |
250 |
{ |
251 |
MG_SOMMET* som1=((MG_ARETE*)ele)->get_cosommet1()->get_sommet(); |
252 |
MG_SOMMET* som2=((MG_ARETE*)ele)->get_cosommet2()->get_sommet(); |
253 |
MG_NOEUD* no1; |
254 |
MG_NOEUD* no2; |
255 |
int num=0; |
256 |
do |
257 |
{ |
258 |
no1=(MG_NOEUD*)som1->get_lien_maillage()->get(num); |
259 |
num++; |
260 |
} |
261 |
while (mai->get_mg_noeudid(no1->get_id())==NULL); |
262 |
num=0; |
263 |
do |
264 |
{ |
265 |
no2=(MG_NOEUD*)som2->get_lien_maillage()->get(num); |
266 |
num++; |
267 |
} |
268 |
while (mai->get_mg_noeudid(no2->get_id())==NULL); |
269 |
int sens=0; |
270 |
insere_segment_orientant((MG_ARETE*)ele,no1,no2,sens); |
271 |
} |
272 |
sprintf(mess," Maillage des autres faces"); |
273 |
affiche(mess); |
274 |
for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it)) |
275 |
if (ele->get_dimension()==2) |
276 |
if (!lstbase.existe(ele)) |
277 |
if (!lstopp.existe(ele)) |
278 |
{ |
279 |
MG_FACE *facetmp=(MG_FACE*)ele; |
280 |
TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lstf; |
281 |
facetmp->get_topologie_sousjacente(&lstf); |
282 |
TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it1,it2; |
283 |
MG_ELEMENT_TOPOLOGIQUE* eletmp=lstf.premier_commun(lstbase,it1,it2); |
284 |
while (eletmp->get_dimension()!=1) |
285 |
{ |
286 |
eletmp=lstf.suivant_commun(lstbase,it1,it2); |
287 |
} |
288 |
MG_ARETE* arebase=(MG_ARETE*) eletmp; |
289 |
int sens=0; |
290 |
for (int i=0;i<arebase->get_lien_maillage()->get_nb();i++) |
291 |
{ |
292 |
MG_SEGMENT* seg=(MG_SEGMENT*)arebase->get_lien_maillage()->get(i); |
293 |
if (mai->get_mg_segmentid(seg->get_id())==NULL) continue; |
294 |
MG_NOEUD *no1=seg->get_noeud1(); |
295 |
MG_NOEUD *no4=seg->get_noeud2(); |
296 |
MG_NOEUD *no2=mai->get_mg_noeudid(no1->get_nouveau_numero()); |
297 |
MG_NOEUD *no3=mai->get_mg_noeudid(no4->get_nouveau_numero()); |
298 |
insere_quadrangle_orientant(facetmp,no1,no2,no3,no4,sens); |
299 |
|
300 |
} |
301 |
} |
302 |
sprintf(mess," Maillage du volume"); |
303 |
affiche(mess); |
304 |
for (MG_ELEMENT_TOPOLOGIQUE* ele=lstbase.get_premier(it);ele!=NULL;ele=lstbase.get_suivant(it)) |
305 |
if (ele->get_dimension()==2) |
306 |
{ |
307 |
MG_FACE *facetmp=(MG_FACE*)ele; |
308 |
for (int i=0;i<facetmp->get_lien_maillage()->get_nb();i++) |
309 |
{ |
310 |
MG_TRIANGLE* tri=(MG_TRIANGLE*)facetmp->get_lien_maillage()->get(i); |
311 |
if (mai->get_mg_triangleid(tri->get_id())==NULL) continue; |
312 |
MG_NOEUD *no1=tri->get_noeud1(); |
313 |
MG_NOEUD *no2=tri->get_noeud2(); |
314 |
MG_NOEUD *no3=tri->get_noeud3(); |
315 |
MG_NOEUD *no4=mai->get_mg_noeudid(no1->get_nouveau_numero()); |
316 |
MG_NOEUD *no5=mai->get_mg_noeudid(no2->get_nouveau_numero()); |
317 |
MG_NOEUD *no6=mai->get_mg_noeudid(no3->get_nouveau_numero()); |
318 |
mai->ajouter_mg_penta(vol,no1,no2,no3,no4,no5,no6,MAGIC::ORIGINE::MAILLEUR_AUTO); |
319 |
} |
320 |
} |
321 |
return OK; |
322 |
} |
323 |
|
324 |
|
325 |
MG_NOEUD* MAILLEUR3D_COUCHE::projete_noeud_sur_arete(MG_NOEUD* n1, MG_FACE* autreface, MG_ARETE** areop,TPL_MAP_ENTITE<MG_ARETE*> &lstaare) |
326 |
{ |
327 |
MG_GEOMETRIE_OUTILS ot; |
328 |
double *xyz=n1->get_coord(); |
329 |
double xyzproj[3],xyzprojuv[3]; |
330 |
ot.projete(xyz,autreface,xyzprojuv,xyzproj); |
331 |
if (*areop==NULL) |
332 |
{ |
333 |
double dist=1e300; |
334 |
TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita2; |
335 |
for (MG_ARETE* are2=lstaare.get_premier(ita2);are2!=NULL;are2=lstaare.get_suivant(ita2)) |
336 |
{ |
337 |
double t; |
338 |
are2->inverser(t,xyzproj); |
339 |
double xyztmp[3]; |
340 |
are2->evaluer(t,xyztmp); |
341 |
OT_VECTEUR_3D v(xyzproj,xyztmp); |
342 |
if (v.get_longueur2()<dist) |
343 |
{ |
344 |
dist=v.get_longueur2(); |
345 |
*areop=are2; |
346 |
} |
347 |
} |
348 |
} |
349 |
double t; |
350 |
(*areop)->inverser(t,xyzproj); |
351 |
double newxyz[3]; |
352 |
(*areop)->evaluer(t,newxyz); |
353 |
MG_NOEUD* no1=new MG_NOEUD(*areop,newxyz[0],newxyz[1],newxyz[2],MAGIC::ORIGINE::MAILLEUR_AUTO); |
354 |
mai->ajouter_mg_noeud(no1); |
355 |
n1->change_nouveau_numero(no1->get_id()); |
356 |
return no1; |
357 |
} |
358 |
|
359 |
MG_SEGMENT* MAILLEUR3D_COUCHE::insere_segment_orientant(MG_ARETE* are,MG_NOEUD* no1,MG_NOEUD* no2,int &sens) |
360 |
{ |
361 |
if (sens==0) |
362 |
{ |
363 |
double *xyz1=no1->get_coord(); |
364 |
double *xyz2=no2->get_coord(); |
365 |
double t; |
366 |
are->inverser(t,xyz1); |
367 |
double dxyz[3]; |
368 |
are->deriver(t,dxyz); |
369 |
OT_VECTEUR_3D v1(xyz1,xyz2); |
370 |
OT_VECTEUR_3D v2(dxyz); |
371 |
v1.norme(); |
372 |
v2.norme(); |
373 |
if (v1*v2>0) sens=1; else sens=-1; |
374 |
} |
375 |
MG_SEGMENT* segnv; |
376 |
if (sens==1) segnv=mai->ajouter_mg_segment(are,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO); |
377 |
else if (sens==-1) segnv=mai->ajouter_mg_segment(are,no2,no1,MAGIC::ORIGINE::MAILLEUR_AUTO); |
378 |
return segnv; |
379 |
} |
380 |
|
381 |
|
382 |
MG_TRIANGLE* MAILLEUR3D_COUCHE::insere_triangle_orientant(MG_FACE* face,MG_NOEUD* no1,MG_NOEUD* no2,MG_NOEUD* no3,int &sens) |
383 |
{ |
384 |
if (sens==0) |
385 |
{ |
386 |
double *xyz1=no1->get_coord(); |
387 |
double *xyz2=no2->get_coord(); |
388 |
double *xyz3=no3->get_coord(); |
389 |
double uv[3]; |
390 |
face->inverser(uv,xyz1); |
391 |
double nor[3]; |
392 |
face->calcul_normale_unitaire(uv,nor); |
393 |
OT_VECTEUR_3D n(nor); |
394 |
OT_VECTEUR_3D v1(xyz1,xyz3); |
395 |
OT_VECTEUR_3D v2(xyz1,xyz2); |
396 |
OT_VECTEUR_3D nn=v1&v2; |
397 |
nn.norme(); |
398 |
if (n*nn>0) sens=1; else sens=-1; |
399 |
} |
400 |
|
401 |
|
402 |
MG_NOEUD* nd1; |
403 |
MG_NOEUD* nd2; |
404 |
MG_NOEUD* nd3; |
405 |
if(sens==1) {nd1=no1;nd2=no2;nd3=no3;} |
406 |
else if(sens==-1) {nd1=no1;nd2=no3;nd3=no2;} |
407 |
MG_TRIANGLE* trinv; |
408 |
MG_SEGMENT* mgsegment1=mai->get_mg_segment(no1->get_id(),no2->get_id()); |
409 |
MG_SEGMENT* mgsegment2=mai->get_mg_segment(no2->get_id(),no3->get_id()); |
410 |
MG_SEGMENT* mgsegment3=mai->get_mg_segment(no3->get_id(),no1->get_id()); |
411 |
if (mgsegment1==NULL) mgsegment1=mai->ajouter_mg_segment(face,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO); |
412 |
if (mgsegment2==NULL) mgsegment2=mai->ajouter_mg_segment(face,no2,no3,MAGIC::ORIGINE::MAILLEUR_AUTO); |
413 |
if (mgsegment3==NULL) mgsegment3=mai->ajouter_mg_segment(face,no3,no1,MAGIC::ORIGINE::MAILLEUR_AUTO); |
414 |
trinv=new M3D_TRIANGLE(face,no1,no2,no3,mgsegment1,mgsegment2,mgsegment3,MAGIC::ORIGINE::MAILLEUR_AUTO); |
415 |
int resultat=mai->ajouter_mg_triangle(trinv); |
416 |
if (resultat==FAIL) |
417 |
{ |
418 |
delete trinv; |
419 |
return NULL; |
420 |
} |
421 |
return trinv; |
422 |
} |
423 |
|
424 |
MG_QUADRANGLE* MAILLEUR3D_COUCHE::insere_quadrangle_orientant(MG_FACE* face, MG_NOEUD* no1, MG_NOEUD* no2, MG_NOEUD* no3, MG_NOEUD* no4, int& sens) |
425 |
{ |
426 |
if (sens==0) |
427 |
{ |
428 |
double *xyz1=no1->get_coord(); |
429 |
double *xyz2=no2->get_coord(); |
430 |
double *xyz3=no3->get_coord(); |
431 |
double uv[3]; |
432 |
face->inverser(uv,xyz1); |
433 |
double nor[3]; |
434 |
face->calcul_normale_unitaire(uv,nor); |
435 |
OT_VECTEUR_3D n(nor); |
436 |
OT_VECTEUR_3D v1(xyz1,xyz3); |
437 |
OT_VECTEUR_3D v2(xyz1,xyz2); |
438 |
OT_VECTEUR_3D nn=v1&v2; |
439 |
nn.norme(); |
440 |
if (n*nn>0) sens=1; else sens=-1; |
441 |
} |
442 |
MG_QUADRANGLE* quadnv; |
443 |
if (sens==1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no2,no3,no4,MAGIC::ORIGINE::MAILLEUR_AUTO); |
444 |
else if (sens==-1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no4,no3,no2,MAGIC::ORIGINE::MAILLEUR_AUTO); |
445 |
return quadnv; |
446 |
} |