MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mg_segment.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_segment.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 <math.h>
26 #include "mg_segment.h"
27 #include "mg_sommet.h"
28 #include "ot_decalage_parametre.h"
29 #include "mg_maillage.h"
30 
31 
32 MG_SEGMENT::MG_SEGMENT(unsigned long num,MG_ELEMENT_TOPOLOGIQUE* topo,MG_NOEUD *mgnoeud1,MG_NOEUD *mgnoeud2,int origine,double longue):MG_ELEMENT_MAILLAGE(num,topo,origine),OT_REFERENCE(),noeud1(mgnoeud1),noeud2(mgnoeud2),longueur(longue),dimension(0),distance_metrique_valide(false)
33 {
34  if (longueur==0.) calcule_longueur();
35  if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
36  if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
37  if ((noeud1!=NULL) && (noeud2!=NULL))
39  else noeud2->get_lien_petit_segment()->ajouter(this);
42  if (liaison_topologique==NULL) return;
44 }
45 
46 MG_SEGMENT::MG_SEGMENT(MG_ELEMENT_TOPOLOGIQUE* topo,MG_NOEUD *mgnoeud1,MG_NOEUD *mgnoeud2,int origine,double longue):MG_ELEMENT_MAILLAGE(topo,origine),OT_REFERENCE(),noeud1(mgnoeud1),noeud2(mgnoeud2),longueur(longue),dimension(0),distance_metrique_valide(false)
47 {
48  if (longueur==0.) calcule_longueur();
49  if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
50  if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
51  if ((noeud1!=NULL) && (noeud2!=NULL))
53  else noeud2->get_lien_petit_segment()->ajouter(this);
56  if (liaison_topologique==NULL) return;
58 }
59 
61 {
62  if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
63  if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
64  if ((noeud1!=NULL) && (noeud2!=NULL))
66  else noeud2->get_lien_petit_segment()->ajouter(this);
69  if (liaison_topologique==NULL) return;
71 }
72 
73 
75 {
76  MG_NOEUD* nd1=mgmai->get_mg_noeudid(noeud1->get_id()+decalage);
77  MG_NOEUD* nd2=mgmai->get_mg_noeudid(noeud2->get_id()+decalage);
78  if (nd1==NULL)
79  noeud1->get_id();
80  if (nd2==NULL)
81  noeud2->get_id();
83  mgmai->ajouter_mg_segment(seg);
84  return seg;
85 }
86 
87 
89 {
90  if (noeud1!=NULL) noeud1->get_lien_segment()->supprimer(this);
91  if (noeud2!=NULL) noeud2->get_lien_segment()->supprimer(this);
92  if ((noeud1!=NULL) && (noeud2!=NULL))
97  if (liaison_topologique!=NULL)
99 }
100 
101 
103 {
105 }
106 
107 
109 {
110  return noeud1;
111 }
112 
114 {
115  return noeud2;
116 }
117 
119 {
120 MG_NOEUD* noeud=noeud1;
121 noeud1=noeud2;
122 noeud2=noeud1;
123 }
124 
126 {
127  return longueur;
128 }
129 
130 void MG_SEGMENT::change_noeud1(MG_NOEUD* mgnoeud,double longue)
131 {
132  if (noeud1!=NULL) noeud1->get_lien_segment()->supprimer(this);
133  if (noeud1!=NULL)
135  noeud1=mgnoeud;
136  longueur=longue;
137  if (longueur==0.) calcule_longueur();
138  if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
139  if (noeud1!=NULL)
141 }
142 
143 
144 void MG_SEGMENT::change_noeud2(MG_NOEUD* mgnoeud,double longue)
145 {
146  if (noeud2!=NULL) noeud2->get_lien_segment()->supprimer(this);
147  if (noeud2!=NULL)
149  noeud2=mgnoeud;
150  longueur=longue;
151  if (longueur==0.) calcule_longueur();
152  if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
153  if (noeud2!=NULL)
155 }
156 
157 
158 void MG_SEGMENT::enregistrer(std::ostream& o,double version)
159 {
161  if (liaison_topologique==NULL) o << "%" << get_id() << "=SEGMENT(NULL,$" << noeud1->get_id() << ",$" << noeud2->get_id() << "," << origine_creation << ");" << std::endl;
162  else if (liaison_topologique->get_dimension()==1) o << "%" << get_id() << "=SEGMENT($"<< get_lien_topologie()->get_id() << ",$" << noeud1->get_id() << ",$" << noeud2->get_id() << "," << origine_creation << ");" << std::endl;
163 }
164 
166 {
167  return 1;
168 }
169 
170 
172 {
173  double *coo1=noeud1->get_coord();
174  double *coo2=noeud2->get_coord();
175  longueur=sqrt( (coo1[0]-coo2[0])*(coo1[0]-coo2[0])+(coo1[1]-coo2[1])*(coo1[1]-coo2[1])+(coo1[2]-coo2[2])*(coo1[2]-coo2[2]));
176 }
177 
178 
179 
180 
181 BOITE_2D MG_SEGMENT::get_boite_2D(double periodeu,double periodev)
182 {
183  OT_DECALAGE_PARAMETRE decalage(periodeu,periodev);
184  double coouv1[2];
185  double coouvd1[2];
186  double coouv2[2];
187  double coouvd2[2];
188 
189  coouv1[0]=noeud1->get_u();
190  coouv1[1]=noeud1->get_v();
191  coouv2[0]=noeud2->get_u();
192  coouv2[1]=noeud2->get_v();
193  double du=decalage.calcul_decalage_parametre_u(coouv1[0]);
194  double dv=decalage.calcul_decalage_parametre_v(coouv1[1]);
195  coouvd1[0]=decalage.decalage_parametre_u(coouv1[0],du);
196  coouvd1[1]=decalage.decalage_parametre_v(coouv1[1],dv);
197  coouvd2[0]=decalage.decalage_parametre_u(coouv2[0],du);
198  coouvd2[1]=decalage.decalage_parametre_v(coouv2[1],dv);
199  double umin,vmin,umax,vmax;
200  umin=std::min(coouvd1[0],coouvd2[0]);
201  umax=std::max(coouvd1[0],coouvd2[0]);
202  vmin=std::min(coouvd1[1],coouvd2[1]);
203  vmax=std::max(coouvd1[1],coouvd2[1]);
204  umin=umin-du;
205  umax=umax-du;
206  vmin=vmin-dv;
207  vmax=vmax-dv;
208  BOITE_2D boite(umin,vmin,umax,vmax);
209  return boite;
210 }
211 
213 {
214  double coo1[3];
215  double coo2[3];
216 
217  coo1[0]=noeud1->get_x();
218  coo1[1]=noeud1->get_y();
219  coo1[2]=noeud1->get_z();
220  coo2[0]=noeud2->get_x();
221  coo2[1]=noeud2->get_y();
222  coo2[2]=noeud2->get_z();
223  double xmin,ymin,zmin,xmax,ymax,zmax;
224  xmin=std::min(coo1[0],coo2[0]);
225  xmax=std::max(coo1[0],coo2[0]);
226  ymin=std::min(coo1[1],coo2[1]);
227  ymax=std::max(coo1[1],coo2[1]);
228  zmin=std::min(coo1[2],coo2[2]);
229  zmax=std::max(coo1[2],coo2[2]);
230  BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
231  return boite;
232 }
233 
235 {
236  for (int j=0;j<MAX_TYPE_SOLUTION;j++)
237  {
240  }
241 }
242 
244 {
245  return &triangle;
246 }
248 {
249  return &quadrangle;
250 }
252 {
253 dimension=num;
254 }
255 
256 
258 {
261 }
262 
264 {
267 }
268 
270 {
271 return dimension;
272 }
MG_ELEMENT_MAILLAGE::change_solution
virtual void change_solution(double val, int num=0)
Definition: mg_element_maillage.cpp:107
MG_SEGMENT
Definition: mg_segment.h:38
OT_REFERENCE
Definition: ot_reference.h:28
gestionversion.h
MAGIC::TYPE_ENTITE::IDMG_SEGMENT
@ IDMG_SEGMENT
Definition: mg_definition.h:69
MG_MAILLAGE::ajouter_mg_segment
MG_SEGMENT * ajouter_mg_segment(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, int origine, double longue=0.0, unsigned long num=0)
Definition: mg_maillage.cpp:565
MG_SEGMENT::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_segment.cpp:113
MG_ELEMENT_MAILLAGE::origine_creation
int origine_creation
Definition: mg_element_maillage.h:72
MG_NOEUD::get_z
virtual double get_z(void)
Definition: mg_noeud.cpp:87
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
MG_SEGMENT::MG_SEGMENT
MG_SEGMENT(unsigned long num, MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, int origine, double longue=0.0)
Definition: mg_segment.cpp:32
MG_SEGMENT::dimension
int dimension
Definition: mg_segment.h:76
MG_SEGMENT::change_noeud1
virtual void change_noeud1(MG_NOEUD *mgnoeud, double longue=0.0)
Definition: mg_segment.cpp:130
MG_ELEMENT_MAILLAGE
Definition: mg_element_maillage.h:38
MG_SEGMENT::noeud2
class MG_NOEUD * noeud2
Definition: mg_segment.h:74
TPL_SET::supprimer
void supprimer(X x)
Definition: tpl_set.h:62
MG_ELEMENT_TOPOLOGIQUE::get_dimension
virtual int get_dimension(void)=0
MG_SEGMENT::change_dimension_topo_null
virtual void change_dimension_topo_null(int num)
Definition: mg_segment.cpp:251
MG_SEGMENT::get_boite_3D
virtual class BOITE_3D get_boite_3D(void)
Definition: mg_segment.cpp:212
MG_SEGMENT::extrapoler_solution_noeud
virtual void extrapoler_solution_noeud(void)
Definition: mg_segment.cpp:234
MG_SEGMENT::distance_metrique_valide
bool distance_metrique_valide
Definition: mg_segment.h:79
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_SEGMENT::get_lien_quadrangle
TPL_LISTE_ENTITE< class MG_QUADRANGLE * > * get_lien_quadrangle(void)
Definition: mg_segment.cpp:247
MG_ELEMENT_MAILLAGE::solution
double solution[MAX_TYPE_SOLUTION]
Definition: mg_element_maillage.h:73
MG_SEGMENT::get_dimension_topo_null
virtual int get_dimension_topo_null(void)
Definition: mg_segment.cpp:269
MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO
static int DIMENSIONMAILLAGESANSTOPO
Definition: mg_maillage.h:177
MG_SEGMENT::change_noeud2
virtual void change_noeud2(MG_NOEUD *mgnoeud, double longue=0.0)
Definition: mg_segment.cpp:144
MG_NOEUD::get_u
virtual double get_u(void)
Definition: mg_noeud.cpp:108
MG_SEGMENT::get_dimension
virtual int get_dimension(void)
Definition: mg_segment.cpp:165
MG_SEGMENT::distance_metrique
double distance_metrique
Definition: mg_segment.h:80
mg_segment.h
TPL_SET::ajouter
void ajouter(X x)
Definition: tpl_set.h:55
MG_SEGMENT::triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > triangle
Definition: mg_segment.h:77
MG_SEGMENT::change_distance_metrique
virtual void change_distance_metrique(double val)
Definition: mg_segment.cpp:263
MG_SEGMENT::get_lien_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_segment.cpp:243
MG_SEGMENT::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_segment.cpp:108
MG_NOEUD::get_lien_segment
TPL_LISTE_ENTITE< class MG_SEGMENT * > * get_lien_segment(void)
Definition: mg_noeud.cpp:141
MG_NOEUD
Definition: mg_noeud.h:41
MG_SEGMENT::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: mg_segment.cpp:158
MG_SEGMENT::quadrangle
TPL_LISTE_ENTITE< class MG_QUADRANGLE * > quadrangle
Definition: mg_segment.h:78
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_SEGMENT::inverse_sens
virtual void inverse_sens(void)
Definition: mg_segment.cpp:118
MG_SEGMENT::dupliquer
virtual MG_SEGMENT * dupliquer(class MG_MAILLAGE *mgmai, long decalage)
Definition: mg_segment.cpp:74
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
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_SEGMENT::get_boite_2D
virtual class BOITE_2D get_boite_2D(double periodeu, double periodev)
Definition: mg_segment.cpp:181
OT_REFERENCE::decrementer
void decrementer(void)
Definition: ot_reference.cpp:45
MG_SEGMENT::longueur
double longueur
Definition: mg_segment.h:75
BOITE_2D
Definition: ot_boite_2d.h:28
BOITE_3D
Definition: ot_boite_3d.h:27
mg_maillage.h
MG_SEGMENT::calcule_longueur
void calcule_longueur(void)
Definition: mg_segment.cpp:171
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
OT_DECALAGE_PARAMETRE::calcul_decalage_parametre_v
double calcul_decalage_parametre_v(double par)
Definition: ot_decalage_parametre.cpp:43
MG_NOEUD::get_lien_petit_segment
TPL_LISTE_ENTITE< class MG_SEGMENT * > * get_lien_petit_segment(void)
Definition: mg_noeud.cpp:147
MG_SEGMENT::get_distance_metrique
virtual bool get_distance_metrique(double *l)
Definition: mg_segment.cpp:257
MG_ELEMENT_MAILLAGE::get_lien_topologie
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: mg_element_maillage.cpp:51
OT_DECALAGE_PARAMETRE::calcul_decalage_parametre_u
double calcul_decalage_parametre_u(double par)
Definition: ot_decalage_parametre.cpp:35
OT_REFERENCE::incrementer
void incrementer(void)
Definition: ot_reference.cpp:40
MG_MAILLAGE
Definition: mg_maillage.h:62
MG_SEGMENT::~MG_SEGMENT
virtual ~MG_SEGMENT()
Definition: mg_segment.cpp:88
TPL_LISTE_ENTITE< class MG_TRIANGLE * >
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_sommet.h
MG_SEGMENT::noeud1
class MG_NOEUD * noeud1
Definition: mg_segment.h:73
TPL_LISTE_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_liste_entite.h:42
OT_DECALAGE_PARAMETRE
Definition: ot_decalage_parametre.h:28
MG_SEGMENT::get_type_entite
virtual int get_type_entite(void)
Definition: mg_segment.cpp:102
MG_NOEUD::get_y
virtual double get_y(void)
Definition: mg_noeud.cpp:82