MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fct_generateur_echantillonage_estimation.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 //####// fct_generateur_echantillonage_estimation.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:53 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 
26 
27 
28 #include <math.h>
30 #include "mg_gestionnaire.h"
31 #include "ct_face.h"
32 #include "ct_point.h"
33 
34 
35 
36 
37 FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION(double ecart,double ind1,double ind2):FCT_GENERATEUR_3D<4>(),zonezoom(ind1),zonetrans(ind2),dng(ecart),pas_echantillon(20),pas_estimation(20)
38 {
39 }
40 
42 {
43 }
44 
45 
47 {
49  double xc=boite.get_xcentre();
50  double yc=boite.get_ycentre();
51  double zc=boite.get_zcentre();
52  double rayonx=1.125*(boite.get_xmax()-xc);
53  double rayony=1.125*(boite.get_ymax()-yc);
54  double rayonz=1.125*(boite.get_zmax()-zc);
55  xmin=xc-rayonx;
56  ymin=yc-rayony;
57  zmin=zc-rayonz;
58  xmax=xc+rayonx;
59  ymax=yc+rayony;
60  zmax=zc+rayonz;
61  boite.reinit(xmin,ymin,zmin,xmax,ymax,zmax);
63  int nb_point=lstpoint.get_nb();
64  for (int i=0;i<nb_point;i++)
66  double *tabxyz=new double[(pas_estimation+1)*(pas_estimation+1)*(pas_estimation+1)*4];
67 #define tabxyz(a,b,c,d) (*(tabxyz+((((a)*(pas_estimation+1)+(b))*(pas_estimation+1)+(c))*4+(d))))
68  double valmax=-1e308;
69  for (int i=0;i<pas_estimation+1;i++)
70  for (int j=0;j<pas_estimation+1;j++)
71  for (int k=0;k<pas_estimation+1;k++)
72  {
73  double x=xmin+1.0*i/pas_estimation*(xmax-xmin);
74  double y=ymin+1.0*j/pas_estimation*(ymax-ymin);
75  double z=zmin+1.0*k/pas_estimation*(zmax-zmin);
76  tabxyz(i,j,k,0)=estimer(x,y,z);
77  if (i!=pas_estimation-1) tabxyz(i,j,k,1)=(estimer(x+1e-6,y,z)-tabxyz(i,j,k,0))/1e-6;
78  else tabxyz(i,j,k,1)=(estimer(x-1e-6,y,z)-tabxyz(i,j,k,0))/1e-6;
79  if (j!=pas_estimation-1) tabxyz(i,j,k,2)=(estimer(x,y+1e-6,z)-tabxyz(i,j,k,0))/1e-6;
80  else tabxyz(i,j,k,2)=(estimer(x,y-1e-6,z)-tabxyz(i,j,k,0))/1e-6;
81  if (k!=pas_estimation-1) tabxyz(i,j,k,3)=(estimer(x,y,z+1e-6)-tabxyz(i,j,k,0))/1e-6;
82  else tabxyz(i,j,k,3)=(estimer(x,y,z-1e-6)-tabxyz(i,j,k,0))/1e-6;
83  if (tabxyz(i,j,k,0)>valmax)
84  {
85  DOUBLEN<4> ecart(&(tabxyz(i,j,k,0)));
86  valeurmax=ecart;
87  valmax=tabxyz(i,j,k,0);
88  }
89  }
90 #undef tabxyz
91 #define tabxyz(a,b,c) (tabxyz+((((a)*(pas_estimation+1)+(b))*(pas_estimation+1)+(c))*4))
92  for (int i=0;i<pas_estimation;i++)
93  for (int j=0;j<pas_estimation;j++)
94  for (int k=0;k<pas_estimation;k++)
95  {
97  DOUBLEN<4> ecart0(tabxyz(i,j,k));
98  cell->change_info(0,ecart0);
99  DOUBLEN<4> ecart1(tabxyz(i+1,j,k));
100  cell->change_info(1,ecart1);
101  DOUBLEN<4> ecart2(tabxyz(i+1,j+1,k));
102  cell->change_info(2,ecart2);
103  DOUBLEN<4> ecart3(tabxyz(i,j+1,k));
104  cell->change_info(3,ecart3);
105  DOUBLEN<4> ecart4(tabxyz(i,j,k+1));
106  cell->change_info(4,ecart4);
107  DOUBLEN<4> ecart5(tabxyz(i+1,j,k+1));
108  cell->change_info(5,ecart5);
109  DOUBLEN<4> ecart6(tabxyz(i+1,j+1,k+1));
110  cell->change_info(6,ecart6);
111  DOUBLEN<4> ecart7(tabxyz(i,j+1,k+1));
112  cell->change_info(7,ecart7);
113  }
114 #undef tabxyz
115  legende[0]="F(x,y,z)";
116  legende[1]="dF/dx";
117  legende[2]="dF/dy";
118  legende[3]="dF/dz";
119  delete [] tabxyz;
120  for (int i=0;i<nb_point;i++)
121  {
122  CT_POINT<1> *pt=lstpoint.get(i);
123  delete pt;
124  }
125 
126 
127 }
128 
129 
130 double FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::estimer(double x,double y,double z)
131 {
132  TPL_MAP_ENTITE<CT_POINT<1> *> lst_cellule;
133  grille.rechercher(x,y,z,1e-10,lst_cellule);
134  int nb_zone=lst_cellule.get_nb();
135  double rmin=1;
136  double nume=0.;
137  double deno=0.;
138  int nb_terme=0;
139  double delta=0.;
140  double F=0.;
141  double r=0.;
142 
143  for (int i=0;i<nb_zone;i++)
144  {
145  CT_POINT<1>* pt=lst_cellule.get(i);
146  BOITE_3D btpt(x,y,z,x,y,z);
147  if (pt->get_boite_3D()*btpt)
148  {
149 
150  double xyz[3];
151  pt->evaluer(xyz);
152  double dist=(x-xyz[0])*(x-xyz[0])+(y-xyz[1])*(y-xyz[1])+(z-xyz[2])*(z-xyz[2]);
153  dist=sqrt(dist);
154  DOUBLEN<1> ecart=pt->get_valeur();
155  double dnn=ecart.get_valeur(0);
156  if (OPERATEUR::egal(dist,0.,1e-10)) return dnn;
157  delta=0.5*(pt->get_boite_3D().get_xmax()-pt->get_boite_3D().get_xmin()); // Attention n�cessite des boites cubiques! dx=dy=dz
158  if (dist<delta)
159  {
160  r=dist/delta;
161  F=pt->get_fonction_influence(r);
162  nume=nume+dnn*F;
163  deno=deno+F;
164  nb_terme++;
165  if (r<rmin) rmin=r;
166  }
167  }
168  }
169  if (nb_terme==0) return dng;
170 
171  F=rmin;
172  nume=nume+dng*zonetrans*nb_terme*F;
173  deno=deno+zonetrans*nb_terme*F;
174 
175  return nume/deno;
176 }
177 
178 double FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::estimer(double x,double y,double z, double crb)
179 {
180  TPL_MAP_ENTITE<CT_POINT<1> *> lst_cellule;
181  grille.rechercher(x,y,z,1e-10,lst_cellule);
182  int nb_zone=lst_cellule.get_nb();
183  double rmin=1;
184  double nume=0.;
185  double deno=0.;
186  int nb_terme=0;
187  double delta=0.;
188  double F=0.;
189  double r=0.;
190  for (int i=0;i<nb_zone;i++)
191  {
192  CT_POINT<1>* pt=lst_cellule.get(i);
193  BOITE_3D btpt(x,y,z,x,y,z);
194  if (pt->get_boite_3D()*btpt)
195  {
196  double xyz[3];
197  pt->evaluer(xyz);
198  double dist=(x-xyz[0])*(x-xyz[0])+(y-xyz[1])*(y-xyz[1])+(z-xyz[2])*(z-xyz[2]);
199  dist=sqrt(dist);
200  DOUBLEN<1> ecart=pt->get_valeur();
201  double dnn=ecart.get_valeur(0);
202  if (OPERATEUR::egal(dist,0.,1e-10)) return dnn;
203  delta=0.5*(pt->get_boite_3D().get_xmax()-pt->get_boite_3D().get_xmin()); // Attention n�cessite des boites cubiques! dx=dy=dz
204  if (dist<delta)
205  {
206  r=dist/delta;
207  F=pt->get_fonction_influence(r,crb);
208  nume=nume+dnn*F;
209  deno=deno+F;
210  nb_terme++;
211  if (r<rmin) rmin=r;
212  }
213  }
214  }
215  if (nb_terme==0) return dng;
216 
217  F=rmin;
218  nume=nume+dng*zonetrans*nb_terme*F;
219  deno=deno+zonetrans*nb_terme*F;
220 
221  return nume/deno;
222 }
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::xmax
double xmax
Definition: fct_generateur_echantillonage_estimation.h:51
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::estimation
virtual void estimation(void)
Definition: fct_generateur_echantillonage_estimation.cpp:46
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::lstpoint
TPL_LISTE_ENTITE< CT_POINT< 1 > * > lstpoint
Definition: fct_generateur_echantillonage_estimation.h:52
TPL_GRILLE_INFO::rechercher
virtual void rechercher(double xcentre, double ycentre, double zcentre, double rayon_recherche, TPL_MAP_ENTITE< A > &liste_entite_trouve)
Definition: tpl_grille.h:448
gestionversion.h
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
BOITE_3D::get_xmin
double get_xmin(void)
Definition: ot_boite_3d.cpp:104
mg_gestionnaire.h
fct_generateur_echantillonage_estimation.h
FCT_GENERATEUR_3D< 4 >::valeurmax
DOUBLEN< N > valeurmax
Definition: fct_generateur_3d.h:57
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::xmin
double xmin
Definition: fct_generateur_echantillonage_estimation.h:50
BOITE_3D::get_xcentre
double get_xcentre(void)
Definition: ot_boite_3d.cpp:156
FCT_GENERATEUR_3D
Definition: fct_generateur_3d.h:35
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::~FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION
~FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION()
Definition: fct_generateur_echantillonage_estimation.cpp:41
ct_face.h
CT_POINT::evaluer
virtual void evaluer(double *xyz)
Definition: ct_point.cpp:49
CT_POINT
Definition: ct_point.h:31
FCT_GENERATEUR_3D< 4 >::grille
TPL_GRILLE_INFO< CT_POINT< 1 > *, DOUBLEN< N > > grille
Definition: fct_generateur_3d.h:56
BOITE_3D::get_zmax
double get_zmax(void)
Definition: ot_boite_3d.cpp:129
BOITE_3D::get_ymin
double get_ymin(void)
Definition: ot_boite_3d.cpp:114
CT_POINT::get_valeur
DOUBLEN< N > & get_valeur(void)
Definition: ct_point.cpp:61
FCT_GENERATEUR_3D< 4 >::legende
std::string legende[N]
Definition: fct_generateur_3d.h:55
BOITE_3D::get_zcentre
double get_zcentre(void)
Definition: ot_boite_3d.cpp:166
CT_POINT::get_boite_3D
virtual class BOITE_3D get_boite_3D(void)
Definition: ct_point.cpp:108
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::ymax
double ymax
Definition: fct_generateur_echantillonage_estimation.h:51
BOITE_3D::get_xmax
double get_xmax(void)
Definition: ot_boite_3d.cpp:109
TPL_CELLULE_GRILLE_INFO::change_info
void change_info(int num, B val)
Definition: tpl_grille.h:114
OPERATEUR::egal
static int egal(double a, double b, double eps)
Definition: ot_mathematique.cpp:1629
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
BOITE_3D::get_ycentre
double get_ycentre(void)
Definition: ot_boite_3d.cpp:161
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::ymin
double ymin
Definition: fct_generateur_echantillonage_estimation.h:50
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION(double ecart, double ind1=4, double ind2=0.5)
Definition: fct_generateur_echantillonage_estimation.cpp:37
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
BOITE_3D::reinit
void reinit(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
Definition: ot_boite_3d.cpp:55
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
BOITE_3D::get_ymax
double get_ymax(void)
Definition: ot_boite_3d.cpp:119
tabxyz
#define tabxyz(a, b, c, d)
TPL_GRILLE_INFO::inserer
virtual void inserer(A a)
Definition: tpl_grille.h:480
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::zmin
double zmin
Definition: fct_generateur_echantillonage_estimation.h:50
TPL_GRILLE_INFO::get_cellule
virtual TPL_CELLULE_GRILLE_INFO< A, B > * get_cellule(int num)
Definition: tpl_grille.h:385
BOITE_3D
Definition: ot_boite_3d.h:27
DOUBLEN::get_valeur
double get_valeur(int num)
Definition: ot_mathematique.cpp:1934
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::zonetrans
double zonetrans
Definition: fct_generateur_echantillonage_estimation.h:47
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::pas_estimation
int pas_estimation
Definition: fct_generateur_echantillonage_estimation.h:45
TPL_MAP_ENTITE::get
virtual X get(int num)
Definition: tpl_map_entite.h:89
TPL_CELLULE_GRILLE_INFO
Definition: tpl_grille.h:93
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::zmax
double zmax
Definition: fct_generateur_echantillonage_estimation.h:51
BOITE_3D::get_zmin
double get_zmin(void)
Definition: ot_boite_3d.cpp:124
TPL_GRILLE_INFO::initialiser
virtual void initialiser(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax, int nb_pasx, int nb_pasy, int nb_pasz)
Definition: tpl_grille.h:388
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::estimer
virtual double estimer(double x, double y, double z)
Definition: fct_generateur_echantillonage_estimation.cpp:130
ct_point.h
DOUBLEN
Definition: ot_mathematique.h:457
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION::dng
double dng
Definition: fct_generateur_echantillonage_estimation.h:48
CT_POINT::get_fonction_influence
double get_fonction_influence(double r)
Definition: ct_point.cpp:66