MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
fct_generateur_frontiere.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_frontiere.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 #pragma hdrstop
27 
28 
29 #include <math.h>
31 #include "mg_gestionnaire.h"
32 #include "ct_face.h"
33 #include "ct_point.h"
34 
35 
36 
37 
38 FCT_GENERATEUR_FRONTIERE::FCT_GENERATEUR_FRONTIERE(MG_GESTIONNAIRE& mggest,double dn,double eps,int ind1,double ind2,double *lst_pt_ctrl,int nbpt):FCT_GENERATEUR_ECHANTILLONAGE_ESTIMATION(dn,ind1,ind2),gest(mggest),epsilon(eps),point_controle(lst_pt_ctrl),nb_pt_ctrl(nbpt)
39 {
40 }
41 
43 {
44 }
45 
46 
48 {
50  if (mggt!=NULL)
51  {
52  std::map<MG_ELEMENT_TOPOLOGIQUE*,MG_ELEMENT_TOPOLOGIQUE*>::iterator it;
53  for(MG_ELEMENT_TOPOLOGIQUE* ele=mggt->get_premier(it);ele!=NULL;ele=mggt->get_suivant(it))
54  {
55  lst.ajouter(ele);
56  ele->get_topologie_sousjacente(&lst);
57  }
58  }
59  xmin=1e308,ymin=1e308,zmin=1e308;
60  xmax=-1e308,ymax=-1e308,zmax=-1e308;
61  int nb_geo=gest.get_nb_mg_geometrie();
62  for (int i=0;i<nb_geo;i++)
63  {
65  int nb_face=mggeo->get_nb_mg_face();
67  for (int j=0;j<nb_face;j++)
68  {
69  MG_FACE* face=mggeo->get_mg_face(j);
70  CT_FACE* cface=new CT_FACE(face);
71  cface->change_umax(-1e308);
72  cface->change_umin(1e308);
73  cface->change_vmax(-1e308);
74  cface->change_vmin(1e308);
75  lstface.ajouter(cface);
76  }
77  int nb_arete=mggeo->get_nb_mg_arete();
78  for (int j=0;j<nb_arete;j++)
79  {
80  MG_ARETE* arete=mggeo->get_mg_arete(j);
81  if (mggt!=NULL)
82  if (lst.existe(arete)==0) continue;
83  int nbfac=arete->get_nb_mg_coarete();
84  double tmin=arete->get_tmin();
85  double tmax=arete->get_tmax();
86  double tdemi=0.5*(tmax+tmin);
87  double xyz1[3],xyz2[3];
88  arete->evaluer(tmin,xyz1);
89  arete->evaluer(tdemi,xyz2);
90  OT_VECTEUR_3D vec(xyz1,xyz2);
91  double densdep=vec.get_longueur()*2.;
92  MG_FACE** lstfac=new MG_FACE*[nbfac];
93  for (int k=0;k<nbfac;k++)
94  lstfac[k]=arete->get_mg_coarete(k)->get_boucle()->get_mg_face();
95  if (pas_echantillon!=-1)
96  for (int k=0;k<pas_echantillon+1;k++)
97  {
98  double t=tmin+1.0*k/pas_echantillon*(tmax-tmin);
99  double xyz[3];
100  arete->evaluer(t,xyz);
101  if (xyz[0]<xmin) xmin=xyz[0];
102  if (xyz[0]>xmax) xmax=xyz[0];
103  if (xyz[1]<ymin) ymin=xyz[1];
104  if (xyz[1]>ymax) ymax=xyz[1];
105  if (xyz[2]<zmin) zmin=xyz[2];
106  if (xyz[2]>zmax) zmax=xyz[2];
107  double courbure=arete->get_M(t);
108  for (int l=0;l<nbfac;l++)
109  {
110  double uv[2];
111  lstfac[l]->inverser(uv,xyz);
112  CT_FACE* fac=lstface.getid(lstfac[l]->get_id());
113  if (uv[0]>fac->get_umax()) fac->change_umax(uv[0]);
114  if (uv[0]<fac->get_umin()) fac->change_umin(uv[0]);
115  if (uv[1]>fac->get_vmax()) fac->change_vmax(uv[1]);
116  if (uv[1]<fac->get_vmin()) fac->change_vmin(uv[1]);
117  double cmin,cmax;
118  lstfac[l]->get_courbure(uv,cmax,cmin);
119  cmax=fabs(cmax);
120  if (cmax>courbure) courbure=cmax;
121  }
122  double dn=densdep;
123  if (!(OPERATEUR::egal(courbure,0.0,1e-8))) dn=sqrt(8*epsilon/courbure);
124  else dn=dng;
125  if (dn>dng) dn=dng;
126  if (densdep<dn) dn=densdep;
127  double dist=zonezoom*(dng-dn);
128  if (!(OPERATEUR::egal(dist,0.0,1e-8)))
129  {
130  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
131  DOUBLEN<1> ecart(&dn);
132  CT_POINT<1>* pt=new CT_POINT<1>(xyz[0],xyz[1],xyz[2],ecart,boite);
133  lstpoint.ajouter(pt);
134  }
135  }
136  else
137  {
138  double t=tmin;
139  int ok=0;
140  do
141  {
142  double xyz[3];
143  arete->evaluer(t,xyz);
144  if (xyz[0]<xmin) xmin=xyz[0];
145  if (xyz[0]>xmax) xmax=xyz[0];
146  if (xyz[1]<ymin) ymin=xyz[1];
147  if (xyz[1]>ymax) ymax=xyz[1];
148  if (xyz[2]<zmin) zmin=xyz[2];
149  if (xyz[2]>zmax) zmax=xyz[2];
150  double courbure=arete->get_M(t);
151  for (int l=0;l<nbfac;l++)
152  {
153  double uv[2];
154  lstfac[l]->inverser(uv,xyz);
155  CT_FACE* fac=lstface.getid(lstfac[l]->get_id());
156  if (uv[0]>fac->get_umax()) fac->change_umax(uv[0]);
157  if (uv[0]<fac->get_umin()) fac->change_umin(uv[0]);
158  if (uv[1]>fac->get_vmax()) fac->change_vmax(uv[1]);
159  if (uv[1]<fac->get_vmin()) fac->change_vmin(uv[1]);
160  double cmin,cmax;
161  lstfac[l]->get_courbure(uv,cmax,cmin);
162  cmax=fabs(cmax);
163  if (cmax>courbure) courbure=cmax;
164  }
165  double dn=densdep;
166  double dntmp;
167  if (!(OPERATEUR::egal(courbure,0.0,1e-8))) dntmp=sqrt(8*epsilon/courbure);
168  else dntmp=1e308;
169  if (dntmp>dng) dn=dng;
170  else dn=dntmp;
171  if (densdep<dn) dn=densdep;
172  double dist=zonezoom*(dng-dn);
173  if (!(OPERATEUR::egal(dist,0.0,1e-8)))
174  {
175  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
176  DOUBLEN<1> ecart(&dn);
177  CT_POINT<1>* pt=new CT_POINT<1>(xyz[0],xyz[1],xyz[2],ecart,boite);
178  lstpoint.ajouter(pt);
179  }
180  double dxyz[3];
181  arete->deriver(t,dxyz);
182  t=t+dntmp/sqrt(dxyz[0]*dxyz[0]+dxyz[1]*dxyz[1]+dxyz[2]*dxyz[2]);
183  if (t>tmax)
184  {
185  t=tmax;
186  ok++;
187  }
188  }
189  while (ok<2);
190  }
191  delete [] lstfac;
192  }
193 
194  for (int j=0;j<nb_face;j++)
195  {
196  MG_FACE* face=mggeo->get_mg_face(j);
197  if (mggt!=NULL)
198  if (lst.existe(face)==0) continue;
199  CT_FACE* cface=lstface.getid(face->get_id());
200  double umin=cface->get_umin();
201  double vmin=cface->get_vmin();
202  double umax=cface->get_umax();
203  double vmax=cface->get_vmax();
204  if (pas_echantillon!=-1)
205  {
206  for (int k=0;k<pas_echantillon+1;k++)
207  for (int l=0;l<pas_echantillon+1;l++)
208  {
209  double uv[2];
210  uv[0]=umin+1.0*k/pas_echantillon*(umax-umin);
211  uv[1]=vmin+1.0*l/pas_echantillon*(vmax-vmin);
212  double xyz[3];
213  face->evaluer(uv,xyz);
214  if (xyz[0]<xmin) xmin=xyz[0];
215  if (xyz[1]<ymin) ymin=xyz[1];
216  if (xyz[2]<zmin) zmin=xyz[2];
217  if (xyz[0]>xmax) xmax=xyz[0];
218  if (xyz[1]>ymax) ymax=xyz[1];
219  if (xyz[2]>zmax) zmax=xyz[2];
220  double cmax,cmin;
221  face->get_courbure(uv,cmax,cmin);
222  cmax=fabs(cmax);
223  double dn;
224  if (!(OPERATEUR::egal(cmax,0.0,1e-8))) dn=sqrt(8*epsilon/cmax);
225  else dn=dng;
226  if (dn>dng) dn=dng;
227  double dist=zonezoom*(dng-dn);
228  if (!(OPERATEUR::egal(dist,0.0,1e-8)))
229  {
230  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
231  DOUBLEN<1> ecart(&dn);
232  CT_POINT<1>* pt=new CT_POINT<1>(xyz[0],xyz[1],xyz[2],ecart,boite);
233  lstpoint.ajouter(pt);
234  }
235  }
236  }
237  else
238  {
239  double uv[2];
240  double udepnou;
241  double vdepnou;
242  double udep=umin;
243  double vdep=vmin;
244  uv[0]=udep;
245  uv[1]=vdep;
246  double xyz[3];
247  int ok=0;
248  do
249  {
250  face->evaluer(uv,xyz);
251  if (xyz[0]<xmin) xmin=xyz[0];
252  if (xyz[1]<ymin) ymin=xyz[1];
253  if (xyz[2]<zmin) zmin=xyz[2];
254  if (xyz[0]>xmax) xmax=xyz[0];
255  if (xyz[1]>ymax) ymax=xyz[1];
256  if (xyz[2]>zmax) zmax=xyz[2];
257  double cmax,cmin;
258  face->get_courbure(uv,cmax,cmin);
259  cmax=fabs(cmax);
260  double dn,dntmp;
261  if (!(OPERATEUR::egal(cmax,0.0,1e-8))) dntmp=sqrt(8*epsilon/cmax);
262  else dntmp=1e308;
263  if (dntmp>dng) dn=dng;
264  else dn=dntmp;
265  double dist=zonezoom*(dng-dn);
266  if (!(OPERATEUR::egal(dist,0.0,1e-8)))
267  {
268  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
269  DOUBLEN<1> ecart(&dn);
270  CT_POINT<1>* pt=new CT_POINT<1>(xyz[0],xyz[1],xyz[2],ecart,boite);
271  lstpoint.ajouter(pt);
272  }
273  double dxyzdu[3];
274  double dxyzdv[3];
275  face->deriver(uv,dxyzdu,dxyzdv);
276  if (ok==-1) ok=6;
277  if (ok==0)
278  {
279  udepnou=uv[0]+dntmp/sqrt(dxyzdu[0]*dxyzdu[0]+dxyzdu[1]*dxyzdu[1]+dxyzdu[2]*dxyzdu[2]);
280  vdepnou=uv[1]+dntmp/sqrt(dxyzdv[0]*dxyzdv[0]+dxyzdv[1]*dxyzdv[1]+dxyzdv[2]*dxyzdv[2]);
281  if (udepnou>umax) udepnou=umax;
282  if (vdepnou>vmax) vdepnou=vmax;
283  ok=1;
284  }
285  if (ok==1)
286  {
287  uv[0]=uv[0]+dntmp/sqrt(dxyzdu[0]*dxyzdu[0]+dxyzdu[1]*dxyzdu[1]+dxyzdu[2]*dxyzdu[2]);
288  if (uv[0]>umax)
289  {
290  uv[0]=umax;
291  ok=2;
292  }
293  }
294  else if (ok==2)
295  {
296  uv[0]=udep;
297  uv[1]=vdepnou;
298  ok=3;
299  if (uv[1]+1e-10>vmax) ok=4;
300  }
301  else if (ok==3)
302  {
303  uv[1]=uv[1]+dntmp/sqrt(dxyzdv[0]*dxyzdv[0]+dxyzdv[1]*dxyzdv[1]+dxyzdv[2]*dxyzdv[2]);
304  if (uv[1]>vmax)
305  {
306  uv[1]=vmax;
307  ok=4;
308  }
309  }
310  else if (ok==4)
311  {
312  udep=udepnou;
313  vdep=vdepnou;
314  uv[0]=udep;
315  uv[1]=vdep;
316  if ((udep+1e-10>umax) && (vdep+1e-10>vmax))
317  ok=-1;
318  else
319  ok=0;
320  }
321  }
322  while (ok<5);
323  }
324 
325  }
326  }
327  //insertion des points de controles
328  for (int i=0;i<nb_pt_ctrl;i++)
329  {
330  double xyz[3];
331  xyz[0]=point_controle[4*i];
332  xyz[1]=point_controle[4*i+1];
333  xyz[2]=point_controle[4*i+2];
334  double dn=point_controle[4*i+3];
335  double dist=zonezoom*(dng-dn);
336  BOITE_3D boite(xyz[0]-dist,xyz[1]-dist,xyz[2]-dist,xyz[0]+dist,xyz[1]+dist,xyz[2]+dist);
337  DOUBLEN<1> ecart(&dn);
338  CT_POINT<1>* pt=new CT_POINT<1>(xyz[0],xyz[1],xyz[2],ecart,boite);
339  lstpoint.ajouter(pt);
340  }
341 }
342 
343 
344 
345 
346 void FCT_GENERATEUR_FRONTIERE::construit(int pas_echan,int pas_estima,MG_GROUPE_TOPOLOGIQUE* mggt)
347 {
348  pas_echantillon=pas_echan;
349  pas_estimation=pas_estima;
350  echantillonner(mggt);
351  estimation();
352 }
353 
354 
355 #pragma package(smart_init)
356 
357 
void change_vmax(double val)
Definition: ct_face.cpp:70
void change_vmin(double val)
Definition: ct_face.cpp:80
double get_vmax(void)
Definition: ct_face.cpp:54
double get_umin(void)
Definition: ct_face.cpp:49
double get_vmin(void)
Definition: ct_face.cpp:59
void change_umin(double val)
Definition: ct_face.cpp:75
void change_umax(double val)
Definition: ct_face.cpp:65
double get_umax(void)
Definition: ct_face.cpp:44
void construit(int pas_echan=20, int pas_estima=20, class MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
void echantillonner(class MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
FCT_GENERATEUR_FRONTIERE(class MG_GESTIONNAIRE &mggest, double dn, double eps, int ind1=4, double ind2=0.25, double *lst_pt_ctrl=NULL, int nbpt=0)
virtual double get_tmax(void)
Definition: mg_arete.cpp:184
virtual double get_tmin(void)
Definition: mg_arete.cpp:179
virtual void deriver(double t, double *xyz)
Definition: mg_arete.cpp:149
virtual void evaluer(double t, double *xyz)
Definition: mg_arete.cpp:143
virtual double get_M(double t)
Definition: mg_arete.cpp:205
virtual MG_COARETE * get_mg_coarete(int num)
Definition: mg_arete.cpp:228
virtual int get_nb_mg_coarete(void)
Definition: mg_arete.cpp:106
virtual MG_FACE * get_mg_face(void)
Definition: mg_boucle.cpp:102
virtual MG_BOUCLE * get_boucle(void)
Definition: mg_coarete.cpp:53
virtual void get_courbure(double *uv, double &cmax, double &cmin)
Definition: mg_face.cpp:313
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
Definition: mg_face.cpp:228
virtual void evaluer(double *uv, double *xyz)
Definition: mg_face.cpp:192
virtual void deriver(double *uv, double *xyzdu, double *xyzdv)
Definition: mg_face.cpp:199
unsigned int get_nb_mg_arete(void)
unsigned int get_nb_mg_face(void)
MG_ARETE * get_mg_arete(unsigned int num)
MG_FACE * get_mg_face(unsigned int num)
MG_GEOMETRIE * get_mg_geometrie(unsigned int num)
unsigned int get_nb_mg_geometrie(void)
virtual MG_ELEMENT_TOPOLOGIQUE * get_premier(std::map< class MG_ELEMENT_TOPOLOGIQUE *, MG_ELEMENT_TOPOLOGIQUE * >::iterator &it)
virtual MG_ELEMENT_TOPOLOGIQUE * get_suivant(std::map< class MG_ELEMENT_TOPOLOGIQUE *, MG_ELEMENT_TOPOLOGIQUE * >::iterator &it)
unsigned long get_id()
static int egal(double a, double b, double eps)
virtual double get_longueur(void) const
virtual void ajouter(X x)
virtual X getid(unsigned long num)
virtual void ajouter(X x)
virtual int existe(X x)
double2 sqrt(double2 &val)