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, 10 months ago) by picher
Content type: text/plain
File size: 29525 byte(s)
Log Message:
Projet d'optimisation

File Contents

# User Rev Content
1 picher 199 // (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