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 |