ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_segment.cpp
Revision: 791
Committed: Fri Mar 18 21:23:00 2016 UTC (9 years, 1 month ago) by francois
File size: 9385 byte(s)
Log Message:
Transferts de la definition des origines dans le namespace MAGiC

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mg_segment.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <math.h>
27     #include "mg_segment.h"
28     #include "mg_sommet.h"
29     #include "ot_decalage_parametre.h"
30     #include "mg_maillage.h"
31    
32    
33 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)
34 francois 283 {
35     if (longueur==0.) calcule_longueur();
36     if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
37     if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
38     if ((noeud1!=NULL) && (noeud2!=NULL))
39     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
40     else noeud2->get_lien_petit_segment()->ajouter(this);
41     noeud1->incrementer();
42     noeud2->incrementer();
43     if (liaison_topologique==NULL) return;
44     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->ajouter(this);
45     }
46    
47 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)
48 francois 283 {
49     if (longueur==0.) calcule_longueur();
50     if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
51     if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
52     if ((noeud1!=NULL) && (noeud2!=NULL))
53     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
54     else noeud2->get_lien_petit_segment()->ajouter(this);
55     noeud1->incrementer();
56     noeud2->incrementer();
57     if (liaison_topologique==NULL) return;
58     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->ajouter(this);
59     }
60    
61 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)
62 francois 283 {
63     if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
64     if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
65     if ((noeud1!=NULL) && (noeud2!=NULL))
66     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
67     else noeud2->get_lien_petit_segment()->ajouter(this);
68     noeud1->incrementer();
69     noeud2->incrementer();
70     if (liaison_topologique==NULL) return;
71     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->ajouter(this);
72     }
73    
74    
75     MG_SEGMENT* MG_SEGMENT::dupliquer(MG_MAILLAGE *mgmai,long decalage)
76     {
77     MG_NOEUD* nd1=mgmai->get_mg_noeudid(noeud1->get_id()+decalage);
78     MG_NOEUD* nd2=mgmai->get_mg_noeudid(noeud2->get_id()+decalage);
79     if (nd1==NULL)
80     noeud1->get_id();
81     if (nd2==NULL)
82     noeud2->get_id();
83 francois 791 MG_SEGMENT* seg=new MG_SEGMENT(this->get_id()+decalage,liaison_topologique,nd1,nd2,MAGIC::ORIGINE::DUPLIQUER,longueur);
84 francois 283 mgmai->ajouter_mg_segment(seg);
85     return seg;
86     }
87    
88    
89     MG_SEGMENT::~MG_SEGMENT()
90     {
91     if (noeud1!=NULL) noeud1->get_lien_segment()->supprimer(this);
92     if (noeud2!=NULL) noeud2->get_lien_segment()->supprimer(this);
93     if ((noeud1!=NULL) && (noeud2!=NULL))
94     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->supprimer(this);
95     else noeud2->get_lien_petit_segment()->supprimer(this);
96     noeud1->decrementer();
97     noeud2->decrementer();
98 francois 663 if (liaison_topologique!=NULL)
99     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->supprimer(this);
100 francois 283 }
101    
102    
103     int MG_SEGMENT::get_type_entite(void)
104     {
105     return IDMG_SEGMENT;
106     }
107    
108    
109     MG_NOEUD* MG_SEGMENT::get_noeud1(void)
110     {
111     return noeud1;
112     }
113    
114     MG_NOEUD* MG_SEGMENT::get_noeud2(void)
115     {
116     return noeud2;
117     }
118    
119 francois 702 void MG_SEGMENT::inverse_sens(void)
120     {
121     MG_NOEUD* noeud=noeud1;
122     noeud1=noeud2;
123     noeud2=noeud1;
124     }
125    
126 francois 283 double MG_SEGMENT::get_longueur(void)
127     {
128     return longueur;
129     }
130    
131     void MG_SEGMENT::change_noeud1(MG_NOEUD* mgnoeud,double longue)
132     {
133     if (noeud1!=NULL) noeud1->get_lien_segment()->supprimer(this);
134     if (noeud1!=NULL)
135     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->supprimer(this);
136     noeud1=mgnoeud;
137     longueur=longue;
138     if (longueur==0.) calcule_longueur();
139     if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
140     if (noeud1!=NULL)
141     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
142     }
143    
144    
145     void MG_SEGMENT::change_noeud2(MG_NOEUD* mgnoeud,double longue)
146     {
147     if (noeud2!=NULL) noeud2->get_lien_segment()->supprimer(this);
148     if (noeud2!=NULL)
149     if (noeud2->get_id()<noeud1->get_id()) noeud2->get_lien_petit_segment()->supprimer(this);
150     noeud2=mgnoeud;
151     longueur=longue;
152     if (longueur==0.) calcule_longueur();
153     if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
154     if (noeud2!=NULL)
155     if (noeud2->get_id()<noeud1->get_id()) noeud2->get_lien_petit_segment()->ajouter(this);
156     }
157    
158    
159 francois 763 void MG_SEGMENT::enregistrer(std::ostream& o,double version)
160 francois 283 {
161     if ((liaison_topologique==NULL) && (MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO!=1)) return;
162     if (liaison_topologique==NULL) o << "%" << get_id() << "=SEGMENT(NULL,$" << noeud1->get_id() << ",$" << noeud2->get_id() << "," << origine_creation << ");" << std::endl;
163     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;
164     }
165    
166     int MG_SEGMENT::get_dimension(void)
167     {
168     return 1;
169     }
170    
171    
172     void MG_SEGMENT::calcule_longueur(void)
173     {
174     double *coo1=noeud1->get_coord();
175     double *coo2=noeud2->get_coord();
176     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]));
177     }
178    
179 francois 532
180    
181    
182 francois 283 BOITE_2D MG_SEGMENT::get_boite_2D(double periodeu,double periodev)
183     {
184     OT_DECALAGE_PARAMETRE decalage(periodeu,periodev);
185     double coouv1[2];
186     double coouvd1[2];
187     double coouv2[2];
188     double coouvd2[2];
189    
190     coouv1[0]=noeud1->get_u();
191     coouv1[1]=noeud1->get_v();
192     coouv2[0]=noeud2->get_u();
193     coouv2[1]=noeud2->get_v();
194     double du=decalage.calcul_decalage_parametre_u(coouv1[0]);
195     double dv=decalage.calcul_decalage_parametre_v(coouv1[1]);
196     coouvd1[0]=decalage.decalage_parametre_u(coouv1[0],du);
197     coouvd1[1]=decalage.decalage_parametre_v(coouv1[1],dv);
198     coouvd2[0]=decalage.decalage_parametre_u(coouv2[0],du);
199     coouvd2[1]=decalage.decalage_parametre_v(coouv2[1],dv);
200     double umin,vmin,umax,vmax;
201     umin=std::min(coouvd1[0],coouvd2[0]);
202     umax=std::max(coouvd1[0],coouvd2[0]);
203     vmin=std::min(coouvd1[1],coouvd2[1]);
204     vmax=std::max(coouvd1[1],coouvd2[1]);
205     umin=umin-du;
206     umax=umax-du;
207     vmin=vmin-dv;
208     vmax=vmax-dv;
209     BOITE_2D boite(umin,vmin,umax,vmax);
210     return boite;
211     }
212    
213     BOITE_3D MG_SEGMENT::get_boite_3D(void)
214     {
215     double coo1[3];
216     double coo2[3];
217    
218     coo1[0]=noeud1->get_x();
219     coo1[1]=noeud1->get_y();
220     coo1[2]=noeud1->get_z();
221     coo2[0]=noeud2->get_x();
222     coo2[1]=noeud2->get_y();
223     coo2[2]=noeud2->get_z();
224     double xmin,ymin,zmin,xmax,ymax,zmax;
225     xmin=std::min(coo1[0],coo2[0]);
226     xmax=std::max(coo1[0],coo2[0]);
227     ymin=std::min(coo1[1],coo2[1]);
228     ymax=std::max(coo1[1],coo2[1]);
229     zmin=std::min(coo1[2],coo2[2]);
230     zmax=std::max(coo1[2],coo2[2]);
231     BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
232     return boite;
233     }
234    
235     void MG_SEGMENT::extrapoler_solution_noeud(void)
236     {
237 francois 377 for (int j=0;j<MAX_TYPE_SOLUTION;j++)
238     {
239     noeud1->change_solution(solution[j],j);
240     noeud2->change_solution(solution[j],j);
241     }
242 francois 283 }
243    
244     TPL_LISTE_ENTITE<class MG_TRIANGLE*>* MG_SEGMENT::get_lien_triangle(void)
245     {
246     return &triangle;
247     }
248 francois 308 TPL_LISTE_ENTITE<class MG_QUADRANGLE*>* MG_SEGMENT::get_lien_quadrangle(void)
249     {
250     return &quadrangle;
251     }
252 francois 288 void MG_SEGMENT::change_dimension_topo_null(int num)
253     {
254     dimension=num;
255     }
256    
257 francois 532
258     bool MG_SEGMENT::get_distance_metrique(double *l)
259     {
260     *l=distance_metrique;
261     return distance_metrique_valide;
262     }
263    
264     void MG_SEGMENT::change_distance_metrique(double val)
265     {
266     distance_metrique=val;
267     distance_metrique_valide=true;
268     }
269    
270 francois 288 int MG_SEGMENT::get_dimension_topo_null(void)
271     {
272     return dimension;
273     }