ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/optimisation/src/sbspline.h
Revision: 199
Committed: Tue Jul 21 15:00:12 2009 UTC (15 years, 9 months ago) by picher
Content type: text/plain
File size: 29525 byte(s)
Log Message:
Projet d'optimisation

File Contents

# Content
1 // (c) 2009 Jean-Marc Drouet ************************************ sbspline.h * >
2 //
3 // ver.: 20090402
4
5 #ifndef _sbsplineh
6 #define _sbsplineh
7
8 #include "bib_0000.h"
9 #include "bib_m001.h"
10 #include "bib_m012.h"
11 #include "elig.h"
12 #include "itergs.h"
13 #include "maz.h"
14 #include "minv.h"
15 #include "mtrans.h"
16 #include "mulm.h"
17
18 #include "primitive.h"
19
20 //******************************************************************************
21 // types globaux des modules sbspline_*
22
23 class o_sbspline_com ;
24
25 typedef o_sbspline_com *ty_ptr_o_sbspline_com ;
26
27 //******************************************************************************
28 // constantes globales des modules sbspline_*
29
30 #define co_nbr_pnts_calcul_longueur (ulong) 200 // nbre de points utilisés pour le calcul de la longueur d'une B-spline
31 #define co_sbspline_com_max_it_calcul_surface (ulong) 10
32 #define co_sbspline_com_ren_normale (vifl) 1.0e+03 // o_sbspline_com::ren_normale()
33 #define co_sbspline_com_ren_rc_1 (vifl) 1.0e+03 // o_sbspline_com::ren_rc()
34 #define co_sbspline_com_ren_rc_2 (vifl) 1.0e-30 // o_sbspline_com::ren_rc()
35
36 //******************************************************************************
37 // variables globales des modules sbspline_*
38
39 // aucune
40
41 //******************************************************************************
42 // classe de base pour les classes o_sbspline_*
43
44 class o_sbspline_com : public o_primitive {
45
46 public:
47
48 //----------------------------------------------------------------------------
49 //------------------------------- ATTRIBUTS ----------------------------------
50 //----------------------------------------------------------------------------
51
52 //-- caractéristiques de la surface ------------------------------------------
53
54 int typeu; // type de surface selon u et w
55 int typew;
56 ulong k; // ordre de la surface B-spline (degré k-1 et l-1)
57 ulong l;
58 ulong m; // nbr de PC moins 1
59 ulong n;
60
61 ulong nbr_noeuds_x; // nbr de noeuds
62 ulong nbr_noeuds_y;
63 ulong nbr_PCu; // nbr de points de contrôle
64 ulong nbr_PCw;
65
66 //-- attributs concernant les paramètres u et w ------------------------------
67
68 ulong nbr_int_u; // nbr d'intervalles pour u
69 ulong nbr_int_w; // nbr d'intervalles pour w
70 vifl umax; // valeur maximale pour u
71 vifl wmax; // valeur maximale pour w
72 vifl umin; // valeur minimale pour u
73 vifl wmin; // valeur minimale pour w
74
75 //-- vecteurs et matrices ----------------------------------------------------
76
77 vifl *mM; // matrice des fonctions M
78 vifl *mN; // matrice des fonctions N
79 vifl *vPCx1; // vecteur des coord des PC selon x1
80 vifl *vPCx2; // vecteur des coord des PC selon x2
81 vifl *vPCx3; // vecteur des coord des PC selon x3
82 vifl *vx; // vecteurs des noeuds
83 vifl *vy;
84
85 vifl *ptr_Ml; // ptr dans mM vers les M d'ordre l (celles utilisées pour le calcul de la surface)
86 vifl *ptr_Nk; // ptr dans mN vers les N d'ordre k (celles utilisées pour le calcul de la surface)
87
88 //-- dimension des vecteurs et matrices (nombre de termes) -------------------
89
90 ulong dim_mM; // dimension de la matrice des fonctions M
91 ulong dim_mN; // dimension de la matrice des fonctions N
92 ulong dim_vPCx; // dimension des vecteurs des PC selon x1, x2 et x3
93 ulong dim_vx; // dimension du vecteur des noeuds
94 ulong dim_vy; // dimension du vecteur des noeuds
95
96 ulong nbr_C_mM; // nbre de colonnes de la matrice des fonctions M
97 ulong nbr_C_mN; // nbre de colonnes de la matrice des fonctions N
98 ulong nbr_L_mM; // nbre de lignes de la matrice des fonctions M
99 ulong nbr_L_mN; // nbre de lignes de la matrice des fonctions N
100
101 //----------------------------------------------------------------------------
102 //------------------------------- MÉTHODES -----------------------------------
103 //----------------------------------------------------------------------------
104
105 o_sbspline_com ( void ); // constructeur par défaut
106 virtual ~o_sbspline_com ( void ); // destructeur par défaut
107
108 //-- méthodes de définition --------------------------------------------------
109
110 virtual ty_RSLT def_prms ( ty_RSLT _typeu , // type de surface selon u et w
111 ty_RSLT _typew ,
112 ulong _k , // ordre de la surface (degré k-1 et degré l-1)
113 ulong _l ,
114 ulong _nbr_PCu , // nbre de points de contrôle spécifiés
115 ulong _nbr_PCw ,
116 vifl *_vPCx1 , // coord des PC selon x1
117 vifl *_vPCx2 , // coord des PC selon x2
118 vifl *_vPCx3 ); // coord des PC selon x3
119
120 //-- méthodes de gestion de mémoire ------------------------------------------
121
122 ty_RSLT alloc_mN_et_mM ( void );
123 ty_RSLT alloc_vPCx ( void );
124 ty_RSLT alloc_vx_et_vy ( void );
125
126 ty_RSLT desalloc_mN_et_mM ( void );
127 ty_RSLT desalloc_vPCx ( void );
128 ty_RSLT desalloc_vx_et_vy ( void );
129
130 //-- méthodes de calcul ------------------------------------------------------
131
132 ty_RSLT calcul_surface_v1 ( ulong _nbr_u , // nbre de coord u
133 ulong _nbr_w , // nbre de coord w
134
135 vifl *_vu , // vecteur des valeurs de u associées aux points (si NULL, on ne s'en occupe pas)
136 vifl *_vw , // vecteur des valeurs de w associées aux points (si NULL, on ne s'en occupe pas)
137 vifl *_vPx1 , // vecteur des coord des points selon x1
138 vifl *_vPx2 , // vecteur des coord des points selon x2
139 vifl *_vPx3 ); // vecteur des coord des points selon x3
140
141 ty_RSLT calcul_surface_v2 ( ulong _nbr_u , // nbre de coord u
142 ulong _nbr_w , // nbre de coord w
143 vifl *_u1 , // on commence à u = u1
144 vifl *_u2 , // on termine à u = u2
145 vifl *_w1 , // on commence à w = w1
146 vifl *_w2 , // on termine à w = w2
147
148 vifl *_vu , // vecteur des coord u associées aux points (si NULL, on ne s'en occupe pas)
149 vifl *_vw , // vecteur des coord w associées aux points (si NULL, on ne s'en occupe pas)
150 vifl *_vPx1 , // vecteur des coord des points selon x1
151 vifl *_vPx2 , // vecteur des coord des points selon x2
152 vifl *_vPx3 ); // vecteur des coord des points selon x3
153
154 ty_RSLT calcul_surface_v1_u ( ulong _nbr_u , // nbre de coord u
155 ulong _nbr_w , // nbre de coord w
156
157 vifl *_vu , // vecteur des valeurs de u associées aux points (si NULL, on ne s'en occupe pas)
158 vifl *_vw , // vecteur des valeurs de w associées aux points (si NULL, on ne s'en occupe pas)
159 vifl *_vPx1 , // vecteur des coord des points selon x1
160 vifl *_vPx2 , // vecteur des coord des points selon x2
161 vifl *_vPx3 ); // vecteur des coord des points selon x3
162
163 ty_RSLT calcul_surface_v2_u ( ulong _nbr_u , // nbre de coord u
164 ulong _nbr_w , // nbre de coord w
165 vifl *_u1 , // on commence à u = u1
166 vifl *_u2 , // on termine à u = u2
167 vifl *_w1 , // on commence à w = w1
168 vifl *_w2 , // on termine à w = w2
169
170 vifl *_vu , // vecteur des coord u associées aux points (si NULL, on ne s'en occupe pas)
171 vifl *_vw , // vecteur des coord w associées aux points (si NULL, on ne s'en occupe pas)
172 vifl *_vPx1 , // vecteur des coord des points selon x1
173 vifl *_vPx2 , // vecteur des coord des points selon x2
174 vifl *_vPx3 ); // vecteur des coord des points selon x3
175
176 ty_RSLT calcul_surface_v1_w ( ulong _nbr_u , // nbre de coord u
177 ulong _nbr_w , // nbre de coord w
178
179 vifl *_vu , // vecteur des valeurs de u associées aux points (si NULL, on ne s'en occupe pas)
180 vifl *_vw , // vecteur des valeurs de w associées aux points (si NULL, on ne s'en occupe pas)
181 vifl *_vPx1 , // vecteur des coord des points selon x1
182 vifl *_vPx2 , // vecteur des coord des points selon x2
183 vifl *_vPx3 ); // vecteur des coord des points selon x3
184
185 ty_RSLT calcul_surface_v2_w ( ulong _nbr_u , // nbre de coord u
186 ulong _nbr_w , // nbre de coord w
187 vifl *_u1 , // on commence à u = u1
188 vifl *_u2 , // on termine à u = u2
189 vifl *_w1 , // on commence à w = w1
190 vifl *_w2 , // on termine à w = w2
191
192 vifl *_vu , // vecteur des coord u associées aux points (si NULL, on ne s'en occupe pas)
193 vifl *_vw , // vecteur des coord w associées aux points (si NULL, on ne s'en occupe pas)
194 vifl *_vPx1 , // vecteur des coord des points selon x1
195 vifl *_vPx2 , // vecteur des coord des points selon x2
196 vifl *_vPx3 ); // vecteur des coord des points selon x3
197
198 ty_RSLT calcul_mN_et_mM ( ulong _mu , // intervalle no absolu mu pour u
199 ulong _mw , // intervalle no absolu mu pour w
200 vifl *_u0 , // calcul effectué à la position (u0, w0)
201 vifl *_w0 );
202
203 virtual ty_RSLT calcul_PC ( ulong _nbr_Pu , // nbre de points sur la surface selon u
204 ulong _nbr_Pw , // nbre de points sur la surface selon w
205
206 vifl *_vPx1 , // vecteur des coord des points sur la surface selon x1
207 vifl *_vPx2 , // vecteur des coord des points sur la surface selon x2
208 vifl *_vPx3 , // vecteur des coord des points sur la surface selon x3
209 vifl *_vu , // vecteur de la valeur du paramètre u associée aux points sur la surface
210 vifl *_vw ) = 0; // vecteur de la valeur du paramètre w associée aux points sur la surface
211
212 ty_RSLT calcul_longueur_u ( ulong _nbr_pnts , // nbre points utilisés pour le calcul
213 vifl *_w ,
214
215 vifl *_longueur ); // longueur totale de la B-spline selon u
216
217 ty_RSLT calcul_longueur_w ( ulong _nbr_pnts , // nbre points utilisés pour le calcul
218 vifl *_u ,
219
220 vifl *_longueur ); // longueur totale de la B-spline selon u
221
222 ty_RSLT calcul_longueur_u ( vifl *_u1 , // on commence à u = u1
223 vifl *_u2 , // on termine à u = u2
224 vifl *_w ,
225 ulong _nbr_pnts , // nbre points utilisés pour le calcul
226
227 vifl *_longueur ); // longueur de la B-spline entre u=u1 et u=u2
228
229 ty_RSLT calcul_longueur_w ( vifl *_w1 , // on commence à w = w1
230 vifl *_w2 , // on termine à w = w2
231 vifl *_u ,
232 ulong _nbr_pnts , // nbre points utilisés pour le calcul
233
234 vifl *_longueur ); // longueur de la B-spline entre w=w1 et w=w2
235
236 ty_RSLT calcul_point ( vifl *_u , // coordonnées u et w
237 vifl *_w ,
238
239 vifl *_x1 , // x1(u, w)
240 vifl *_x2 , // x2(u, w)
241 vifl *_x3 ); // x3(u, w)
242
243 virtual ty_RSLT calcul_vx_et_vy ( void ) = 0;
244
245 //-- méthodes d'accès --------------------------------------------------------
246
247 ty_RSLT ren_normale ( vifl *_t , // valeur du paramètre t à la position où on veut la normale
248
249 vifl *_n1 , // composante de la normale unitaire selon x1 -> n1(t)
250 vifl *_n2 ); // composante de la normale unitaire selon x2 -> n2(t)
251
252 ty_RSLT ren_rc ( vifl *_t , // valeur du paramètre t à la position où on veut le rayon de courbure
253
254 vifl *_rc ); // rayon de courbure
255
256 ty_RSLT ect_mM ( ulong _lig , // ligne (base 1)
257 ulong _col , // colonne (base 1)
258 vifl *_N );
259
260 ty_RSLT ect_mN ( ulong _lig , // ligne (base 1)
261 ulong _col , // colonne (base 1)
262 vifl *_N );
263
264 ty_RSLT lct_mM ( ulong _lig , // ligne (base 1)
265 ulong _col , // colonne (base 1)
266
267 vifl *_M );
268
269 ty_RSLT lct_mN ( ulong _lig , // ligne (base 1)
270 ulong _col , // colonne (base 1)
271
272 vifl *_N );
273
274 virtual ty_RSLT lct_vx ( ulong _col , // colonne (base 1)
275
276 vifl *_x );
277
278 virtual ty_RSLT lct_vy ( ulong _col , // colonne (base 1)
279
280 vifl *_y );
281
282 ty_RSLT ren_bornes_u ( vifl *_umin ,
283 vifl *_umax );
284
285 ty_RSLT ren_bornes_w ( vifl *_wmin ,
286 vifl *_wmax );
287
288 ty_RSLT ren_nbr_PC ( ulong *_nbr_PCu , // nombre de point de contrôle
289 ulong *_nbr_PCw );
290
291 virtual ty_RSLT def_PC ( ulong _no_PC , // numéro du point de contrôle (base 1)
292 vifl *_PCx1 , // coordonnée du point de contrôle selon x1
293 vifl *_PCx2 ) = 0; // coordonnée du point de contrôle selon x2
294
295 virtual ty_RSLT ren_PC ( ulong _no_PC , // numéro du point de contrôle (base 1)
296 vifl *_PCx1 , // coordonnée du point de contrôle selon x1
297 vifl *_PCx2 ) = 0; // coordonnée du point de contrôle selon x2
298
299 //-- autres méthodes ---------------------------------------------------------
300
301 ty_RSLT trouve_mu ( vifl *_u0 , // u = u0
302
303 ulong *_mu ); // no absolu mu de l'intervalle pour u (base 1)
304
305 ty_RSLT trouve_mw ( vifl *_w0 , // w = w0
306
307 ulong *_mw ); // no absolu mu de l'intervalle pour w (base 1)
308
309 ty_RSLT ecriture ( char *_nom_fic ,
310 ulong _nbr_pnts );
311
312 ty_RSLT ecriture_PolyCtrl_dx ( char *_fic ); // nom du fichier
313
314 ty_RSLT ecriture_surface_dx ( char *_fic , // nom du fichier
315 ulong _nbr_u , // nbre de coord u
316 ulong _nbr_w , // nbre de coord w
317 vifl *_vPx1 , // vecteur des coord des points selon x1
318 vifl *_vPx2 , // vecteur des coord des points selon x2
319 vifl *_vPx3 ); // vecteur des coord des points selon x3
320
321 //-- méthodes d'affichage en mode console ------------------------------------
322
323 ty_RSLT affiche_coord_PC ( void );
324
325 };
326
327 //******************************************************************************
328 // classe o_sbspline_ouv - surface B-spline ouverte
329
330 class o_sbspline_ouv : public o_sbspline_com {
331
332 public:
333
334 o_sbspline_ouv ( void ); // constructeur par défaut
335 ~o_sbspline_ouv ( void ); // destructeur par défaut
336
337 //-- méthodes de définition --------------------------------------------------
338
339 virtual ty_RSLT def_prms ( ty_RSLT _typeu , // type de surface selon u et w
340 ty_RSLT _typew ,
341 ulong _k , // ordre de la surface (degré k-1 et degré l-1)
342 ulong _l ,
343 ulong _nbr_PCu , // nbre de points de contrôle spécifiés
344 ulong _nbr_PCw ,
345 vifl *_vPCx1 , // coord des PC selon x1
346 vifl *_vPCx2 , // coord des PC selon x2
347 vifl *_vPCx3 ); // coord des PC selon x3
348
349 //-- méthodes de calcul ------------------------------------------------------
350
351 ty_RSLT calcul_PC ( ulong _nbr_Pu , // nbre de points sur la surface selon u
352 ulong _nbr_Pw , // nbre de points sur la surface selon w
353
354 vifl *_vPx1 , // vecteur des coord des points sur la surface selon x1
355 vifl *_vPx2 , // vecteur des coord des points sur la surface selon x2
356 vifl *_vPx3 , // vecteur des coord des points sur la surface selon x3
357 vifl *_vu , // vecteur de la valeur du paramètre u associée aux points sur la surface
358 vifl *_vw ); // vecteur de la valeur du paramètre w associée aux points sur la surface
359
360 ty_RSLT calcul_vx_et_vy ( void );
361
362 //-- méthodes d'accès --------------------------------------------------------
363
364 ty_RSLT def_PC ( ulong _no_PC , // numéro du point de contrôle (base 1)
365 vifl *_PCx1 , // coordonnée du point de contrôle selon x1
366 vifl *_PCx2 ); // coordonnée du point de contrôle selon x2
367
368 ty_RSLT ren_PC ( ulong _no_PC , // numéro du point de contrôle (base 1)
369 vifl *_PCx1 , // coordonnée du point de contrôle selon x1
370 vifl *_PCx2 ); // coordonnée du point de contrôle selon x2
371
372 };
373
374 //******************************************************************************
375 // classe o_sbspline_fermee - surface B-spline fermée
376
377 class o_sbspline_fermee : public o_sbspline_com {
378
379 public:
380
381 o_sbspline_fermee ( void ); // constructeur par défaut
382 ~o_sbspline_fermee ( void ); // destructeur par défaut
383
384 //-- méthodes de définition --------------------------------------------------
385
386 virtual ty_RSLT def_prms ( ty_RSLT _typeu , // type de surface selon u et w
387 ty_RSLT _typew ,
388 ulong _k , // ordre de la surface (degré k-1 et degré l-1)
389 ulong _l ,
390 ulong _nbr_PCu , // nbre de points de contrôle spécifiés
391 ulong _nbr_PCw ,
392 vifl *_vPCx1 , // coord des PC selon x1
393 vifl *_vPCx2 , // coord des PC selon x2
394 vifl *_vPCx3 ); // coord des PC selon x3
395
396 //-- méthodes de calcul ------------------------------------------------------
397
398 ty_RSLT calcul_PC ( ulong _nbr_Pu , // nbre de points sur la surface selon u
399 ulong _nbr_Pw , // nbre de points sur la surface selon w
400
401 vifl *_vPx1 , // vecteur des coord des points sur la surface selon x1
402 vifl *_vPx2 , // vecteur des coord des points sur la surface selon x2
403 vifl *_vPx3 , // vecteur des coord des points sur la surface selon x3
404 vifl *_vu , // vecteur de la valeur du paramètre u associée aux points sur la surface
405 vifl *_vw ); // vecteur de la valeur du paramètre w associée aux points sur la surface
406
407 ty_RSLT calcul_vx_et_vy ( void );
408
409 //-- méthodes d'accès --------------------------------------------------------
410
411 ty_RSLT def_PC ( ulong _no_PC , // numéro du point de contrôle (base 1)
412 vifl *_PCx1 , // coordonnée du point de contrôle selon x1
413 vifl *_PCx2 ); // coordonnée du point de contrôle selon x2
414
415 ty_RSLT ren_PC ( ulong _no_PC , // numéro du point de contrôle (base 1)
416 vifl *_PCx1 , // coordonnée du point de contrôle selon x1
417 vifl *_PCx2 ); // coordonnée du point de contrôle selon x2
418
419 };
420
421 #endif

Properties

Name Value
svn:executable