ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_segment.cpp
Revision: 763
Committed: Wed Dec 2 19:55:53 2015 UTC (9 years, 5 months ago) by francois
File size: 9369 byte(s)
Log Message:
Le fichier MAGiC est maintenant versionné. LA version actuelle est 2.0. L'ancienne version est 1.0.
Tout est transparent pour l'utilisateur. Les vieilles versions sont lisibles mais les nouveaux enregistrements sont dans la version la plus récente.
Changement des conditions aux limites : ajout d'un parametre pour dire si la condition numerique est une valeur ou une formule ou un lien vers une autre entité magic.
Les parametres pour saisir sont maintenant -ccf -ccfi -ccff -ccft -ccfit -ccfft

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     MG_SEGMENT* seg=new MG_SEGMENT(this->get_id()+decalage,liaison_topologique,nd1,nd2,DUPLIQUER,longueur);
84     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     }