ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_triangle.cpp
Revision: 195
Committed: Thu Jul 16 22:05:49 2009 UTC (15 years, 10 months ago) by francois
Original Path: magic/lib/geometrie/geometrie/src/mg_triangle.cpp
File size: 8853 byte(s)
Log Message:
Ajout de groupe de topologie pour appliquer des algos sur une partie du fichier magic seulement
Ajout de methode qui permette de connaitre la topologie sous jacente a une topologie donnee
Gestion des maillages FEM qui ne sont attaches a une geometrie

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_triangle.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 "mg_triangle.h"
27     #include "mg_maillage.h"
28     #include "ot_decalage_parametre.h"
29    
30 francois 35 MG_TRIANGLE::MG_TRIANGLE(unsigned long num,MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_SEGMENT* mgsegment1,class MG_SEGMENT* mgsegment2,class MG_SEGMENT* mgsegment3,int origine):MG_ELEMENT_MAILLAGE(num,topo,origine),noeud1(mgnoeud1),noeud2(mgnoeud2),noeud3(mgnoeud3),segment1(mgsegment1),segment2(mgsegment2),segment3(mgsegment3)
31 5 {
32     init_triangle();
33     }
34    
35 francois 35 MG_TRIANGLE::MG_TRIANGLE(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,class MG_SEGMENT* mgsegment1,class MG_SEGMENT* mgsegment2,class MG_SEGMENT* mgsegment3,int origine):MG_ELEMENT_MAILLAGE(topo,origine),noeud1(mgnoeud1),noeud2(mgnoeud2),noeud3(mgnoeud3),segment1(mgsegment1),segment2(mgsegment2),segment3(mgsegment3)
36 5 {
37     init_triangle();
38     }
39    
40     MG_TRIANGLE::MG_TRIANGLE(MG_TRIANGLE& mdd):MG_ELEMENT_MAILLAGE(mdd),noeud1(mdd.noeud1),noeud2(mdd.noeud2),noeud3(mdd.noeud3),segment1(mdd.segment1),segment2(mdd.segment2),segment3(mdd.segment3)
41     {
42     init_triangle();
43     }
44    
45     MG_TRIANGLE* MG_TRIANGLE::dupliquer(MG_MAILLAGE *mgmai,long decalage)
46     {
47     MG_NOEUD* nd1=mgmai->get_mg_noeudid(noeud1->get_id()+decalage);
48     MG_NOEUD* nd2=mgmai->get_mg_noeudid(noeud2->get_id()+decalage);
49     MG_NOEUD* nd3=mgmai->get_mg_noeudid(noeud3->get_id()+decalage);
50     MG_SEGMENT* seg1=mgmai->get_mg_segmentid(segment1->get_id()+decalage);
51     MG_SEGMENT* seg2=mgmai->get_mg_segmentid(segment2->get_id()+decalage);
52     MG_SEGMENT* seg3=mgmai->get_mg_segmentid(segment3->get_id()+decalage);
53 francois 35 MG_TRIANGLE* tri=new MG_TRIANGLE(this->get_id()+decalage,liaison_topologique,nd1,nd2,nd3,seg1,seg2,seg3,DUPLIQUER);
54 5 mgmai->ajouter_mg_triangle(tri);
55     return tri;
56     }
57    
58    
59    
60     MG_TRIANGLE::~MG_TRIANGLE()
61     {
62     if (noeud1!=NULL) noeud1->get_lien_triangle()->supprimer(this);
63     if (noeud2!=NULL) noeud2->get_lien_triangle()->supprimer(this);
64     if (noeud3!=NULL) noeud3->get_lien_triangle()->supprimer(this);
65     unsigned long noeudminid=std::min(noeud1->get_id(),noeud2->get_id());
66     noeudminid=std::min(noeudminid,noeud3->get_id());
67     if (noeud1!=NULL)
68     if (noeud1->get_id()==noeudminid) noeud1->get_lien_petit_triangle()->supprimer(this);
69     if (noeud2!=NULL)
70     if (noeud2->get_id()==noeudminid) noeud2->get_lien_petit_triangle()->supprimer(this);
71     if (noeud3!=NULL)
72     if (noeud3->get_id()==noeudminid) noeud3->get_lien_petit_triangle()->supprimer(this);
73     if (segment1!=NULL) {segment1->decrementer();segment1->get_lien_triangle()->supprimer(this);}
74     if (segment2!=NULL) {segment2->decrementer();segment2->get_lien_triangle()->supprimer(this);}
75     if (segment3!=NULL) {segment3->decrementer();segment3->get_lien_triangle()->supprimer(this);}
76     if (liaison_topologique==NULL) return;
77     if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_maillage()->supprimer(this);
78     }
79    
80     void MG_TRIANGLE::init_triangle(void)
81     {
82     if (noeud1!=NULL) noeud1->get_lien_triangle()->ajouter(this);
83     if (noeud2!=NULL) noeud2->get_lien_triangle()->ajouter(this);
84     if (noeud3!=NULL) noeud3->get_lien_triangle()->ajouter(this);
85     unsigned long noeudminid=std::min(noeud1->get_id(),noeud2->get_id());
86     noeudminid=std::min(noeudminid,noeud3->get_id());
87     if (noeud1!=NULL)
88     if (noeud1->get_id()==noeudminid) noeud1->get_lien_petit_triangle()->ajouter(this);
89     if (noeud2!=NULL)
90     if (noeud2->get_id()==noeudminid) noeud2->get_lien_petit_triangle()->ajouter(this);
91     if (noeud3!=NULL)
92     if (noeud3->get_id()==noeudminid) noeud3->get_lien_petit_triangle()->ajouter(this);
93     if (segment1!=NULL) {segment1->incrementer();segment1->get_lien_triangle()->ajouter(this);}
94     if (segment2!=NULL) {segment2->incrementer();segment2->get_lien_triangle()->ajouter(this);}
95     if (segment3!=NULL) {segment3->incrementer();segment3->get_lien_triangle()->ajouter(this);}
96     if ( (segment1!=NULL) && (segment2!=NULL)&& (segment3!=NULL) )longueur=0.3333333333333333*(segment1->get_longueur()+segment2->get_longueur()+segment3->get_longueur());
97     if (liaison_topologique==NULL) return;
98     if (liaison_topologique->get_dimension()==2) liaison_topologique->get_lien_maillage()->ajouter(this);
99     }
100    
101    
102     int MG_TRIANGLE::get_type_entite(void)
103     {
104     return IDMG_TRIANGLE;
105     }
106    
107    
108    
109     MG_NOEUD* MG_TRIANGLE::get_noeud1(void)
110     {
111     return noeud1;
112     }
113    
114     MG_NOEUD* MG_TRIANGLE::get_noeud2(void)
115     {
116     return noeud2;
117     }
118    
119    
120     MG_NOEUD* MG_TRIANGLE::get_noeud3(void)
121     {
122     return noeud3;
123     }
124    
125     MG_SEGMENT* MG_TRIANGLE::get_segment1(void)
126     {
127     return segment1;
128     }
129    
130     MG_SEGMENT* MG_TRIANGLE::get_segment2(void)
131     {
132     return segment2;
133     }
134    
135     MG_SEGMENT* MG_TRIANGLE::get_segment3(void)
136     {
137     return segment3;
138     }
139    
140    
141     int MG_TRIANGLE::get_dimension(void)
142     {
143     return 2;
144     }
145    
146     double MG_TRIANGLE::get_longueur(void)
147     {
148     return longueur;
149     }
150    
151     TPL_LISTE_ENTITE<class MG_TETRA*>* MG_TRIANGLE::get_lien_tetra(void)
152     {
153     return &tetra;
154     }
155    
156     BOITE_2D MG_TRIANGLE::get_boite_2D(double periodeu,double periodev)
157     {
158     OT_DECALAGE_PARAMETRE decalage(periodeu,periodev);
159    
160     double coouv1[2];
161     double coouv2[2];
162     double coouv3[2];
163     coouv1[0]=noeud1->get_u();
164     coouv1[1]=noeud1->get_v();
165     coouv2[0]=noeud2->get_u();
166     coouv2[1]=noeud2->get_v();
167     coouv3[0]=noeud3->get_u();
168     coouv3[1]=noeud3->get_v();
169     double coouvd1[2];
170     double coouvd2[2];
171     double coouvd3[2];
172     double du=decalage.calcul_decalage_parametre_u(coouv1[0]);
173     double dv=decalage.calcul_decalage_parametre_v(coouv1[1]);
174     coouvd1[0]=decalage.decalage_parametre_u(coouv1[0],du);
175     coouvd1[1]=decalage.decalage_parametre_v(coouv1[1],dv);
176     coouvd2[0]=decalage.decalage_parametre_u(coouv2[0],du);
177     coouvd2[1]=decalage.decalage_parametre_v(coouv2[1],dv);
178     coouvd3[0]=decalage.decalage_parametre_u(coouv3[0],du);
179     coouvd3[1]=decalage.decalage_parametre_v(coouv3[1],dv);
180     double umin,vmin,umax,vmax;
181     umin=std::min(coouvd1[0],coouvd2[0]);
182     umin=std::min(umin,coouvd3[0]);
183     umax=std::max(coouvd1[0],coouvd2[0]);
184     umax=std::max(umax,coouvd3[0]);
185     vmin=std::min(coouvd1[1],coouvd2[1]);
186     vmin=std::min(vmin,coouvd3[1]);
187     vmax=std::max(coouv1[1],coouvd2[1]);
188     vmax=std::max(vmax,coouvd3[1]);
189     umin=umin-du;
190     umax=umax-du;
191     vmin=vmin-dv;
192     vmax=vmax-dv;
193     BOITE_2D boite(umin,vmin,umax,vmax);
194     return boite;
195     }
196    
197     BOITE_3D MG_TRIANGLE::get_boite_3D(void)
198     {
199     double coo1[3];
200     double coo2[3];
201     double coo3[3];
202     coo1[0]=noeud1->get_x();
203     coo1[1]=noeud1->get_y();
204     coo1[2]=noeud1->get_z();
205     coo2[0]=noeud2->get_x();
206     coo2[1]=noeud2->get_y();
207     coo2[2]=noeud2->get_z();
208     coo3[0]=noeud3->get_x();
209     coo3[1]=noeud3->get_y();
210     coo3[2]=noeud3->get_z();
211     double xmin,ymin,zmin,xmax,ymax,zmax;
212     xmin=std::min(coo1[0],coo2[0]);
213     xmin=std::min(xmin,coo3[0]);
214     xmax=std::max(coo1[0],coo2[0]);
215     xmax=std::max(xmax,coo3[0]);
216     ymin=std::min(coo1[1],coo2[1]);
217     ymin=std::min(ymin,coo3[1]);
218     ymax=std::max(coo1[1],coo2[1]);
219     ymax=std::max(ymax,coo3[1]);
220     zmin=std::min(coo1[2],coo2[2]);
221     zmin=std::min(zmin,coo3[2]);
222     zmax=std::max(coo1[2],coo2[2]);
223     zmax=std::max(zmax,coo3[2]);
224     BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
225     return boite;
226     }
227 francois 174 void MG_TRIANGLE::extrapoler_solution_noeud(void)
228     {
229     noeud1->change_solution(solution);
230     noeud2->change_solution(solution);
231     noeud3->change_solution(solution);
232     }
233 5
234 francois 174
235 5 void MG_TRIANGLE::enregistrer(std::ostream& o)
236     {
237 francois 195 if ((liaison_topologique==NULL) && (MG_MAILLAGE::DIMENSIONMAILLAGESANSTOPO!=2)) return;
238     if (liaison_topologique==NULL) o << "%" << get_id() << "=TRIANGLE(NULL,$" << noeud1->get_id() << ",$" << noeud2->get_id() << ",$" << noeud3->get_id() << "," << origine_creation << ");" << std::endl;
239 francois 35 else if (liaison_topologique->get_dimension()==2) o << "%" << get_id() << "=TRIANGLE($"<< get_lien_topologie()->get_id() << ",$" << noeud1->get_id() << ",$" << noeud2->get_id() << ",$" << noeud3->get_id() << "," << origine_creation << ");" << std::endl;
240 5 }
241    
242    
243    
244    
245    
246