MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mg_triangle.cpp
Aller à la documentation de ce fichier.
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 //####// mg_triangle.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:54 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 #include "mg_triangle.h"
26 #include "mg_maillage.h"
27 #include "ot_decalage_parametre.h"
28 
29 MG_TRIANGLE::MG_TRIANGLE(unsigned long num,MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_SEGMENT* mgsegment1,class MG_SEGMENT* mgsegment2,class MG_SEGMENT* mgsegment3,int origine):MG_ELEMENT_MAILLAGE(num,topo,origine),noeud1(mgnoeud1),noeud2(mgnoeud2),noeud3(mgnoeud3),segment1(mgsegment1),segment2(mgsegment2),segment3(mgsegment3)
30 {
31  init_triangle();
32 }
33 
34 MG_TRIANGLE::MG_TRIANGLE(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_SEGMENT* mgsegment1,class MG_SEGMENT* mgsegment2,class MG_SEGMENT* mgsegment3,int origine):MG_ELEMENT_MAILLAGE(topo,origine),noeud1(mgnoeud1),noeud2(mgnoeud2),noeud3(mgnoeud3),segment1(mgsegment1),segment2(mgsegment2),segment3(mgsegment3)
35 {
36  init_triangle();
37 }
38 
40 {
41  init_triangle();
42 }
43 
45 {
46  MG_NOEUD* nd1=mgmai->get_mg_noeudid(noeud1->get_id()+decalage);
47  MG_NOEUD* nd2=mgmai->get_mg_noeudid(noeud2->get_id()+decalage);
48  MG_NOEUD* nd3=mgmai->get_mg_noeudid(noeud3->get_id()+decalage);
49  MG_SEGMENT* seg1=mgmai->get_mg_segmentid(segment1->get_id()+decalage);
50  MG_SEGMENT* seg2=mgmai->get_mg_segmentid(segment2->get_id()+decalage);
51  MG_SEGMENT* seg3=mgmai->get_mg_segmentid(segment3->get_id()+decalage);
52  MG_TRIANGLE* tri=new MG_TRIANGLE(this->get_id()+decalage,liaison_topologique,nd1,nd2,nd3,seg1,seg2,seg3,MAGIC::ORIGINE::DUPLIQUER);
53  mgmai->ajouter_mg_triangle(tri);
54  return tri;
55 }
56 
57 
58 
60 {
61  if (noeud1!=NULL) noeud1->get_lien_triangle()->supprimer(this);
62  if (noeud2!=NULL) noeud2->get_lien_triangle()->supprimer(this);
63  if (noeud3!=NULL) noeud3->get_lien_triangle()->supprimer(this);
64  unsigned long noeudminid=std::min(noeud1->get_id(),noeud2->get_id());
65  noeudminid=std::min(noeudminid,noeud3->get_id());
66  if (noeud1!=NULL)
67  if (noeud1->get_id()==noeudminid) noeud1->get_lien_petit_triangle()->supprimer(this);
68  if (noeud2!=NULL)
69  if (noeud2->get_id()==noeudminid) noeud2->get_lien_petit_triangle()->supprimer(this);
70  if (noeud3!=NULL)
71  if (noeud3->get_id()==noeudminid) noeud3->get_lien_petit_triangle()->supprimer(this);
72  if (segment1!=NULL) {
75  }
76  if (segment2!=NULL) {
79  }
80  if (segment3!=NULL) {
83  }
84  if (liaison_topologique!=NULL)
86 }
87 
89 {
90  if (noeud1!=NULL) noeud1->get_lien_triangle()->ajouter(this);
91  if (noeud2!=NULL) noeud2->get_lien_triangle()->ajouter(this);
92  if (noeud3!=NULL) noeud3->get_lien_triangle()->ajouter(this);
93  unsigned long noeudminid=std::min(noeud1->get_id(),noeud2->get_id());
94  noeudminid=std::min(noeudminid,noeud3->get_id());
95  if (noeud1!=NULL)
96  if (noeud1->get_id()==noeudminid) noeud1->get_lien_petit_triangle()->ajouter(this);
97  if (noeud2!=NULL)
98  if (noeud2->get_id()==noeudminid) noeud2->get_lien_petit_triangle()->ajouter(this);
99  if (noeud3!=NULL)
100  if (noeud3->get_id()==noeudminid) noeud3->get_lien_petit_triangle()->ajouter(this);
101  if (segment1!=NULL) {
104  }
105  if (segment2!=NULL) {
108  }
109  if (segment3!=NULL) {
112  }
113  if ( (segment1!=NULL) && (segment2!=NULL)&& (segment3!=NULL) )longueur=0.3333333333333333*(segment1->get_longueur()+segment2->get_longueur()+segment3->get_longueur());
114  if (liaison_topologique==NULL) return;
116 }
117 
118 
120 {
122 }
123 
124 
125 
127 {
128  return noeud1;
129 }
130 
132 {
133  return noeud2;
134 }
135 
136 
138 {
139  return noeud3;
140 }
141 
143 {
144  return segment1;
145 }
146 
148 {
149  return segment2;
150 }
151 
153 {
154  return segment3;
155 }
156 
158 {
159 MG_NOEUD* noeud=noeud2;
160 noeud2=noeud3;
161 noeud3=noeud;
162 MG_SEGMENT* segment=segment3;
164 segment1=segment;
165 }
166 
168 {
169  return 2;
170 }
171 
173 {
174  return longueur;
175 }
176 
178 {
179  return &tetra;
180 }
181 
183 {
184  return &penta;
185 }
186 
188 {
189  return &pyramide;
190 }
191 
192 BOITE_2D MG_TRIANGLE::get_boite_2D(double periodeu,double periodev)
193 {
194  OT_DECALAGE_PARAMETRE decalage(periodeu,periodev);
195 
196  double coouv1[2];
197  double coouv2[2];
198  double coouv3[2];
199  coouv1[0]=noeud1->get_u();
200  coouv1[1]=noeud1->get_v();
201  coouv2[0]=noeud2->get_u();
202  coouv2[1]=noeud2->get_v();
203  coouv3[0]=noeud3->get_u();
204  coouv3[1]=noeud3->get_v();
205  double coouvd1[2];
206  double coouvd2[2];
207  double coouvd3[2];
208  double du=decalage.calcul_decalage_parametre_u(coouv1[0]);
209  double dv=decalage.calcul_decalage_parametre_v(coouv1[1]);
210  coouvd1[0]=decalage.decalage_parametre_u(coouv1[0],du);
211  coouvd1[1]=decalage.decalage_parametre_v(coouv1[1],dv);
212  coouvd2[0]=decalage.decalage_parametre_u(coouv2[0],du);
213  coouvd2[1]=decalage.decalage_parametre_v(coouv2[1],dv);
214  coouvd3[0]=decalage.decalage_parametre_u(coouv3[0],du);
215  coouvd3[1]=decalage.decalage_parametre_v(coouv3[1],dv);
216  double umin,vmin,umax,vmax;
217  umin=std::min(coouvd1[0],coouvd2[0]);
218  umin=std::min(umin,coouvd3[0]);
219  umax=std::max(coouvd1[0],coouvd2[0]);
220  umax=std::max(umax,coouvd3[0]);
221  vmin=std::min(coouvd1[1],coouvd2[1]);
222  vmin=std::min(vmin,coouvd3[1]);
223  vmax=std::max(coouv1[1],coouvd2[1]);
224  vmax=std::max(vmax,coouvd3[1]);
225  umin=umin-du;
226  umax=umax-du;
227  vmin=vmin-dv;
228  vmax=vmax-dv;
229  BOITE_2D boite(umin,vmin,umax,vmax);
230  return boite;
231 }
232 
234 {
235  double coo1[3];
236  double coo2[3];
237  double coo3[3];
238  coo1[0]=noeud1->get_x();
239  coo1[1]=noeud1->get_y();
240  coo1[2]=noeud1->get_z();
241  coo2[0]=noeud2->get_x();
242  coo2[1]=noeud2->get_y();
243  coo2[2]=noeud2->get_z();
244  coo3[0]=noeud3->get_x();
245  coo3[1]=noeud3->get_y();
246  coo3[2]=noeud3->get_z();
247  double xmin,ymin,zmin,xmax,ymax,zmax;
248  xmin=std::min(coo1[0],coo2[0]);
249  xmin=std::min(xmin,coo3[0]);
250  xmax=std::max(coo1[0],coo2[0]);
251  xmax=std::max(xmax,coo3[0]);
252  ymin=std::min(coo1[1],coo2[1]);
253  ymin=std::min(ymin,coo3[1]);
254  ymax=std::max(coo1[1],coo2[1]);
255  ymax=std::max(ymax,coo3[1]);
256  zmin=std::min(coo1[2],coo2[2]);
257  zmin=std::min(zmin,coo3[2]);
258  zmax=std::max(coo1[2],coo2[2]);
259  zmax=std::max(zmax,coo3[2]);
260  BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
261  return boite;
262 }
264 {
265  for (int j=0;j<MAX_TYPE_SOLUTION;j++)
266  {
270  }
271 }
272 
273 
274 void MG_TRIANGLE::normal(double *n)
275 {
276  double *xyz1=noeud1->get_coord();
277  double *xyz2=noeud2->get_coord();
278  double *xyz3=noeud3->get_coord();
279  OT_VECTEUR_3D vec1(xyz1,xyz2);
280  OT_VECTEUR_3D vec2(xyz1,xyz3);
281  OT_VECTEUR_3D nor=vec1&vec2;
282  nor.norme();
283  n[0]=nor.get_x();
284  n[1]=nor.get_y();
285  n[2]=nor.get_z();
286 }
287 
288 void MG_TRIANGLE::enregistrer(std::ostream& o,double version)
289 {
291  if (liaison_topologique==NULL) o << "%" << get_id() << "=TRIANGLE(NULL,$" << noeud1->get_id() << ",$" << noeud2->get_id() << ",$" << noeud3->get_id() << "," << origine_creation << ");" << std::endl;
292  else if (liaison_topologique->get_dimension()==2) o << "%" << get_id() << "=TRIANGLE($"<< get_lien_topologie()->get_id() << ",$" << noeud1->get_id() << ",$" << noeud2->get_id() << ",$" << noeud3->get_id() << "," << origine_creation << ");" << std::endl;
293 }
294 
295 
296 
297 
298 
299 
MG_ELEMENT_MAILLAGE::change_solution
virtual void change_solution(double val, int num=0)
Definition: mg_element_maillage.cpp:107
MG_TRIANGLE::get_segment1
virtual MG_SEGMENT * get_segment1(void)
Definition: mg_triangle.cpp:142
MG_SEGMENT
Definition: mg_segment.h:38
MG_TRIANGLE::get_longueur
virtual double get_longueur(void)
Definition: mg_triangle.cpp:172
gestionversion.h
MG_TRIANGLE::dupliquer
virtual MG_TRIANGLE * dupliquer(class MG_MAILLAGE *mgmai, long decalage)
Definition: mg_triangle.cpp:44
MG_TRIANGLE::get_boite_2D
virtual class BOITE_2D get_boite_2D(double periodeu, double periodev)
Definition: mg_triangle.cpp:192
MG_ELEMENT_MAILLAGE::origine_creation
int origine_creation
Definition: mg_element_maillage.h:72
MG_NOEUD::get_lien_petit_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_petit_triangle(void)
Definition: mg_noeud.cpp:159
MG_NOEUD::get_z
virtual double get_z(void)
Definition: mg_noeud.cpp:87
MG_NOEUD::get_lien_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_noeud.cpp:153
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
MG_MAILLAGE::get_mg_segmentid
MG_SEGMENT * get_mg_segmentid(unsigned long num)
Definition: mg_maillage.cpp:595
MG_TRIANGLE::pyramide
TPL_LISTE_ENTITE< class MG_PYRAMIDE * > pyramide
Definition: mg_triangle.h:85
MG_ELEMENT_MAILLAGE
Definition: mg_element_maillage.h:38
MG_TRIANGLE::get_segment2
virtual MG_SEGMENT * get_segment2(void)
Definition: mg_triangle.cpp:147
TPL_SET::supprimer
void supprimer(X x)
Definition: tpl_set.h:62
MG_ELEMENT_TOPOLOGIQUE::get_dimension
virtual int get_dimension(void)=0
MG_TRIANGLE
Definition: mg_triangle.h:38
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
MG_TRIANGLE::noeud3
class MG_NOEUD * noeud3
Definition: mg_triangle.h:76
MG_TRIANGLE::get_segment3
virtual MG_SEGMENT * get_segment3(void)
Definition: mg_triangle.cpp:152
MG_TRIANGLE::penta
TPL_LISTE_ENTITE< class MG_PENTA * > penta
Definition: mg_triangle.h:84
MG_TRIANGLE::get_lien_tetra
TPL_LISTE_ENTITE< class MG_TETRA * > * get_lien_tetra(void)
Definition: mg_triangle.cpp:177
ot_decalage_parametre.h
MG_ELEMENT_TOPOLOGIQUE::get_lien_maillage
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
Definition: mg_element_topologique.cpp:62
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
MG_TRIANGLE::longueur
double longueur
Definition: mg_triangle.h:82
MG_ELEMENT_MAILLAGE::solution
double solution[MAX_TYPE_SOLUTION]
Definition: mg_element_maillage.h:73
MG_TRIANGLE::init_triangle
void init_triangle(void)
Definition: mg_triangle.cpp:88
MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO
static int DIMENSIONMAILLAGESANSTOPO
Definition: mg_maillage.h:177
MG_NOEUD::get_u
virtual double get_u(void)
Definition: mg_noeud.cpp:108
MG_TRIANGLE::MG_TRIANGLE
MG_TRIANGLE(unsigned long num, MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, class MG_SEGMENT *mgsegment1, class MG_SEGMENT *mgsegment2, class MG_SEGMENT *mgsegment3, int origine)
Definition: mg_triangle.cpp:29
TPL_SET::ajouter
void ajouter(X x)
Definition: tpl_set.h:55
MG_MAILLAGE::ajouter_mg_triangle
MG_TRIANGLE * ajouter_mg_triangle(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, int origine, unsigned long num=0)
Definition: mg_maillage.cpp:731
MG_SEGMENT::get_lien_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_segment.cpp:243
MG_NOEUD
Definition: mg_noeud.h:41
MAX_TYPE_SOLUTION
const int MAX_TYPE_SOLUTION
Definition: mg_definition.h:42
MG_ELEMENT_MAILLAGE::liaison_topologique
MG_ELEMENT_TOPOLOGIQUE * liaison_topologique
Definition: mg_element_maillage.h:69
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
MG_NOEUD::get_coord
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
MG_TRIANGLE::noeud2
class MG_NOEUD * noeud2
Definition: mg_triangle.h:75
MG_TRIANGLE::segment3
class MG_SEGMENT * segment3
Definition: mg_triangle.h:80
MG_TRIANGLE::get_lien_pyramide
TPL_LISTE_ENTITE< class MG_PYRAMIDE * > * get_lien_pyramide(void)
Definition: mg_triangle.cpp:187
MG_TRIANGLE::extrapoler_solution_noeud
virtual void extrapoler_solution_noeud(void)
Definition: mg_triangle.cpp:263
MG_TRIANGLE::segment1
class MG_SEGMENT * segment1
Definition: mg_triangle.h:78
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
MG_TRIANGLE::get_lien_penta
TPL_LISTE_ENTITE< class MG_PENTA * > * get_lien_penta(void)
Definition: mg_triangle.cpp:182
MG_TRIANGLE::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_triangle.cpp:131
MG_TRIANGLE::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: mg_triangle.cpp:288
MAGIC::ORIGINE::DUPLIQUER
@ DUPLIQUER
Definition: mg_definition.h:79
OT_DECALAGE_PARAMETRE::decalage_parametre_u
double decalage_parametre_u(double par, double dpar)
Definition: ot_decalage_parametre.cpp:51
MG_NOEUD::get_v
virtual double get_v(void)
Definition: mg_noeud.cpp:113
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
MG_MAILLAGE::get_mg_noeudid
MG_NOEUD * get_mg_noeudid(unsigned long num)
Definition: mg_maillage.cpp:451
MG_NOEUD::get_x
virtual double get_x(void)
Definition: mg_noeud.cpp:77
MG_TRIANGLE::get_boite_3D
virtual class BOITE_3D get_boite_3D(void)
Definition: mg_triangle.cpp:233
OT_REFERENCE::decrementer
void decrementer(void)
Definition: ot_reference.cpp:45
MG_TRIANGLE::get_type_entite
virtual int get_type_entite(void)
Definition: mg_triangle.cpp:119
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
BOITE_2D
Definition: ot_boite_2d.h:28
MG_TRIANGLE::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_triangle.cpp:126
BOITE_3D
Definition: ot_boite_3d.h:27
mg_maillage.h
MAGIC::TYPE_ENTITE::IDMG_TRIANGLE
@ IDMG_TRIANGLE
Definition: mg_definition.h:69
OT_DECALAGE_PARAMETRE::calcul_decalage_parametre_v
double calcul_decalage_parametre_v(double par)
Definition: ot_decalage_parametre.cpp:43
MG_TRIANGLE::~MG_TRIANGLE
virtual ~MG_TRIANGLE()
Definition: mg_triangle.cpp:59
MG_ELEMENT_MAILLAGE::get_lien_topologie
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: mg_element_maillage.cpp:51
MG_TRIANGLE::get_noeud3
virtual MG_NOEUD * get_noeud3(void)
Definition: mg_triangle.cpp:137
OT_DECALAGE_PARAMETRE::calcul_decalage_parametre_u
double calcul_decalage_parametre_u(double par)
Definition: ot_decalage_parametre.cpp:35
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
MG_TRIANGLE::inverse_sens
virtual void inverse_sens(void)
Definition: mg_triangle.cpp:157
OT_REFERENCE::incrementer
void incrementer(void)
Definition: ot_reference.cpp:40
MG_MAILLAGE
Definition: mg_maillage.h:62
TPL_LISTE_ENTITE< class MG_TETRA * >
MG_TRIANGLE::noeud1
class MG_NOEUD * noeud1
Definition: mg_triangle.h:74
MG_SEGMENT::get_longueur
virtual double get_longueur(void)
Definition: mg_segment.cpp:125
OT_DECALAGE_PARAMETRE::decalage_parametre_v
double decalage_parametre_v(double par, double dpar)
Definition: ot_decalage_parametre.cpp:75
MG_TRIANGLE::normal
virtual void normal(double *n)
Definition: mg_triangle.cpp:274
MG_TRIANGLE::segment2
class MG_SEGMENT * segment2
Definition: mg_triangle.h:79
MG_TRIANGLE::tetra
TPL_LISTE_ENTITE< class MG_TETRA * > tetra
Definition: mg_triangle.h:83
TPL_LISTE_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_liste_entite.h:42
MG_TRIANGLE::get_dimension
virtual int get_dimension(void)
Definition: mg_triangle.cpp:167
OT_DECALAGE_PARAMETRE
Definition: ot_decalage_parametre.h:28
mg_triangle.h
MG_NOEUD::get_y
virtual double get_y(void)
Definition: mg_noeud.cpp:82