ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_segment.cpp
Revision: 532
Committed: Fri Jul 4 14:39:20 2014 UTC (11 years, 1 month ago) by francois
File size: 9269 byte(s)
Log Message:
Resolution de bug avec le mailleur3D et la nouvelle formulation de carte de taille + parametrisation du pas d'integration dans le calcul des longueurs dans une metrique

File Contents

# Content
1 //------------------------------------------------------------
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 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 {
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 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 {
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 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 {
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 if (liaison_topologique==NULL) return;
99 if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->supprimer(this);
100 }
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 double MG_SEGMENT::get_longueur(void)
120 {
121 return longueur;
122 }
123
124 void MG_SEGMENT::change_noeud1(MG_NOEUD* mgnoeud,double longue)
125 {
126 if (noeud1!=NULL) noeud1->get_lien_segment()->supprimer(this);
127 if (noeud1!=NULL)
128 if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->supprimer(this);
129 noeud1=mgnoeud;
130 longueur=longue;
131 if (longueur==0.) calcule_longueur();
132 if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
133 if (noeud1!=NULL)
134 if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
135 }
136
137
138 void MG_SEGMENT::change_noeud2(MG_NOEUD* mgnoeud,double longue)
139 {
140 if (noeud2!=NULL) noeud2->get_lien_segment()->supprimer(this);
141 if (noeud2!=NULL)
142 if (noeud2->get_id()<noeud1->get_id()) noeud2->get_lien_petit_segment()->supprimer(this);
143 noeud2=mgnoeud;
144 longueur=longue;
145 if (longueur==0.) calcule_longueur();
146 if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
147 if (noeud2!=NULL)
148 if (noeud2->get_id()<noeud1->get_id()) noeud2->get_lien_petit_segment()->ajouter(this);
149 }
150
151
152 void MG_SEGMENT::enregistrer(std::ostream& o)
153 {
154 if ((liaison_topologique==NULL) && (MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO!=1)) return;
155 if (liaison_topologique==NULL) o << "%" << get_id() << "=SEGMENT(NULL,$" << noeud1->get_id() << ",$" << noeud2->get_id() << "," << origine_creation << ");" << std::endl;
156 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;
157 }
158
159 int MG_SEGMENT::get_dimension(void)
160 {
161 return 1;
162 }
163
164
165 void MG_SEGMENT::calcule_longueur(void)
166 {
167 double *coo1=noeud1->get_coord();
168 double *coo2=noeud2->get_coord();
169 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]));
170 }
171
172
173
174
175 BOITE_2D MG_SEGMENT::get_boite_2D(double periodeu,double periodev)
176 {
177 OT_DECALAGE_PARAMETRE decalage(periodeu,periodev);
178 double coouv1[2];
179 double coouvd1[2];
180 double coouv2[2];
181 double coouvd2[2];
182
183 coouv1[0]=noeud1->get_u();
184 coouv1[1]=noeud1->get_v();
185 coouv2[0]=noeud2->get_u();
186 coouv2[1]=noeud2->get_v();
187 double du=decalage.calcul_decalage_parametre_u(coouv1[0]);
188 double dv=decalage.calcul_decalage_parametre_v(coouv1[1]);
189 coouvd1[0]=decalage.decalage_parametre_u(coouv1[0],du);
190 coouvd1[1]=decalage.decalage_parametre_v(coouv1[1],dv);
191 coouvd2[0]=decalage.decalage_parametre_u(coouv2[0],du);
192 coouvd2[1]=decalage.decalage_parametre_v(coouv2[1],dv);
193 double umin,vmin,umax,vmax;
194 umin=std::min(coouvd1[0],coouvd2[0]);
195 umax=std::max(coouvd1[0],coouvd2[0]);
196 vmin=std::min(coouvd1[1],coouvd2[1]);
197 vmax=std::max(coouvd1[1],coouvd2[1]);
198 umin=umin-du;
199 umax=umax-du;
200 vmin=vmin-dv;
201 vmax=vmax-dv;
202 BOITE_2D boite(umin,vmin,umax,vmax);
203 return boite;
204 }
205
206 BOITE_3D MG_SEGMENT::get_boite_3D(void)
207 {
208 double coo1[3];
209 double coo2[3];
210
211 coo1[0]=noeud1->get_x();
212 coo1[1]=noeud1->get_y();
213 coo1[2]=noeud1->get_z();
214 coo2[0]=noeud2->get_x();
215 coo2[1]=noeud2->get_y();
216 coo2[2]=noeud2->get_z();
217 double xmin,ymin,zmin,xmax,ymax,zmax;
218 xmin=std::min(coo1[0],coo2[0]);
219 xmax=std::max(coo1[0],coo2[0]);
220 ymin=std::min(coo1[1],coo2[1]);
221 ymax=std::max(coo1[1],coo2[1]);
222 zmin=std::min(coo1[2],coo2[2]);
223 zmax=std::max(coo1[2],coo2[2]);
224 BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
225 return boite;
226 }
227
228 void MG_SEGMENT::extrapoler_solution_noeud(void)
229 {
230 for (int j=0;j<MAX_TYPE_SOLUTION;j++)
231 {
232 noeud1->change_solution(solution[j],j);
233 noeud2->change_solution(solution[j],j);
234 }
235 }
236
237 TPL_LISTE_ENTITE<class MG_TRIANGLE*>* MG_SEGMENT::get_lien_triangle(void)
238 {
239 return &triangle;
240 }
241 TPL_LISTE_ENTITE<class MG_QUADRANGLE*>* MG_SEGMENT::get_lien_quadrangle(void)
242 {
243 return &quadrangle;
244 }
245 void MG_SEGMENT::change_dimension_topo_null(int num)
246 {
247 dimension=num;
248 }
249
250
251 bool MG_SEGMENT::get_distance_metrique(double *l)
252 {
253 *l=distance_metrique;
254 return distance_metrique_valide;
255 }
256
257 void MG_SEGMENT::change_distance_metrique(double val)
258 {
259 distance_metrique=val;
260 distance_metrique_valide=true;
261 }
262
263 int MG_SEGMENT::get_dimension_topo_null(void)
264 {
265 return dimension;
266 }