ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_triangle.cpp
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (17 years, 11 months ago)
Original Path: magic/lib/geometrie/geometrie/src/mg_triangle.cpp
File size: 8465 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
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_triangle.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 à 11H22
21     //------------------------------------------------------------
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     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):MG_ELEMENT_MAILLAGE(num,topo),noeud1(mgnoeud1),noeud2(mgnoeud2),noeud3(mgnoeud3),segment1(mgsegment1),segment2(mgsegment2),segment3(mgsegment3)
31     {
32     init_triangle();
33     }
34    
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):MG_ELEMENT_MAILLAGE(topo),noeud1(mgnoeud1),noeud2(mgnoeud2),noeud3(mgnoeud3),segment1(mgsegment1),segment2(mgsegment2),segment3(mgsegment3)
36     {
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     MG_TRIANGLE* tri=new MG_TRIANGLE(this->get_id()+decalage,liaison_topologique,nd1,nd2,nd3,seg1,seg2,seg3);
54     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    
228     void MG_TRIANGLE::enregistrer(std::ostream& o)
229     {
230     if (liaison_topologique==NULL) o << "%" << get_id() << "=TRIANGLE(NULL,$" << noeud1->get_id() << ",$" << noeud2->get_id() << ",$" << noeud3->get_id() << ");" << std::endl;
231     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() << ");" << std::endl;
232     }
233    
234    
235    
236    
237    
238