MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fct_taille_volume.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_taille_volume.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:52 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 
26 
27 #include <fstream>
28 #include <math.h>
29 #include "fct_taille_volume.h"
30 #include "ctvol_triangle.h"
31 #include "mg_noeud.h"
32 #include "ot_mathematique.h"
33 #include "tpl_octree.h"
34 
35 
36 
37 
38 
39 
40 FCT_TAILLE_VOLUME::FCT_TAILLE_VOLUME(double dist,TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> *frontiere):FCT_TAILLE_ECART_NODAL(),distance_maximale(dist),octree_de_frontiere(frontiere)
41 {
43 }
44 
46 {
47  int nb=liste_noeud->get_nb();
48  for (int i=0;i<nb;i++)
49  {
50  CTVOL_NOEUD* noeud=liste_noeud->get(0);
51  liste_noeud->supprimer(noeud);
52  delete noeud;
53  nb=liste_noeud->get_nb();
54  }
55  delete liste_noeud;
57  TPL_MAP_ENTITE<CTVOL_TRIANGLE*> liste_triangle;
58  octree_plus_de_frontiere->rechercher(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre(),boite.get_rayon()*1.2,liste_triangle);
59  nb=liste_triangle.get_nb();
60  for (int i=0;i<nb;i++)
61  {
62  CTVOL_TRIANGLE* tri=liste_triangle.get(0);
63  liste_triangle.supprimer(tri);
64  delete tri;
65  nb=liste_triangle.get_nb();
66  }
68 }
69 
70 
71 void FCT_TAILLE_VOLUME::evaluer(double *param,double *resultat)
72 {
73  TPL_MAP_ENTITE<CTVOL_TRIANGLE*> liste_triangle;
74  int sortie=0;
75  double densite[4];
76  double distance[4];
77  int terme=0;
78 
79  while (sortie!=2)
80  {
81  int nb_liste_avant=liste_triangle.get_nb();
82  int nb_tour=1;
83  octree_plus_de_frontiere->rechercher(param[0],param[1],param[2],nb_tour*distance_maximale,liste_triangle);
84  int nb_liste_apres=liste_triangle.get_nb();
85  for (int i=nb_liste_avant-1;i<nb_liste_apres;i++)
86  {
87  CTVOL_TRIANGLE* ctri=liste_triangle.get(i);
88  CTVOL_NOEUD* cn1=ctri->get_noeud1();
89  CTVOL_NOEUD* cn2=ctri->get_noeud2();
90  CTVOL_NOEUD* cn3=ctri->get_noeud3();
91  OT_VECTEUR_3D n1n2(cn2->get_noeud()->get_x()-cn1->get_noeud()->get_x(),cn2->get_noeud()->get_y()-cn1->get_noeud()->get_y(),cn2->get_noeud()->get_z()-cn1->get_noeud()->get_z());
92  OT_VECTEUR_3D n1n3(cn3->get_noeud()->get_x()-cn1->get_noeud()->get_x(),cn3->get_noeud()->get_y()-cn1->get_noeud()->get_y(),cn3->get_noeud()->get_z()-cn1->get_noeud()->get_z());
93  OT_VECTEUR_3D n=n1n2&n1n3;
94  n.norme();
95  double ax=n.get_x();
96  double by=n.get_y();
97  double cz=n.get_z();
98  double d=-(ax*cn1->get_noeud()->get_x()+by*cn1->get_noeud()->get_y()+cz*cn1->get_noeud()->get_z());
99  double t=-(ax*param[0]+by*param[1]+cz*param[2]+d);
100  double xtmp=param[0]+t*ax;
101  double ytmp=param[1]+t*by;
102  double ztmp=param[2]+t*cz;
103  double dist;
104  if (noeud_est_triangle(cn1,cn2,cn3,xtmp,ytmp,ztmp))
105  {
106  dist=fabs(ax*param[0]+by*param[1]+cz*param[2]+d);
107  }
108  else
109  {
110  double d1=sqrt((param[0]-cn1->get_noeud()->get_x())*(param[0]-cn1->get_noeud()->get_x())+(param[1]-cn1->get_noeud()->get_y())*(param[1]-cn1->get_noeud()->get_y())+(param[2]-cn1->get_noeud()->get_z())*(param[2]-cn1->get_noeud()->get_z()));
111  double d2=sqrt((param[0]-cn2->get_noeud()->get_x())*(param[0]-cn2->get_noeud()->get_x())+(param[1]-cn2->get_noeud()->get_y())*(param[1]-cn2->get_noeud()->get_y())+(param[2]-cn2->get_noeud()->get_z())*(param[2]-cn2->get_noeud()->get_z()));
112  double d3=sqrt((param[0]-cn3->get_noeud()->get_x())*(param[0]-cn3->get_noeud()->get_x())+(param[1]-cn3->get_noeud()->get_y())*(param[1]-cn3->get_noeud()->get_y())+(param[2]-cn3->get_noeud()->get_z())*(param[2]-cn3->get_noeud()->get_z()));
113  dist=0.333333333*(d1+d2+d3);
114  }
115  double dens=0.333333333*(cn1->get_densite()+cn2->get_densite()+cn3->get_densite());
116  if (dist<4*distance_maximale)
117  {
118  if (terme<4)
119  {
120  densite[terme]=dens;
121  distance[terme]=dist;
122  terme++;
123  }
124  else
125  {
126  int num=0;
127  if (distance[0]<distance[1]) num=1;
128  if (distance[1]<distance[2]) num=2;
129  if (distance[2]<distance[3]) num=3;
130  if (dist<distance[num])
131  {
132  densite[num]=dens;
133  distance[num]=dist;
134  }
135 
136  }
137  }
138  nb_tour++;
139  if (sortie==1) sortie=2;
140  else
141  {
142  if (nb_tour>4) sortie=1;
143  if ((nb_tour>1) && (terme>3) ) sortie=1;
144  }
145  }
146  }
147  double h;
148  if (terme==0) h=distance_maximale;
149  else
150  {
151  double dismin=distance[0];
152  for (int i=1;i<terme;i++) dismin=std::min(dismin,distance[i]);
153  double nume=0.;
154  double deno=0.;
155  for (int i=0;i<terme;i++)
156  {
157  nume=nume+(4*distance_maximale-distance[i])*densite[i];
158  deno=deno+4*distance_maximale-distance[i];
159  }
160  nume=nume+dismin*distance_maximale;
161  deno=deno+dismin;
162  h=nume/deno;
163  }
164  resultat[0]=1./h/h;
165  resultat[1]=0.;
166  resultat[2]=0.;
167  resultat[3]=0.;
168  resultat[4]=1./h/h;
169  resultat[5]=0.;
170  resultat[6]=0.;
171  resultat[7]=0.;
172  resultat[8]=1./h/h;
173 }
174 
175 void FCT_TAILLE_VOLUME::deriver(double *param,double *resultat,int num_param)
176 {
177  double xyz[3];
178  xyz[0]=param[0];
179  xyz[1]=param[1];
180  xyz[2]=param[2];
181  xyz[num_param]=xyz[num_param]+1e-6;
182  double res1[9],res2[9];
183  evaluer(param,res1);
184  evaluer(xyz,res2);
185  resultat[0]=(res2[0]-res1[0])/1e-6;
186  resultat[1]=(res2[1]-res1[1])/1e-6;
187  resultat[2]=(res2[2]-res1[2])/1e-6;
188  resultat[3]=(res2[3]-res1[3])/1e-6;
189  resultat[4]=(res2[4]-res1[4])/1e-6;
190  resultat[5]=(res2[5]-res1[5])/1e-6;
191  resultat[6]=(res2[6]-res1[6])/1e-6;
192  resultat[7]=(res2[7]-res1[7])/1e-6;
193  resultat[8]=(res2[8]-res1[8])/1e-6;
194 }
195 
196 void FCT_TAILLE_VOLUME::evaluer_decompose(double *metrique_depart,double *metrique_decompose)
197 {
198 }
199 
200 
202 {
203 
206 
208  TPL_MAP_ENTITE<MG_TRIANGLE*> liste_triangle;
209  octree_de_frontiere->rechercher(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre(),boite.get_rayon()*1.2,liste_triangle);
211  int nb=liste_triangle.get_nb();
212 
213  for (int i=0;i<nb;i++)
214  {
215  MG_TRIANGLE* tri=liste_triangle.get(i);
216  MG_NOEUD* noeud1=tri->get_noeud1();
217  MG_NOEUD* noeud2=tri->get_noeud2();
218  MG_NOEUD* noeud3=tri->get_noeud3();
219  CTVOL_NOEUD* cn1=liste_noeud->getid(noeud1->get_id());
220  if (cn1==NULL)
221  {
222  cn1=new CTVOL_NOEUD(noeud1);
223  liste_noeud->ajouter(cn1);
224  }
225  CTVOL_NOEUD* cn2=liste_noeud->getid(noeud2->get_id());
226  if (cn2==NULL)
227  {
228  cn2=new CTVOL_NOEUD(noeud2);
229  liste_noeud->ajouter(cn2);
230  }
231  CTVOL_NOEUD* cn3=liste_noeud->getid(noeud3->get_id());
232  if (cn3==NULL)
233  {
234  cn3=new CTVOL_NOEUD(noeud3);
235  liste_noeud->ajouter(cn3);
236  }
237  CTVOL_TRIANGLE* ctri=new CTVOL_TRIANGLE(tri,cn1,cn2,cn3);
239  double lg1=tri->get_segment1()->get_longueur();
240  double lg2=tri->get_segment2()->get_longueur();
241  double lg3=tri->get_segment3()->get_longueur();
242 
243 
244  cn1->change_densite((cn1->get_densite()*cn1->get_nb_segment()+lg1+lg3)/(cn1->get_nb_segment()+2));
245  cn1->incremente_nb_segment(2);
246  cn2->change_densite((cn2->get_densite()*cn2->get_nb_segment()+lg1+lg2)/(cn2->get_nb_segment()+2));
247  cn2->incremente_nb_segment(2);
248  cn3->change_densite((cn3->get_densite()*cn3->get_nb_segment()+lg3+lg2)/(cn3->get_nb_segment()+2));
249  cn3->incremente_nb_segment(2);
250 
251  }
252 
253 }
254 
255 
256 
257 
258 
259 int FCT_TAILLE_VOLUME::noeud_est_triangle(CTVOL_NOEUD* noeud1,CTVOL_NOEUD* noeud2,CTVOL_NOEUD* noeud3,double x,double y,double z)
260 {
261  OT_VECTEUR_3D n1n2(noeud2->get_noeud()->get_x()-noeud1->get_noeud()->get_x(),noeud2->get_noeud()->get_y()-noeud1->get_noeud()->get_y(),noeud2->get_noeud()->get_z()-noeud1->get_noeud()->get_z());
262  OT_VECTEUR_3D n1n3(noeud3->get_noeud()->get_x()-noeud1->get_noeud()->get_x(),noeud3->get_noeud()->get_y()-noeud1->get_noeud()->get_y(),noeud3->get_noeud()->get_z()-noeud1->get_noeud()->get_z());
263  OT_VECTEUR_3D n=n1n2&n1n3;
264  OT_VECTEUR_3D n1p(x-noeud1->get_noeud()->get_x(),y-noeud1->get_noeud()->get_y(),z-noeud1->get_noeud()->get_z());
265  OT_VECTEUR_3D n2p(x-noeud2->get_noeud()->get_x(),y-noeud2->get_noeud()->get_y(),z-noeud2->get_noeud()->get_z());
266  OT_VECTEUR_3D n3p(x-noeud3->get_noeud()->get_x(),y-noeud3->get_noeud()->get_y(),z-noeud3->get_noeud()->get_z());
267  OT_VECTEUR_3D pv1=n1n2&n1p;
268  double ps1=pv1*n;
269  double eps=n1n2*n1n2;
270  eps=eps*eps*4*0.0001;
271  if (ps1>(-eps))
272  {
273  OT_VECTEUR_3D n2n3(noeud3->get_noeud()->get_x()-noeud2->get_noeud()->get_x(),noeud3->get_noeud()->get_y()-noeud2->get_noeud()->get_y(),noeud3->get_noeud()->get_z()-noeud2->get_noeud()->get_z());
274  OT_VECTEUR_3D pv2=n2n3&n2p;
275  double ps2=pv2*n;
276  if (ps2>(-eps))
277  {
278  OT_VECTEUR_3D pv3=n1n3&n3p;
279  double ps3=(-1)*(pv3*n);
280  if (ps3>(-eps)) return true;
281  }
282 
283  }
284  return false;
285 }
286 
287 
289 {
290  return 1;
291 }
292 
294 {
295  return distance_maximale;
296 }
297 
298 
TPL_MAP_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_map_entite.h:69
CTVOL_TRIANGLE::get_noeud3
class CTVOL_NOEUD * get_noeud3(void)
Definition: ctvol_triangle.cpp:56
CTVOL_NOEUD::get_nb_segment
int get_nb_segment(void)
Definition: ctvol_noeud.cpp:69
MG_TRIANGLE::get_segment1
virtual MG_SEGMENT * get_segment1(void)
Definition: mg_triangle.cpp:142
FCT_TAILLE_VOLUME::creer_frontiere_plus
void creer_frontiere_plus(void)
Definition: fct_taille_volume.cpp:201
FCT_TAILLE_VOLUME::evaluer
virtual void evaluer(double *param, double *resultat)
Definition: fct_taille_volume.cpp:71
FCT_TAILLE_VOLUME::noeud_est_triangle
int noeud_est_triangle(CTVOL_NOEUD *noeud1, CTVOL_NOEUD *noeud2, CTVOL_NOEUD *noeud3, double x, double y, double z)
Definition: fct_taille_volume.cpp:259
FCT_TAILLE_VOLUME::get_valeur_maximale
virtual double get_valeur_maximale(int num)
Definition: fct_taille_volume.cpp:293
gestionversion.h
FCT_TAILLE_VOLUME::octree_de_frontiere
TPL_OCTREE< class MG_TRIANGLE *, class MG_NOEUD * > * octree_de_frontiere
Definition: fct_taille_volume.h:51
FCT_TAILLE_VOLUME::evaluer_decompose
virtual void evaluer_decompose(double *metrique_depart, double *metrique_decompose)
Definition: fct_taille_volume.cpp:196
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
CTVOL_TRIANGLE::get_noeud2
class CTVOL_NOEUD * get_noeud2(void)
Definition: ctvol_triangle.cpp:51
MG_NOEUD::get_z
virtual double get_z(void)
Definition: mg_noeud.cpp:87
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
CTVOL_NOEUD::incremente_nb_segment
void incremente_nb_segment(int nb=1)
Definition: ctvol_noeud.cpp:64
BOITE_3D::get_xcentre
double get_xcentre(void)
Definition: ot_boite_3d.cpp:156
FCT_TAILLE_VOLUME::valide_parametre
virtual int valide_parametre(double *param)
Definition: fct_taille_volume.cpp:288
fct_taille_volume.h
MG_TRIANGLE::get_segment2
virtual MG_SEGMENT * get_segment2(void)
Definition: mg_triangle.cpp:147
FCT_TAILLE_VOLUME::~FCT_TAILLE_VOLUME
virtual ~FCT_TAILLE_VOLUME()
Definition: fct_taille_volume.cpp:45
CTVOL_TRIANGLE
Definition: ctvol_triangle.h:26
FCT_TAILLE_VOLUME::deriver
virtual void deriver(double *param, double *resultat, int num_param=0)
Definition: fct_taille_volume.cpp:175
MG_TRIANGLE
Definition: mg_triangle.h:38
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
mg_noeud.h
MG_TRIANGLE::get_segment3
virtual MG_SEGMENT * get_segment3(void)
Definition: mg_triangle.cpp:152
CTVOL_NOEUD::change_densite
void change_densite(double dens)
Definition: ctvol_noeud.cpp:53
FCT_TAILLE_ECART_NODAL
Definition: fct_taille_ecart_nodal.h:28
TPL_OCTREE::inserer
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:897
BOITE_3D::get_zcentre
double get_zcentre(void)
Definition: ot_boite_3d.cpp:166
CTVOL_TRIANGLE::get_noeud1
class CTVOL_NOEUD * get_noeud1(void)
Definition: ctvol_triangle.cpp:46
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
MG_NOEUD
Definition: mg_noeud.h:41
TPL_OCTREE::rechercher
virtual void rechercher(BOITE_3D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:606
tpl_octree.h
FCT_TAILLE_VOLUME::FCT_TAILLE_VOLUME
FCT_TAILLE_VOLUME(double dist, TPL_OCTREE< class MG_TRIANGLE *, class MG_NOEUD * > *frontiere)
Definition: fct_taille_volume.cpp:40
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
MG_TRIANGLE::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_triangle.cpp:131
ot_mathematique.h
CTVOL_NOEUD::get_noeud
class MG_NOEUD * get_noeud(void)
Definition: ctvol_noeud.cpp:43
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
CTVOL_NOEUD
Definition: ctvol_noeud.h:28
MG_NOEUD::get_x
virtual double get_x(void)
Definition: mg_noeud.cpp:77
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
ctvol_triangle.h
TPL_MAP_ENTITE::getid
virtual X getid(unsigned long num)
Definition: tpl_map_entite.h:96
MG_TRIANGLE::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_triangle.cpp:126
BOITE_3D
Definition: ot_boite_3d.h:27
BOITE_3D::get_rayon
double get_rayon(void)
Definition: ot_boite_3d.cpp:144
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
FCT_TAILLE_VOLUME::distance_maximale
double distance_maximale
Definition: fct_taille_volume.h:52
TPL_OCTREE::get_boite_de_base
virtual BOITE_3D get_boite_de_base(void)
Definition: tpl_octree.h:360
TPL_MAP_ENTITE::get
virtual X get(int num)
Definition: tpl_map_entite.h:89
MG_TRIANGLE::get_noeud3
virtual MG_NOEUD * get_noeud3(void)
Definition: mg_triangle.cpp:137
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
MG_SEGMENT::get_longueur
virtual double get_longueur(void)
Definition: mg_segment.cpp:125
CTVOL_NOEUD::get_densite
double get_densite(void)
Definition: ctvol_noeud.cpp:48
TPL_OCTREE::initialiser
virtual void initialiser(TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
Definition: tpl_octree.h:366
TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * >
FCT_TAILLE_VOLUME::octree_plus_de_frontiere
TPL_OCTREE< class CTVOL_TRIANGLE *, class MG_NOEUD * > * octree_plus_de_frontiere
Definition: fct_taille_volume.h:53
MG_NOEUD::get_y
virtual double get_y(void)
Definition: mg_noeud.cpp:82
FCT_TAILLE_VOLUME::liste_noeud
TPL_MAP_ENTITE< class CTVOL_NOEUD * > * liste_noeud
Definition: fct_taille_volume.h:54