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);
62  grille.initialiser(boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax(),pas_estimation,pas_estimation,pas_estimation);
63  int nb_point=lstpoint.get_nb();
64  for (int i=0;i<nb_point;i++)
65  grille.inserer(lstpoint.get(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  {
96  TPL_CELLULE_GRILLE_INFO<CT_POINT<1> *,DOUBLEN<4> > *cell=grille.get_cellule(i,j,k);
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 }
double get_xmin(void)
double get_xcentre(void)
double get_zmin(void)
double get_ycentre(void)
double get_zmax(void)
double get_xmax(void)
double get_ymax(void)
void reinit(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
Definition: ot_boite_3d.cpp:55
double get_ymin(void)
double get_zcentre(void)
virtual void evaluer(double *xyz)
Definition: ct_point.cpp:49
double get_fonction_influence(double r)
Definition: ct_point.cpp:66
virtual class BOITE_3D get_boite_3D(void)
Definition: ct_point.cpp:108
DOUBLEN< N > & get_valeur(void)
Definition: ct_point.cpp:61
double get_valeur(int num)
TPL_GRILLE_INFO< CT_POINT< 1 > *, DOUBLEN< N > > grille
FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION(double ecart, double ind1=4, double ind2=0.5)
static int egal(double a, double b, double eps)
void change_info(int num, B val)
Definition: tpl_grille.h:114
virtual X get(int num)
virtual int get_nb(void)
virtual int get_nb(void)
virtual X get(int num)
#define tabxyz(a, b, c, d)
double2 sqrt(double2 &val)