ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/mg_segment.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months, 1 week ago) by francois
File size: 9465 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

# User Rev Content
1 francois 1158 //####//------------------------------------------------------------
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 francois 283
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 francois 532 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 francois 283 {
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))
38     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
39     else noeud2->get_lien_petit_segment()->ajouter(this);
40     noeud1->incrementer();
41     noeud2->incrementer();
42     if (liaison_topologique==NULL) return;
43     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->ajouter(this);
44     }
45    
46 francois 532 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 francois 283 {
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))
52     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
53     else noeud2->get_lien_petit_segment()->ajouter(this);
54     noeud1->incrementer();
55     noeud2->incrementer();
56     if (liaison_topologique==NULL) return;
57     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->ajouter(this);
58     }
59    
60 francois 532 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 francois 283 {
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))
65     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
66     else noeud2->get_lien_petit_segment()->ajouter(this);
67     noeud1->incrementer();
68     noeud2->incrementer();
69     if (liaison_topologique==NULL) return;
70     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->ajouter(this);
71     }
72    
73    
74     MG_SEGMENT* MG_SEGMENT::dupliquer(MG_MAILLAGE *mgmai,long decalage)
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();
82 francois 791 MG_SEGMENT* seg=new MG_SEGMENT(this->get_id()+decalage,liaison_topologique,nd1,nd2,MAGIC::ORIGINE::DUPLIQUER,longueur);
83 francois 283 mgmai->ajouter_mg_segment(seg);
84     return seg;
85     }
86    
87    
88     MG_SEGMENT::~MG_SEGMENT()
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))
93     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->supprimer(this);
94     else noeud2->get_lien_petit_segment()->supprimer(this);
95     noeud1->decrementer();
96     noeud2->decrementer();
97 francois 663 if (liaison_topologique!=NULL)
98     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->supprimer(this);
99 francois 283 }
100    
101    
102     int MG_SEGMENT::get_type_entite(void)
103     {
104 francois 1150 return MAGIC::TYPE_ENTITE::IDMG_SEGMENT;
105 francois 283 }
106    
107    
108     MG_NOEUD* MG_SEGMENT::get_noeud1(void)
109     {
110     return noeud1;
111     }
112    
113     MG_NOEUD* MG_SEGMENT::get_noeud2(void)
114     {
115     return noeud2;
116     }
117    
118 francois 702 void MG_SEGMENT::inverse_sens(void)
119     {
120     MG_NOEUD* noeud=noeud1;
121     noeud1=noeud2;
122     noeud2=noeud1;
123     }
124    
125 francois 283 double MG_SEGMENT::get_longueur(void)
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)
134     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->supprimer(this);
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)
140     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
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)
148     if (noeud2->get_id()<noeud1->get_id()) noeud2->get_lien_petit_segment()->supprimer(this);
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)
154     if (noeud2->get_id()<noeud1->get_id()) noeud2->get_lien_petit_segment()->ajouter(this);
155     }
156    
157    
158 francois 763 void MG_SEGMENT::enregistrer(std::ostream& o,double version)
159 francois 283 {
160     if ((liaison_topologique==NULL) && (MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO!=1)) return;
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    
165     int MG_SEGMENT::get_dimension(void)
166     {
167     return 1;
168     }
169    
170    
171     void MG_SEGMENT::calcule_longueur(void)
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 francois 532
179    
180    
181 francois 283 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    
212     BOITE_3D MG_SEGMENT::get_boite_3D(void)
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    
234     void MG_SEGMENT::extrapoler_solution_noeud(void)
235     {
236 francois 377 for (int j=0;j<MAX_TYPE_SOLUTION;j++)
237     {
238     noeud1->change_solution(solution[j],j);
239     noeud2->change_solution(solution[j],j);
240     }
241 francois 283 }
242    
243     TPL_LISTE_ENTITE<class MG_TRIANGLE*>* MG_SEGMENT::get_lien_triangle(void)
244     {
245     return &triangle;
246     }
247 francois 308 TPL_LISTE_ENTITE<class MG_QUADRANGLE*>* MG_SEGMENT::get_lien_quadrangle(void)
248     {
249     return &quadrangle;
250     }
251 francois 288 void MG_SEGMENT::change_dimension_topo_null(int num)
252     {
253     dimension=num;
254     }
255    
256 francois 532
257     bool MG_SEGMENT::get_distance_metrique(double *l)
258     {
259     *l=distance_metrique;
260     return distance_metrique_valide;
261     }
262    
263     void MG_SEGMENT::change_distance_metrique(double val)
264     {
265     distance_metrique=val;
266     distance_metrique_valide=true;
267     }
268    
269 francois 288 int MG_SEGMENT::get_dimension_topo_null(void)
270     {
271     return dimension;
272 francois 1150 }