MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
dly_segment.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 //####// dly_segment.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:55 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 
26 #include <stdlib.h>
27 #include "dly_noeud.h"
28 #include "dly_segment.h"
29 #include "dly_tetra.h"
30 #include "ot_mathematique.h"
31 #include "fct_taille.h"
32 #include <math.h>
33 
34 
35 
36 DLY_SEGMENT::DLY_SEGMENT(class DLY_NOEUD *no1,class DLY_NOEUD *no2):noeud1(no1),noeud2(no2)
37 {
38 }
39 DLY_SEGMENT::DLY_SEGMENT(DLY_SEGMENT& mdd):noeud1(mdd.noeud1),noeud2(mdd.noeud2),longueur(mdd.longueur)
40 {
41 }
43 {
44 }
45 
47 {
48 return noeud1;
49 }
51 {
52 return noeud2;
53 }
54 
56 {
57 lsttet.push_back(tet);
58 }
59 
60 
62 {
63 for (std::vector<DLY_TETRA*>::iterator it=lsttet.begin();it!=lsttet.end();it++)
64  if ((*it)==tet) return 1;return 0;
65 }
66 
68 {
69 return lsttet.size();
70 }
71 
73 {
74 return lsttet[i];
75 }
76 
78 {
79 int i=0;
80 int ok=0;
81 while (ok==0)
82  {
83  if (lsttet[i]->get_feuille()==1) ok=1;
84  else i++;
85  if (i>=lsttet.size()) return NULL;
86  }
87 return lsttet[i];
88 }
89 
91 {
92 return longueur;
93 }
94 
95 double DLY_SEGMENT::calcul_longueur(class FCT_TAILLE *metrique,int pas,int conserve)
96 {
97 double l;
98 double xyz1[3],xyz2[3];
99 noeud1->get_coord(xyz1);
100 noeud2->get_coord(xyz2);
101 OT_VECTEUR_3D vec1(xyz1,xyz2);
102 if (metrique==NULL)
103  {
104  l=vec1.get_longueur();
105  if (conserve) {longueur=l;t_demilongueur=0.5;}
106  return l;
107  }
108 l=0.;
109 double dxyz[3];
110 dxyz[0]=xyz2[0]-xyz1[0];
111 dxyz[1]=xyz2[1]-xyz1[1];
112 dxyz[2]=xyz2[2]-xyz1[2];
113 double tab[pas+1],t[pas+1];
114 for (int i=0;i<pas;i++)
115  {
116  double ti=1.0*i/pas;
117  double tii=1.0*(i+1)/pas;
118  t[i]=ti;
119  t[i+1]=tii;
120  double tgauss1=0.7886751345*tii+0.2113248654*ti;
121  double xyz[3];
122  xyz[0]=xyz1[0]+tgauss1*(xyz2[0]-xyz1[0]);
123  xyz[1]=xyz1[1]+tgauss1*(xyz2[1]-xyz1[1]);
124  xyz[2]=xyz1[2]+tgauss1*(xyz2[2]-xyz1[2]);
125  double tenseur[9];
126  metrique->evaluer(xyz,tenseur);
127  double val1= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
128  double tgauss2=0.7886751345*ti+0.2113248654*tii;
129  xyz[0]=xyz1[0]+tgauss2*(xyz2[0]-xyz1[0]);
130  xyz[1]=xyz1[1]+tgauss2*(xyz2[1]-xyz1[1]);
131  xyz[2]=xyz1[2]+tgauss2*(xyz2[2]-xyz1[2]);
132  metrique->evaluer(xyz,tenseur);
133  double val2= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
134  tab[i]=l;
135  l=l+0.5*(tii-ti)*(val1+val2);
136  tab[i+1]=l;
137  }
138  if (conserve)
139  {
140  longueur=l;
141  int i;
142  for(i=0;tab[i]<l/2.;i++);
143  t_demilongueur=t[i]+(t[i+1]-t[i])/(tab[i+1]-tab[i])*(l/2.-tab[i]);
144  }
145  return l;
146 }
148 {
149 return critere;
150 }
151 
153 {
154 critere=crit;
155 }
156 
157 
158 
159 void DLY_SEGMENT::decoupe_noeud(std::vector<double> &lstpt) // a adapter pour taille variable
160 {
161  double xyz1[3],xyz2[3],x,y,z;
162  noeud1->get_coord(xyz1);
163  noeud2->get_coord(xyz2);
164  x=xyz1[0]+t_demilongueur*(xyz2[0]-xyz1[0]);
165  y=xyz1[1]+t_demilongueur*(xyz2[1]-xyz1[1]);
166  z=xyz1[2]+t_demilongueur*(xyz2[2]-xyz1[2]);
167  lstpt.push_back(x);
168  lstpt.push_back(y);
169  lstpt.push_back(z);
170 }
DLY_SEGMENT::longueur
double longueur
Definition: dly_segment.h:55
DLY_SEGMENT::get_nb_tetra
int get_nb_tetra(void)
Definition: dly_segment.cpp:67
DLY_SEGMENT::get_tetra
DLY_TETRA * get_tetra(int i)
Definition: dly_segment.cpp:72
dly_tetra.h
fct_taille.h
gestionversion.h
DLY_NOEUD
Definition: dly_noeud.h:30
DLY_SEGMENT::get_noeud1
DLY_NOEUD * get_noeud1(void)
Definition: dly_segment.cpp:46
DLY_SEGMENT::decoupe_noeud
void decoupe_noeud(std::vector< double > &lstpt)
Definition: dly_segment.cpp:159
DLY_SEGMENT::t_demilongueur
double t_demilongueur
Definition: dly_segment.h:57
DLY_SEGMENT::get_tetra_feuille
DLY_TETRA * get_tetra_feuille(void)
Definition: dly_segment.cpp:77
DLY_SEGMENT::calcul_longueur
double calcul_longueur(class FCT_TAILLE *metrique=NULL, int pas=5, int conserve=1)
Definition: dly_segment.cpp:95
DLY_SEGMENT::DLY_SEGMENT
DLY_SEGMENT(class DLY_NOEUD *no1, class DLY_NOEUD *no2)
Definition: dly_segment.cpp:36
DLY_SEGMENT::lsttet
std::vector< class DLY_TETRA * > lsttet
Definition: dly_segment.h:54
DLY_SEGMENT::noeud1
DLY_NOEUD * noeud1
Definition: dly_segment.h:52
DLY_SEGMENT::~DLY_SEGMENT
virtual ~DLY_SEGMENT()
Definition: dly_segment.cpp:42
DLY_SEGMENT::get_noeud2
DLY_NOEUD * get_noeud2(void)
Definition: dly_segment.cpp:50
FCT_TAILLE
Definition: fct_taille.h:30
DLY_SEGMENT::insere_lien_tetra
void insere_lien_tetra(class DLY_TETRA *tet)
Definition: dly_segment.cpp:55
DLY_SEGMENT
Definition: dly_segment.h:30
DLY_NOEUD::get_coord
virtual void get_coord(double *xyztmp)
Definition: dly_noeud.cpp:85
DLY_SEGMENT::get_longueur
double get_longueur(void)
Definition: dly_segment.cpp:90
DLY_SEGMENT::noeud2
DLY_NOEUD * noeud2
Definition: dly_segment.h:53
DLY_SEGMENT::get_critere
double get_critere(void)
Definition: dly_segment.cpp:147
ot_mathematique.h
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
MG_NOEUD::xyz
double xyz[3]
Definition: mg_noeud.h:104
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
dly_segment.h
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
dly_noeud.h
DLY_SEGMENT::change_critere
void change_critere(double crit)
Definition: dly_segment.cpp:152
DLY_SEGMENT::tet_est_present
int tet_est_present(DLY_TETRA *tet)
Definition: dly_segment.cpp:61
DLY_TETRA
Definition: dly_tetra.h:30
FCT_TAILLE::evaluer
virtual void evaluer(double *param, double *resultat)=0
DLY_SEGMENT::critere
double critere
Definition: dly_segment.h:56