1 |
francois |
222 |
#include "gestionversion.h"
|
2 |
|
|
#include "mg_lissage.h"
|
3 |
|
|
#include "fem_solution.h"
|
4 |
|
|
#include "fem_maillage.h"
|
5 |
|
|
#include "mg_maillage.h"
|
6 |
|
|
#include "mg_gestionnaire.h"
|
7 |
|
|
#include "mg_triangle_peau.h"
|
8 |
|
|
#include <stdio.h>
|
9 |
|
|
#include <string.h>
|
10 |
|
|
//---------------------------------------------------------------------------
|
11 |
|
|
|
12 |
|
|
|
13 |
|
|
MG_LISSAGE::MG_LISSAGE()
|
14 |
|
|
{
|
15 |
|
|
}
|
16 |
|
|
|
17 |
|
|
|
18 |
|
|
MG_LISSAGE::~MG_LISSAGE()
|
19 |
|
|
{
|
20 |
|
|
}
|
21 |
|
|
|
22 |
|
|
void MG_LISSAGE::extract_skin(FEM_MAILLAGE* mai,MG_GESTIONNAIRE& gest2)
|
23 |
|
|
{
|
24 |
|
|
|
25 |
|
|
//�tape 0 - On commence par mettre � z�ro tous les nouveau_numero des triangles et des noeuds du maillage
|
26 |
|
|
MG_MAILLAGE* mg_mai = (MG_MAILLAGE*)mai->get_mg_maillage();
|
27 |
|
|
LISTE_MG_TRIANGLE::iterator it_tri;
|
28 |
|
|
for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
|
29 |
|
|
{
|
30 |
|
|
mgtri->change_nouveau_numero(0);
|
31 |
|
|
}
|
32 |
|
|
LISTE_MG_NOEUD::iterator it_noeud;
|
33 |
|
|
for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
|
34 |
|
|
{
|
35 |
|
|
mgnoeud->change_nouveau_numero(0);
|
36 |
|
|
}
|
37 |
|
|
|
38 |
|
|
//�tape 1 - On boucle ensuite tous les t�tra�dres pour ajouter un compteur du nombre de fois qu'un triangle appartient � 1 t�tra
|
39 |
|
|
LISTE_FEM_TETRA::iterator it_tetra;
|
40 |
|
|
for (FEM_TETRA* tet=mai->get_premier_tetra(it_tetra);tet!=NULL;tet=mai->get_suivant_tetra(it_tetra))
|
41 |
|
|
{
|
42 |
|
|
MG_TETRA* mgtet=(MG_TETRA*)tet->get_mg_element_maillage();
|
43 |
|
|
int origine = mgtet->get_origine();
|
44 |
|
|
if (origine == OPTIMISE)
|
45 |
|
|
{
|
46 |
|
|
int num1 = mgtet->get_triangle1()->get_nouveau_numero();
|
47 |
|
|
int num2 = mgtet->get_triangle2()->get_nouveau_numero();
|
48 |
|
|
int num3 = mgtet->get_triangle3()->get_nouveau_numero();
|
49 |
|
|
int num4 = mgtet->get_triangle4()->get_nouveau_numero();
|
50 |
|
|
num1++;
|
51 |
|
|
num2++;
|
52 |
|
|
num3++;
|
53 |
|
|
num4++;
|
54 |
|
|
mgtet->get_triangle1()->change_nouveau_numero(num1);
|
55 |
|
|
mgtet->get_triangle2()->change_nouveau_numero(num2);
|
56 |
|
|
mgtet->get_triangle3()->change_nouveau_numero(num3);
|
57 |
|
|
mgtet->get_triangle4()->change_nouveau_numero(num4);
|
58 |
|
|
}
|
59 |
|
|
}
|
60 |
|
|
|
61 |
|
|
//�tape 2 - On boucle l'ensemble des triangles identifi�s � l'�tape 1 pour identifier les noeuds leur appartenant
|
62 |
|
|
for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
|
63 |
|
|
{
|
64 |
|
|
int num = mgtri->get_nouveau_numero();
|
65 |
|
|
if (num == 1)
|
66 |
|
|
{
|
67 |
|
|
MG_NOEUD* noeud1 = mgtri->get_noeud1();
|
68 |
|
|
MG_NOEUD* noeud2 = mgtri->get_noeud2();
|
69 |
|
|
MG_NOEUD* noeud3 = mgtri->get_noeud3();
|
70 |
|
|
noeud1->change_nouveau_numero(1);
|
71 |
|
|
noeud2->change_nouveau_numero(1);
|
72 |
|
|
noeud3->change_nouveau_numero(1);
|
73 |
|
|
}
|
74 |
|
|
}
|
75 |
|
|
|
76 |
|
|
//�tape 3 - On cr�e un nouveau gestionnaire et un nouveau maillage
|
77 |
|
|
|
78 |
|
|
|
79 |
|
|
MG_MAILLAGE* mai2 = new MG_MAILLAGE(NULL);
|
80 |
|
|
gest2.ajouter_mg_maillage(mai2);
|
81 |
|
|
|
82 |
|
|
// //�tape 4 - On boucle l'ensemble des noeuds identifi�s � l'�tape 2 pour les recr�er dans le second maillage
|
83 |
|
|
for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
|
84 |
|
|
{
|
85 |
|
|
int num = mgnoeud->get_nouveau_numero();
|
86 |
|
|
if (num == 1)
|
87 |
|
|
{
|
88 |
|
|
double x = mgnoeud->get_x();
|
89 |
|
|
double y = mgnoeud->get_y();
|
90 |
|
|
double z = mgnoeud->get_z();
|
91 |
|
|
MG_NOEUD* noeud1 = new MG_NOEUD(NULL,x,y,z,TRIANGULATION);
|
92 |
|
|
mai2->ajouter_mg_noeud(noeud1);
|
93 |
|
|
mgnoeud->change_nouveau_numero(noeud1->get_id());
|
94 |
|
|
}
|
95 |
|
|
}
|
96 |
|
|
|
97 |
|
|
// //�tape 5 - On boucle l'ensemble des triangles identifi�s � l'�tape 1 pour les recr�er dans le maillage 2
|
98 |
|
|
for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
|
99 |
|
|
{
|
100 |
|
|
int num = mgtri->get_nouveau_numero();
|
101 |
|
|
if (num == 1)
|
102 |
|
|
{
|
103 |
|
|
MG_NOEUD* noeud1 = mgtri->get_noeud1();
|
104 |
|
|
MG_NOEUD* noeud2 = mgtri->get_noeud2();
|
105 |
|
|
MG_NOEUD* noeud3 = mgtri->get_noeud3();
|
106 |
|
|
MG_NOEUD* node1 = mai2->get_mg_noeudid(noeud1->get_nouveau_numero());
|
107 |
|
|
MG_NOEUD* node2 = mai2->get_mg_noeudid(noeud2->get_nouveau_numero());
|
108 |
|
|
MG_NOEUD* node3 = mai2->get_mg_noeudid(noeud3->get_nouveau_numero());
|
109 |
|
|
MG_TRIANGLE_PEAU* tri2 = insere_triangle(NULL,node1,node2,node3,mai2);
|
110 |
|
|
}
|
111 |
|
|
}
|
112 |
|
|
|
113 |
|
|
}
|
114 |
|
|
|
115 |
|
|
MG_TRIANGLE_PEAU* MG_LISSAGE::insere_triangle(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,MG_MAILLAGE* mg_maillage)
|
116 |
|
|
{
|
117 |
|
|
MG_TRIANGLE_PEAU* voisin1=NULL,*voisin2=NULL,*voisin3=NULL;
|
118 |
|
|
MG_SEGMENT* mgsegment1=mg_maillage->get_mg_segment(mgnoeud1->get_id(),mgnoeud2->get_id());
|
119 |
|
|
MG_SEGMENT* mgsegment2=mg_maillage->get_mg_segment(mgnoeud2->get_id(),mgnoeud3->get_id());
|
120 |
|
|
MG_SEGMENT* mgsegment3=mg_maillage->get_mg_segment(mgnoeud3->get_id(),mgnoeud1->get_id());
|
121 |
|
|
if (mgsegment1==NULL)
|
122 |
|
|
{
|
123 |
|
|
mgsegment1=mg_maillage->ajouter_mg_segment(topo,mgnoeud1,mgnoeud2,TRIANGULATION);
|
124 |
|
|
voisin1=NULL;
|
125 |
|
|
}
|
126 |
|
|
else voisin1=recherche_voisin(mgnoeud1,mgnoeud2);
|
127 |
|
|
if (mgsegment2==NULL)
|
128 |
|
|
{
|
129 |
|
|
mgsegment2=mg_maillage->ajouter_mg_segment(topo,mgnoeud2,mgnoeud3,TRIANGULATION);
|
130 |
|
|
voisin2=NULL;
|
131 |
|
|
}
|
132 |
|
|
else voisin2=recherche_voisin(mgnoeud2,mgnoeud3);
|
133 |
|
|
if (mgsegment3==NULL)
|
134 |
|
|
{
|
135 |
|
|
mgsegment3=mg_maillage->ajouter_mg_segment(topo,mgnoeud3,mgnoeud1,TRIANGULATION);
|
136 |
|
|
voisin3=NULL;
|
137 |
|
|
}
|
138 |
|
|
else voisin3=recherche_voisin(mgnoeud1,mgnoeud3);
|
139 |
|
|
MG_TRIANGLE_PEAU* mtriangle=new MG_TRIANGLE_PEAU(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,TRIANGULATION);
|
140 |
|
|
mg_maillage->ajouter_mg_triangle(mtriangle);
|
141 |
|
|
mtriangle->change_voisin1(voisin1);
|
142 |
|
|
mtriangle->change_voisin2(voisin2);
|
143 |
|
|
mtriangle->change_voisin3(voisin3);
|
144 |
|
|
return mtriangle;
|
145 |
|
|
}
|
146 |
|
|
|
147 |
|
|
MG_TRIANGLE_PEAU* MG_LISSAGE::recherche_voisin(MG_NOEUD* mg_noeud1,MG_NOEUD* mg_noeud2)
|
148 |
|
|
{
|
149 |
|
|
int nb1=mg_noeud1->get_lien_triangle()->get_nb();
|
150 |
|
|
int nb2=mg_noeud2->get_lien_triangle()->get_nb();
|
151 |
|
|
for (int i=0;i<nb1;i++)
|
152 |
|
|
for (int j=0;j<nb2;j++)
|
153 |
|
|
if (mg_noeud1->get_lien_triangle()->get(i)==mg_noeud2->get_lien_triangle()->get(j)) return (MG_TRIANGLE_PEAU*)mg_noeud1->get_lien_triangle()->get(i);
|
154 |
|
|
return NULL;
|
155 |
|
|
}
|