ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_segment.cpp
Revision: 276
Committed: Wed Jun 15 18:25:46 2011 UTC (13 years, 11 months ago) by francois
File size: 8233 byte(s)
Log Message:
Correction de bug + Version toIbrep  version du premier exmple complet + construction de la vectorisation a la lecture du fichier

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4 francois 174 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6 5 //------------------------------------------------------------
7 francois 174 // 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 5 // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mg_segment.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20 francois 174 // Version du 02/03/2006 � 11H22
21 5 //------------------------------------------------------------
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 35 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)
34 5 {
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); 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 35 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)
47 5 {
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); else noeud2->get_lien_petit_segment()->ajouter(this);
53     noeud1->incrementer();
54     noeud2->incrementer();
55     if (liaison_topologique==NULL) return;
56     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->ajouter(this);
57     }
58    
59     MG_SEGMENT::MG_SEGMENT(MG_SEGMENT& mdd):MG_ELEMENT_MAILLAGE(mdd),OT_REFERENCE(),noeud1(mdd.noeud1),noeud2(mdd.noeud2),longueur(mdd.longueur)
60     {
61     if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
62     if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
63     if ((noeud1!=NULL) && (noeud2!=NULL))
64     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this); else noeud2->get_lien_petit_segment()->ajouter(this);
65     noeud1->incrementer();
66     noeud2->incrementer();
67     if (liaison_topologique==NULL) return;
68     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->ajouter(this);
69     }
70    
71    
72     MG_SEGMENT* MG_SEGMENT::dupliquer(MG_MAILLAGE *mgmai,long decalage)
73     {
74     MG_NOEUD* nd1=mgmai->get_mg_noeudid(noeud1->get_id()+decalage);
75     MG_NOEUD* nd2=mgmai->get_mg_noeudid(noeud2->get_id()+decalage);
76     if (nd1==NULL)
77     noeud1->get_id();
78     if (nd2==NULL)
79     noeud2->get_id();
80 francois 35 MG_SEGMENT* seg=new MG_SEGMENT(this->get_id()+decalage,liaison_topologique,nd1,nd2,DUPLIQUER,longueur);
81 5 mgmai->ajouter_mg_segment(seg);
82     return seg;
83     }
84    
85    
86     MG_SEGMENT::~MG_SEGMENT()
87     {
88     if (noeud1!=NULL) noeud1->get_lien_segment()->supprimer(this);
89     if (noeud2!=NULL) noeud2->get_lien_segment()->supprimer(this);
90     if ((noeud1!=NULL) && (noeud2!=NULL))
91     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->supprimer(this); else noeud2->get_lien_petit_segment()->supprimer(this);
92     noeud1->decrementer();
93     noeud2->decrementer();
94     if (liaison_topologique==NULL) return;
95     if (liaison_topologique->get_dimension()==1) liaison_topologique->get_lien_maillage()->supprimer(this);
96     }
97    
98    
99     int MG_SEGMENT::get_type_entite(void)
100     {
101     return IDMG_SEGMENT;
102     }
103    
104    
105     MG_NOEUD* MG_SEGMENT::get_noeud1(void)
106     {
107     return noeud1;
108     }
109    
110     MG_NOEUD* MG_SEGMENT::get_noeud2(void)
111     {
112     return noeud2;
113     }
114    
115     double MG_SEGMENT::get_longueur(void)
116     {
117     return longueur;
118     }
119    
120     void MG_SEGMENT::change_noeud1(MG_NOEUD* mgnoeud,double longue)
121     {
122     if (noeud1!=NULL) noeud1->get_lien_segment()->supprimer(this);
123     if (noeud1!=NULL)
124     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->supprimer(this);
125     noeud1=mgnoeud;
126     longueur=longue;
127     if (longueur==0.) calcule_longueur();
128     if (noeud1!=NULL) noeud1->get_lien_segment()->ajouter(this);
129     if (noeud1!=NULL)
130     if (noeud1->get_id()<noeud2->get_id()) noeud1->get_lien_petit_segment()->ajouter(this);
131     }
132    
133    
134     void MG_SEGMENT::change_noeud2(MG_NOEUD* mgnoeud,double longue)
135     {
136     if (noeud2!=NULL) noeud2->get_lien_segment()->supprimer(this);
137     if (noeud2!=NULL)
138     if (noeud2->get_id()<noeud1->get_id()) noeud2->get_lien_petit_segment()->supprimer(this);
139     noeud2=mgnoeud;
140     longueur=longue;
141     if (longueur==0.) calcule_longueur();
142     if (noeud2!=NULL) noeud2->get_lien_segment()->ajouter(this);
143     if (noeud2!=NULL)
144     if (noeud2->get_id()<noeud1->get_id()) noeud2->get_lien_petit_segment()->ajouter(this);
145     }
146    
147    
148     void MG_SEGMENT::enregistrer(std::ostream& o)
149     {
150 francois 195 if ((liaison_topologique==NULL) && (MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO!=1)) return;
151 francois 276 if (liaison_topologique==NULL) o << "%" << get_id() << "=SEGMENT(NULL,$" << noeud1->get_id() << ",$" << noeud2->get_id() << "," << origine_creation << ");" << std::endl;
152     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;
153 5 }
154    
155     int MG_SEGMENT::get_dimension(void)
156     {
157     return 1;
158     }
159    
160    
161     void MG_SEGMENT::calcule_longueur(void)
162     {
163     double *coo1=noeud1->get_coord();
164     double *coo2=noeud2->get_coord();
165     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]));
166     }
167    
168     BOITE_2D MG_SEGMENT::get_boite_2D(double periodeu,double periodev)
169     {
170     OT_DECALAGE_PARAMETRE decalage(periodeu,periodev);
171     double coouv1[2];
172     double coouvd1[2];
173     double coouv2[2];
174     double coouvd2[2];
175    
176     coouv1[0]=noeud1->get_u();
177     coouv1[1]=noeud1->get_v();
178     coouv2[0]=noeud2->get_u();
179     coouv2[1]=noeud2->get_v();
180     double du=decalage.calcul_decalage_parametre_u(coouv1[0]);
181     double dv=decalage.calcul_decalage_parametre_v(coouv1[1]);
182     coouvd1[0]=decalage.decalage_parametre_u(coouv1[0],du);
183     coouvd1[1]=decalage.decalage_parametre_v(coouv1[1],dv);
184     coouvd2[0]=decalage.decalage_parametre_u(coouv2[0],du);
185     coouvd2[1]=decalage.decalage_parametre_v(coouv2[1],dv);
186     double umin,vmin,umax,vmax;
187     umin=std::min(coouvd1[0],coouvd2[0]);
188     umax=std::max(coouvd1[0],coouvd2[0]);
189     vmin=std::min(coouvd1[1],coouvd2[1]);
190     vmax=std::max(coouvd1[1],coouvd2[1]);
191     umin=umin-du;
192     umax=umax-du;
193     vmin=vmin-dv;
194     vmax=vmax-dv;
195     BOITE_2D boite(umin,vmin,umax,vmax);
196     return boite;
197     }
198    
199     BOITE_3D MG_SEGMENT::get_boite_3D(void)
200     {
201     double coo1[3];
202     double coo2[3];
203    
204     coo1[0]=noeud1->get_x();
205     coo1[1]=noeud1->get_y();
206     coo1[2]=noeud1->get_z();
207     coo2[0]=noeud2->get_x();
208     coo2[1]=noeud2->get_y();
209     coo2[2]=noeud2->get_z();
210     double xmin,ymin,zmin,xmax,ymax,zmax;
211     xmin=std::min(coo1[0],coo2[0]);
212     xmax=std::max(coo1[0],coo2[0]);
213     ymin=std::min(coo1[1],coo2[1]);
214     ymax=std::max(coo1[1],coo2[1]);
215     zmin=std::min(coo1[2],coo2[2]);
216     zmax=std::max(coo1[2],coo2[2]);
217     BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
218     return boite;
219     }
220    
221 francois 174 void MG_SEGMENT::extrapoler_solution_noeud(void)
222     {
223     noeud1->change_solution(solution);
224     noeud2->change_solution(solution);
225     }
226 5
227     TPL_LISTE_ENTITE<class MG_TRIANGLE*>* MG_SEGMENT::get_lien_triangle(void)
228     {
229     return &triangle;
230     }