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 
60 MG_SEGMENT::MG_SEGMENT(MG_SEGMENT& mdd):MG_ELEMENT_MAILLAGE(mdd),OT_REFERENCE(),noeud1(mdd.noeud1),noeud2(mdd.noeud2),longueur(mdd.longueur),dimension(mdd.dimension),distance_metrique_valide(mdd.distance_metrique_valide),distance_metrique(mdd.distance_metrique)
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 }
double solution[MAX_TYPE_SOLUTION]
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual void change_solution(double val, int num=0)
MG_ELEMENT_TOPOLOGIQUE * liaison_topologique
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
virtual int get_dimension(void)=0
unsigned long get_id()
static int DIMENSIONMAILLAGESANSTOPO
Definition: mg_maillage.h:177
MG_NOEUD * get_mg_noeudid(unsigned long num)
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)
TPL_LISTE_ENTITE< class MG_SEGMENT * > * get_lien_segment(void)
Definition: mg_noeud.cpp:141
virtual double get_v(void)
Definition: mg_noeud.cpp:113
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
virtual double get_z(void)
Definition: mg_noeud.cpp:87
virtual double get_u(void)
Definition: mg_noeud.cpp:108
virtual double get_y(void)
Definition: mg_noeud.cpp:82
virtual double get_x(void)
Definition: mg_noeud.cpp:77
TPL_LISTE_ENTITE< class MG_SEGMENT * > * get_lien_petit_segment(void)
Definition: mg_noeud.cpp:147
class MG_NOEUD * noeud1
Definition: mg_segment.h:73
int dimension
Definition: mg_segment.h:76
virtual void inverse_sens(void)
Definition: mg_segment.cpp:118
void calcule_longueur(void)
Definition: mg_segment.cpp:171
bool distance_metrique_valide
Definition: mg_segment.h:79
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_segment.cpp:108
virtual int get_dimension(void)
Definition: mg_segment.cpp:165
virtual int get_type_entite(void)
Definition: mg_segment.cpp:102
virtual void extrapoler_solution_noeud(void)
Definition: mg_segment.cpp:234
virtual double get_longueur(void)
Definition: mg_segment.cpp:125
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_segment.cpp:243
TPL_LISTE_ENTITE< class MG_QUADRANGLE * > * get_lien_quadrangle(void)
Definition: mg_segment.cpp:247
virtual void enregistrer(std::ostream &o, double version)
Definition: mg_segment.cpp:158
double longueur
Definition: mg_segment.h:75
TPL_LISTE_ENTITE< class MG_QUADRANGLE * > quadrangle
Definition: mg_segment.h:78
virtual MG_SEGMENT * dupliquer(class MG_MAILLAGE *mgmai, long decalage)
Definition: mg_segment.cpp:74
double distance_metrique
Definition: mg_segment.h:80
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
virtual class BOITE_2D get_boite_2D(double periodeu, double periodev)
Definition: mg_segment.cpp:181
class MG_NOEUD * noeud2
Definition: mg_segment.h:74
virtual void change_distance_metrique(double val)
Definition: mg_segment.cpp:263
TPL_LISTE_ENTITE< class MG_TRIANGLE * > triangle
Definition: mg_segment.h:77
virtual void change_noeud2(MG_NOEUD *mgnoeud, double longue=0.0)
Definition: mg_segment.cpp:144
virtual bool get_distance_metrique(double *l)
Definition: mg_segment.cpp:257
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_segment.cpp:113
virtual class BOITE_3D get_boite_3D(void)
Definition: mg_segment.cpp:212
virtual int get_dimension_topo_null(void)
Definition: mg_segment.cpp:269
virtual void change_noeud1(MG_NOEUD *mgnoeud, double longue=0.0)
Definition: mg_segment.cpp:130
virtual void change_dimension_topo_null(int num)
Definition: mg_segment.cpp:251
virtual ~MG_SEGMENT()
Definition: mg_segment.cpp:88
double decalage_parametre_v(double par, double dpar)
double calcul_decalage_parametre_v(double par)
double calcul_decalage_parametre_u(double par)
double decalage_parametre_u(double par, double dpar)
void decrementer(void)
void incrementer(void)
virtual void supprimer(X x)
virtual void ajouter(X x)
void ajouter(X x)
Definition: tpl_set.h:55
void supprimer(X x)
Definition: tpl_set.h:62
const int MAX_TYPE_SOLUTION
Definition: mg_definition.h:42
double2 sqrt(double2 &val)