MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
vct_surface.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 //####// vct_surface.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:53 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
23 
24 
25 
26 #pragma hdrstop
27 #include<math.h>
28 #include "vct_surface.h"
29 #include "mg_surface.h"
30 #include <iomanip>
31 #include "vct_outils.h"
32 #include "constantegeo.h"
33 
34 #pragma package(smart_init)
35 
36 
38 {
39  int indx_premier_ptctr;
40  TPL_LISTE_ENTITE<double> nurbs_params;
41  TPL_LISTE_ENTITE<double> param_surf;
42  elem_geo->get_param_NURBS(indx_premier_ptctr,nurbs_params);
43  int nb_points=1/4.*(nurbs_params.get_nb()-indx_premier_ptctr);
44  int nb_u=nurbs_params.get(3);
45  int nb_v=nurbs_params.get(4);
46 
47  for (int pt=0;pt< nb_points;pt++)
48  {
49  OT_VECTEUR_4DD V1;
50  V1[0]=nurbs_params.get( indx_premier_ptctr+ 4 * pt);
51  V1[1]=nurbs_params.get( indx_premier_ptctr+ 4 * pt + 1);
52  V1[2]=nurbs_params.get( indx_premier_ptctr+ 4 * pt + 2);
53  V1[3]=nurbs_params.get( indx_premier_ptctr+ 4 * pt + 3);
54  lst_points.insert(lst_points.end(),V1);
55  }
56 
57  for (int j=0;j<nb_v-1;j++)
58  for (int i=0;i<nb_u-1;i++)
59  {
60  OT_VECTEUR_4DD P1=lst_points[j*nb_u+i];
61  OT_VECTEUR_4DD P2=lst_points[j*nb_u+i+1];
62  OT_VECTEUR_4DD P3=lst_points[(j+1)*nb_u+i];
63  OT_VECTEUR_4DD V1=P2-P1;
64  if (!V1.est_nul_3d())
65  {
66  V1=V1.vecteur_norme_3d();
67  lst_vecteurs.insert(lst_vecteurs.end(),V1);
68  }
69 
70  OT_VECTEUR_4DD V2=P3-P1;
71  if (!V2.est_nul_3d())
72  {
73  V2=V2.vecteur_norme_3d();
74  lst_vecteurs.insert(lst_vecteurs.end(),V2);
75  }
76  }
77  for (int i=0;i<nb_u-1;i++)
78  {
79  OT_VECTEUR_4DD P1=lst_points[(nb_v-1)*nb_u+i];
80  OT_VECTEUR_4DD P2=lst_points[(nb_v-1)*nb_u+i+1];
81  OT_VECTEUR_4DD V1=P2-P1;
82  if (V1.est_nul_3d()) continue;
83  V1=V1.vecteur_norme_3d();
84  lst_vecteurs.insert(lst_vecteurs.end(),V1);
85  }
86  for (int i=0;i<nb_v-1;i++)
87  {
88  OT_VECTEUR_4DD P1=lst_points[i*nb_u+nb_u-1];
89  OT_VECTEUR_4DD P2=lst_points[(i+1)*nb_u+nb_u-1];
90  OT_VECTEUR_4DD V1=P2-P1;
91  if (V1.est_nul_3d()) continue;
92  V1=V1.vecteur_norme_3d();
93  lst_vecteurs.insert(lst_vecteurs.end(),V1);
94  }
95 
96  /*double2 ZERO=0.;
97  double2 INF=1e6;
98  OT_VECTEUR_4DD VCT_NUL(0.,0.,0.,0.);
99  int type=0;
100  if(((MG_SURFACE*)elem_geo)->get_type_geometrique(param_surf)==MGCo_PLAN)
101  {
102  type=1;
103  }
104  if(((MG_SURFACE*)elem_geo)->get_type_geometrique(param_surf)==MGCo_CYLINDRE)
105  {
106  type=2;
107  }
108 
109  OT_VECTEUR_4DD V1,V2,V;
110 
111  for(int pt=0;pt< nb_points;pt++)
112  {
113  V1[0]=nurbs_params.get( indx_premier_ptctr+ 4 * pt);
114  V1[1]=nurbs_params.get( indx_premier_ptctr+ 4 * pt + 1);
115  V1[2]=nurbs_params.get( indx_premier_ptctr+ 4 * pt + 2);
116  V1[3]=nurbs_params.get( indx_premier_ptctr+ 4 * pt + 3);
117  //if (pt==0) lst_points.insert(lst_points.end(),V1);
118 
119  lst_points.insert(lst_points.end(),V1);
120  if(type==2)
121  {
122  if (pt==0|| pt==3||pt==7|| pt==10)
123  {
124  lst_points_axes.insert(lst_points_axes.end(),V1);
125  }
126  }
127  if(!type||type==1)
128  {
129  lst_points_axes.insert(lst_points_axes.end(),V1);
130 
131  }
132  }
133 
134 
135 
136  if(!type||type==1)
137  for(int r=0;r<nb_v;r++)
138  {
139  for(int s=0;s<nb_u-1;s++)
140  {
141 
142  V1[0]=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * s);
143  V1[1]=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * s + 1);
144  V1[2]=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * s + 2);
145  V1[3]=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * s + 3);
146 
147 
148 
149  V2[0]=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * (s + 1));
150  V2[1]=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * (s + 1) + 1);
151  V2[2]=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * (s + 1) + 2);
152  V2[3]=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * (s + 1) + 3);
153 
154 
155 
156  V=V2-V1;
157 
158  double2 norm_au_carre=(V[0]*V[0])+(V[1]*V[1])+(V[2]*V[2])+(V[3]*V[3]);
159  double2 norm=norm_au_carre^0.5;
160 
161  if(V==VCT_NUL) {
162  lst_vecteurs.insert(lst_vecteurs.end(),VCT_NUL);
163  if(!type||type==1)
164  lst_vecteurs_axes.insert(lst_vecteurs_axes.end(),VCT_NUL);
165  }
166 
167  if(norm!=ZERO){
168  V=1./norm*V;
169  lst_vecteurs.insert(lst_vecteurs.end(),V);
170  if(!type||type==1)
171  lst_vecteurs_axes.insert(lst_vecteurs_axes.end(),V);
172  }
173 
174  }
175  }
176 
177  for(int r=0;r<nb_v-1;r++)
178  {
179  for(int s=0;s<nb_u;s++)
180  {
181  V1[0]=nurbs_params.get(indx_premier_ptctr+ r * 4 * nb_u + 4 * s);
182  V1[1]=nurbs_params.get(indx_premier_ptctr+ r * 4 * nb_u + 4 * s + 1);
183  V1[2]=nurbs_params.get(indx_premier_ptctr+ r * 4 * nb_u + 4 * s + 2);
184  V1[3]=nurbs_params.get(indx_premier_ptctr+ r * 4 * nb_u + 4 * s + 3);
185 
186 
187 
188  V2[0]=nurbs_params.get(indx_premier_ptctr+ (r+1) *4 * nb_u + 4 * s);
189  V2[1]=nurbs_params.get(indx_premier_ptctr+ (r+1) *4 * nb_u + 4 * s + 1);
190  V2[2]=nurbs_params.get(indx_premier_ptctr+ (r+1) *4 * nb_u + 4 * s + 2);
191  V2[3]=nurbs_params.get(indx_premier_ptctr+ (r+1) *4 * nb_u + 4 * s + 3);
192 
193 
194  V=V2-V1;
195 
196  double2 norm_au_carre=(V[0]*V[0])+(V[1]*V[1])+(V[2]*V[2])+(V[3]*V[3]);
197  double2 norm=norm_au_carre^0.5;
198 
199  if(V==VCT_NUL) {
200  lst_vecteurs.insert(lst_vecteurs.end(),VCT_NUL);
201  if(!type||type==1)
202  lst_vecteurs_axes.insert(lst_vecteurs_axes.end(),VCT_NUL);
203  }
204 
205  if (norm!=ZERO){
206  V=1./norm*V;
207  lst_vecteurs.insert(lst_vecteurs.end(),V);
208  if(!type||type==1)
209  lst_vecteurs_axes.insert(lst_vecteurs_axes.end(),V);
210 
211  }
212  }
213  }
214 
215  if(type==2)
216  {
217  vector<OT_VECTEUR_4DD> lst_pts;
218  lst_pts.insert(lst_pts.end(),lst_points_axes[0] ) ;
219  lst_pts.insert(lst_pts.end(),lst_points_axes[1] ) ;
220  lst_pts.insert(lst_pts.end(),lst_points_axes[3] ) ;
221  lst_pts.insert(lst_pts.end(),lst_points_axes[2] ) ;
222  for(int r=0;r<lst_pts.size();r++)
223  { OT_VECTEUR_4DD V;
224  if(r<lst_pts.size()-1)
225  V=lst_pts[r+1]-lst_pts[r];
226  if(r==lst_pts.size()-1)
227  V=lst_pts[0]-lst_pts[r];
228  double2 norm_au_carre=(V[0]*V[0])+(V[1]*V[1])+(V[2]*V[2])+(V[3]*V[3]);
229  double2 norm=norm_au_carre^0.5;
230  if(V==VCT_NUL)
231  lst_vecteurs.insert(lst_vecteurs.end(),VCT_NUL);
232  if(norm!=ZERO)
233  {
234  V=1./norm*V;
235  lst_vecteurs_axes.insert(lst_vecteurs_axes.end(),V);
236  }
237  }
238 
239  OT_VECTEUR_4DD V=lst_vecteurs_axes[1];
240  lst_vecteurs_axes[1]=lst_vecteurs_axes[2];
241  lst_vecteurs_axes[2]=V;
242 
243  }
244 
245  */
247 }
248 
249 
250 
251 
252 
253 
255 {
256 
257 }
258 
259 
261 {
262 }
263 
264 
OT_VECTEUR_4DD::vecteur_norme_3d
OT_VECTEUR_4DD vecteur_norme_3d()
Definition: ot_mathematique.cpp:1411
gestionversion.h
VCT::lst_points
std::vector< OT_VECTEUR_4DD > lst_points
Definition: vct.h:61
MG_SURFACE
Definition: mg_surface.h:31
MG_ELEMENT_GEOMETRIQUE::get_param_NURBS
virtual void get_param_NURBS(int &indx_premier_ptctr, TPL_LISTE_ENTITE< double > &param)=0
mg_surface.h
VCT_SURFACE::~VCT_SURFACE
virtual ~VCT_SURFACE()
Definition: vct_surface.cpp:260
VCT_ELEMENT_GEOMETRIQUE::elem_geo
MG_ELEMENT_GEOMETRIQUE * elem_geo
Definition: vct_element_geometrique.h:48
vct_outils.h
VCT::construire_forme_tensorielle
void construire_forme_tensorielle(void)
Definition: vct.cpp:62
V2
bool V2(MCBody *_mcBody, MG_ELEMENT_TOPOLOGIQUE *topo)
Definition: CAD4FE_MCBody.cpp:804
vct_surface.h
VCT_SURFACE::VCT_SURFACE
VCT_SURFACE(class MG_SURFACE *elemgeo)
Definition: vct_surface.cpp:37
constantegeo.h
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
VCT::lst_vecteurs
std::vector< OT_VECTEUR_4DD > lst_vecteurs
Definition: vct.h:62
VCT_ELEMENT_GEOMETRIQUE
Definition: vct_element_geometrique.h:37
TPL_LISTE_ENTITE< double >
OT_VECTEUR_4DD
Definition: ot_mathematique.h:284
VCT_SURFACE
Definition: vct_surface.h:39