MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
CAD4FE_PolySurface.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// CAD4FE_PolySurface.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:54 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 #include "gestionversion.h"
24 #include "mg_geometrie.h"
25 #include "mg_arete.h"
26 #include "tpl_fonction.h"
27 
28 #include <map>
29 #include <ostream>
30 #include <string>
31 #include <vector>
32 
33 
34 #pragma hdrstop
35 
36 #include "CAD4FE_PolySurface.h"
37 #include "CAD4FE_MCVertex.h"
38 #include "ot_mathematique.h"
39 #include "math.h"
40 
41 
42 #pragma package(smart_init)
43 
44 #ifdef __BORLANDC__
45 #pragma warn -8012
46 #endif
47 
48 using namespace CAD4FE;
49 
51 {
52  // Add the reference face in the list of faces
53  _lst_ref_faces.insert(__refFace);
54 }
55 
57 {
58  // Add the reference face in the list of faces
59  _lst_ref_faces.insert(__refFace);
60 }
61 
62 void PolySurface::Merge( PolySurface & __polySurface )
63 {
64  // Add the reference faces in the list of faces
65  std::set<MG_FACE*> & r = __polySurface._lst_ref_faces;
66 
67  for (std::set<MG_FACE*>::iterator itRefFace = r.begin();
68  itRefFace != r.end();
69  itRefFace++)
70  _lst_ref_faces.insert(*itRefFace);
71 }
72 
73 
74 void PolySurface::evaluer(double *uv,double *xyz)
75 {
76 
77 }
78 
79 
80 void PolySurface::deriver(double *uv,double *xyzdu, double *xyzdv)
81 {
82 
83 }
84 
85 
86 void PolySurface::deriver_seconde(double *uv,double* xyzduu,double* xyzduv,double* xyzdvv,double *xyz, double *xyzdu, double *xyzdv)
87 {
88 
89 }
90 
91 
92 void PolySurface::inverser(double *uv,double *xyz,double precision)
93 {
94 
95 }
96 
97 bool PolySurface::est_sur_surface(double* xyz, double precision)
98 {
99  std::cout <<" *** PolySurface::est_sur_surface : FONCTION NON IMPLEMENTE ***" << std::endl;
100  return false;
101 }
102 
103 
105 {
106 
107  return 0;
108 }
109 
110 
112 {
113 
114  return 0;
115 }
116 
117 
119 {
120 
121  return 0;
122 }
123 
124 
126 {
127  return 0;
128 
129 }
130 
131 
132 
133 void PolySurface::enregistrer(std::ostream& o,double version)
134 {
135  unsigned int i;
136 
137  o << "%" << get_id()
138  << "=CAD4FE_POLYSURFACE(" << GetRefFaceCount() << ",(";
139 
140  for (i=0; i < GetRefFaceCount(); i++)
141  {
142  if ( i ) o <<",";
143  o << "$" << GetRefFace(i)->get_id();
144  }
145 
146  o << "));" << std::endl;;
147 }
148 
149 
151 {
152  return 0;
153 }
154 
156 {
157  int nb_coedge = __refEdge->get_nb_mg_coarete();
158  for (int i=0; i<nb_coedge; i++)
159  {
160  MG_FACE * f = __refEdge->get_mg_coarete(i)->get_boucle()->get_mg_face();
161  if (Contains(f))
162  return true;
163  }
164  return false;
165 }
166 
168 {
169  return ( _lst_ref_faces.find(__refFace) != _lst_ref_faces.end());
170 }
171 
172 MG_FACE * PolySurface::GetRefFace(unsigned int __index)
173 {
174  std::set<MG_FACE*>::iterator itFace = _lst_ref_faces.begin();
175  std::advance (itFace, __index);
176  return *itFace;
177 }
178 
179 std::set<MG_FACE*> & PolySurface::GetRefFaces()
180 {
181  return _lst_ref_faces;
182 }
183 
185 {
186  return _lst_ref_faces.size();
187 }
188 void PolySurface::calcul_normale_unitaire(MG_SOMMET *v, double __normal[3], int * __nbRefFace)
189 {
190  double angleTot=0;
191  OT_VECTEUR_3D normalTriangle(0,0,0);
192 
193  MG_NOEUD * refNode = 0;
196  refNode = (MG_NOEUD *)refNodeMesh->get_premier(it);
197  TPL_LISTE_ENTITE<MG_TRIANGLE*>* adjacentTriangles = refNode->get_lien_triangle();
198  unsigned itTriang;
199  for (itTriang=0;itTriang <adjacentTriangles->get_nb(); itTriang++)
200  {
201  MG_TRIANGLE* t = adjacentTriangles->get(itTriang);
202  MG_FACE * refFace = (MG_FACE*) t->get_lien_topologie();
203  if ( Contains(refFace) == false)
204  continue;
205  int id=-1;
206  MG_NOEUD * nos[3]={t->get_noeud1(),t->get_noeud2(),t->get_noeud3()};
207  for (int j=0;j<3;j++)
208  if (nos[j] == refNode)
209  {
210  id = j;
211  break;
212  }
213  OT_VECTEUR_3D x[3];
214  for (int j=0;j<3;j++)
215  x[j]=OT_VECTEUR_3D(nos[j]->get_coord());
216  OT_VECTEUR_3D x1x2 = x[id]-x[(id+2)%3];
217  x1x2.norme();
218  OT_VECTEUR_3D x2x3 = x[(id+1)%3]-x[id];
219  x2x3.norme();
220  OT_VECTEUR_3D normal = x1x2&x2x3;
221  double angle = acos(-(x1x2*x2x3));
222  normal *= angle;
223  angleTot += angle;
224  normalTriangle += normal;
225  }
226  if (angleTot != 0)
227  {
228  normalTriangle /= angleTot;
229  for (int j=0;j<3;j++)
230  __normal[j]=normalTriangle[j];
231  }
232  else
233  {
234  for (int j=0;j<3;j++)
235  __normal[j]=0;
236  }
237  *__nbRefFace = ceil(angleTot);
238 }
239 
240 void PolySurface::calcul_normale_unitaire(MCVertex * __mcVertex, double __n[3], int *__nbRefFace)
241 {
242  // normal = 1/n * sum_i=1,n ( normal(ref face) )
243  // where n is the number of reference faces adjacent to reference vertex and contained in the MC Face
244 
245  OT_VECTEUR_3D tmpNormal(0,0,0);
246  MG_SOMMET * v = __mcVertex->GetRefVertex();
247  int nbRefFace=0;
248  calcul_normale_unitaire(v, __n, &nbRefFace);
249  std::map <unsigned long, MG_SOMMET *> & mergedVertices = __mcVertex->GetMergedRefVertices();
250  for (std::map <unsigned long, MG_SOMMET *>::iterator itRefVertex=mergedVertices.begin();
251  itRefVertex != mergedVertices.end();
252  itRefVertex++)
253  {
254  v = itRefVertex->second;
255  int tmpnbRefFace;
256  calcul_normale_unitaire(v, tmpNormal, &tmpnbRefFace);
257  for (int i=0;i<3;i++) __n[i]+=tmpNormal[i];
258  nbRefFace += tmpnbRefFace;
259  }
260  *__nbRefFace = nbRefFace;
261 }
262 
263 void PolySurface::calcul_normale_unitaire(const std::map<MG_FACE *, OT_VECTEUR_3D > & __tabRefFaceUV, double __n[3], int *__nbRefFace)
264 {
265  (*__nbRefFace) = 0;
266  OT_VECTEUR_3D n(0,0,0);
267 
268  for (std::map<MG_FACE *, OT_VECTEUR_3D >::const_iterator itF = __tabRefFaceUV.begin();
269  itF != __tabRefFaceUV.end(); itF++)
270  {
271  MG_FACE * refFace = itF->first;
272 
273  if ( _lst_ref_faces.find(refFace) == _lst_ref_faces.end() )
274  continue;
275 
276  OT_VECTEUR_3D refFaceNormal;
277  OT_VECTEUR_3D refFaceUV=itF->second;
278  refFace->calcul_normale_unitaire(refFaceUV,refFaceNormal);
279 
280  n += refFaceNormal;
281 
282  (*__nbRefFace)++;
283  }
284 
285  if ((*__nbRefFace)==0)
286  return;
287 
288  n /= (*__nbRefFace);
289 
290  double inv_n_norm = 1/n.get_longueur();
291  for (int i=0; i<3; i++)
292  __n[i]=n[i]*inv_n_norm;
293 }
294 
295 void PolySurface::get_param_NURBS(int& indx_premier_ptctr, TPL_LISTE_ENTITE<double> &param)
296 {
297  return;
298 }
299 
300 void PolySurface::get_liste_pole(std::vector<double> *liste_pole,double eps)
301 {
302 printf("void PolySurface::get_liste_pole(std::vector<double> *liste_pole) : Fonction non implementee !\n");
303 }
304 
305 
306 
CAD4FE::PolySurface::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: CAD4FE_PolySurface.cpp:133
mg_geometrie.h
CAD4FE::PolySurface::GetRefFaces
std::set< MG_FACE * > & GetRefFaces()
Definition: CAD4FE_PolySurface.cpp:179
gestionversion.h
CAD4FE::PolySurface::est_sur_surface
virtual bool est_sur_surface(double *xyz, double precision=1e-6)
Definition: CAD4FE_PolySurface.cpp:97
CAD4FE::PolySurface::get_periode_v
virtual double get_periode_v(void)
Definition: CAD4FE_PolySurface.cpp:125
CAD4FE::PolySurface::Contains
bool Contains(MG_FACE *__refFace)
Definition: CAD4FE_PolySurface.cpp:167
CAD4FE::PolySurface
Definition: CAD4FE_PolySurface.h:43
MG_NOEUD::get_lien_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_noeud.cpp:153
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
CAD4FE::PolySurface::deriver_seconde
virtual void deriver_seconde(double *uv, double *xyzduu, double *xyzduv, double *xyzdvv, double *xyz=NULL, double *xyzdu=NULL, double *xyzdv=NULL)
Definition: CAD4FE_PolySurface.cpp:86
CAD4FE::PolySurface::get_param_NURBS
virtual void get_param_NURBS(int &indx_premier_ptctr, TPL_LISTE_ENTITE< double > &param)
Definition: CAD4FE_PolySurface.cpp:295
TPL_SET< MG_ELEMENT_MAILLAGE * >
CAD4FE::PolySurface::GetRefFace
MG_FACE * GetRefFace(unsigned int __index)
Definition: CAD4FE_PolySurface.cpp:172
CAD4FE::PolySurface::Merge
void Merge(PolySurface &)
Definition: CAD4FE_PolySurface.cpp:62
TPL_SET::get_premier
X get_premier(ITERATEUR &it)
Definition: tpl_set.h:99
CAD4FE::PolySurface::_lst_ref_faces
std::set< MG_FACE * > _lst_ref_faces
Definition: CAD4FE_PolySurface.h:72
MG_COARETE::get_boucle
virtual MG_BOUCLE * get_boucle(void)
Definition: mg_coarete.cpp:53
MG_TRIANGLE
Definition: mg_triangle.h:38
MG_ELEMENT_TOPOLOGIQUE::get_lien_maillage
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
Definition: mg_element_topologique.cpp:62
CAD4FE::PolySurface::calcul_normale_unitaire
void calcul_normale_unitaire(MG_SOMMET *v, double __n[3], int *__nbRefFace)
Definition: CAD4FE_PolySurface.cpp:188
CAD4FE::PolySurface::inverser
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
Definition: CAD4FE_PolySurface.cpp:92
CAD4FE::PolySurface::PolySurface
PolySurface()
Definition: CAD4FE_PolySurface.h:46
MG_ARETE::get_nb_mg_coarete
virtual int get_nb_mg_coarete(void)
Definition: mg_arete.cpp:106
CAD4FE::MCVertex::GetRefVertex
MG_SOMMET * GetRefVertex()
Definition: CAD4FE_MCVertex.cpp:47
CAD4FE::PolySurface::InsertSurface
void InsertSurface(MG_FACE *)
Definition: CAD4FE_PolySurface.cpp:56
f
double f(double x, long nb, double *xfonc, double *fonc, double eng, double eni, double lambda, double nor, double *fonc2)
Definition: fct_generateur_calibrage.cpp:96
MG_NOEUD
Definition: mg_noeud.h:41
CAD4FE::MCVertex
Definition: CAD4FE_MCVertex.h:35
CAD4FE_MCVertex.h
CAD4FE_PolySurface.h
MG_BOUCLE::get_mg_face
virtual MG_FACE * get_mg_face(void)
Definition: mg_boucle.cpp:102
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
mg_arete.h
MG_IDENTIFICATEUR::id
unsigned long id
Definition: mg_identificateur.h:49
MG_TRIANGLE::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_triangle.cpp:131
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
ot_mathematique.h
CAD4FE::PolySurface::evaluer
virtual void evaluer(double *uv, double *xyz)
Definition: CAD4FE_PolySurface.cpp:74
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
CAD4FE::PolySurface::est_periodique_u
virtual int est_periodique_u(void)
Definition: CAD4FE_PolySurface.cpp:104
MG_TRIANGLE::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_triangle.cpp:126
CAD4FE::MCVertex::GetMergedRefVertices
std::map< unsigned long, MG_SOMMET * > & GetMergedRefVertices()
Definition: CAD4FE_MCVertex.cpp:94
MG_FACE::calcul_normale_unitaire
virtual void calcul_normale_unitaire(double *uv, double *normale)
Definition: mg_face.cpp:248
MG_ELEMENT_MAILLAGE::get_lien_topologie
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: mg_element_maillage.cpp:51
MG_TRIANGLE::get_noeud3
virtual MG_NOEUD * get_noeud3(void)
Definition: mg_triangle.cpp:137
CAD4FE::PolySurface::get_periode_u
virtual double get_periode_u(void)
Definition: CAD4FE_PolySurface.cpp:118
CAD4FE
Definition: CAD4FE_ClosestPoint_Segment_MG_ARETE.h:34
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
TPL_LISTE_ENTITE< double >
CAD4FE::PolySurface::get_type_geometrique
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > &param)
Definition: CAD4FE_PolySurface.cpp:150
CAD4FE::PolySurface::GetRefFaceCount
unsigned int GetRefFaceCount()
Definition: CAD4FE_PolySurface.cpp:184
MG_ARETE
Definition: mg_arete.h:36
MG_FACE
Definition: mg_face.h:34
MG_SOMMET
Definition: mg_sommet.h:35
CAD4FE::PolySurface::est_periodique_v
virtual int est_periodique_v(void)
Definition: CAD4FE_PolySurface.cpp:111
CAD4FE::PolySurface::deriver
virtual void deriver(double *uv, double *xyzdu, double *xyzdv)
Definition: CAD4FE_PolySurface.cpp:80
tpl_fonction.h
CAD4FE::PolySurface::get_liste_pole
virtual void get_liste_pole(std::vector< double > *liste_pole, double eps)
Definition: CAD4FE_PolySurface.cpp:300
MG_ARETE::get_mg_coarete
virtual MG_COARETE * get_mg_coarete(int num)
Definition: mg_arete.cpp:228