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

File Contents

# User Rev Content
1 picher 199 // (c) 2008 Jean-Marc Drouet ************************************ bib_m001.h * >
2     //
3     // rév.: 20081116
4    
5     #ifndef _bib_m001h
6     #define _bib_m001h
7    
8     #include<math.h>
9    
10     #include "bib_0000.h"
11     #include "bib_m000.h"
12    
13     //******************************************************************************
14     // types globaux du module bib_m001
15    
16     //******************************************************************************
17     // constantes globales du module bib_m001
18    
19     #define co_m001_max_n_facto (ulong) 1754
20    
21     //-- dérivation approchée ------------------------------------------------------
22    
23     #define co_m001_deriv_5_pnts_type_1 (ty_RSLT) 1
24     #define co_m001_deriv_5_pnts_type_2 (ty_RSLT) 2
25     #define co_m001_deriv_5_pnts_type_3 (ty_RSLT) 3
26     #define co_m001_deriv_5_pnts_type_4 (ty_RSLT) 4
27     #define co_m001_deriv_5_pnts_type_5 (ty_RSLT) 5
28    
29     //-- vérification de l'intersection de 2 segments de droite --------------------
30    
31     #define co_m001_sur_seg_no_1 1
32     #define co_m001_sur_seg_no_2 2
33     #define co_m001_seg_identiques 4
34     #define co_m001_seg_par 8
35     #define co_m001_seg_par_hor 16
36     #define co_m001_seg_par_ver 32
37     #define co_m001_ext_commune 64
38    
39     //******************************************************************************
40     // variables globales du module bib_m001
41    
42     //******************************************************************************
43     //
44     // vérification du chevauchement de 2 nombres
45     //
46     // resultat = co_oui s'il y a chevauchement
47     // resultat = co_non sinon
48     // h
49    
50     ty_RSLT verif_chev( vifl *_A , // nombre no 1
51     vifl *_B , // nombre no 2
52     ulong _m , // nombre de chiffres utilisés pour la représentation de A et B
53    
54     ty_RSLT *_resultat , // résultat de la vérification
55     ulong *_r ); // nombre de chiffres se chevauvant
56    
57     //******************************************************************************
58     //
59     // fontion permettant de calculer l'angle p/r à x1 de la bissectrice de l'angle
60     // entre 2 segments de droite (à gauche du trajet de a -> b -> c)
61     // h
62    
63     ty_RSLT angle_bsd_2d( vifl *_x1a , vifl *_x2a , // coord du point a
64     vifl *_x1b , vifl *_x2b , // coord du point b
65     vifl *_x1c , vifl *_x2c , // coord du point c
66     vifl *_beta ); // angle beta
67    
68     //******************************************************************************
69     //
70     // fontion permettant de calculer l'angle entre 2 segments de droite
71     // (à gauche du trajet de a -> b -> c)
72     // h
73    
74     ty_RSLT angle_sd_2d( vifl *_x1a , vifl *_x2a , // coord du point a
75     vifl *_x1b , vifl *_x2b , // coord du point b
76     vifl *_x1c , vifl *_x2c , // coord du point c
77     vifl *_gamma ); // angle gamma
78    
79     //******************************************************************************
80     // carré de x >
81    
82     inline vifl car( vifl _x ) {
83    
84     #ifndef _32x387_
85    
86     return( _x * _x );
87    
88     #else
89    
90     return( _x * _x );
91     /*
92     asm {
93    
94     fld tbyte ptr _x
95     fmul st(0), st(0)
96    
97     }
98     */
99     #endif
100    
101     }
102    
103     inline vifl car( vifl *_x ) {
104    
105     #ifndef _32x387_
106    
107     return( *_x * *_x );
108    
109     #else
110    
111     return( *_x * *_x );
112     /*
113     asm {
114    
115     fld tbyte ptr _x
116     fmul st(0), st(0)
117    
118     }
119     */
120     #endif
121    
122     }
123    
124     // car( ) <
125     //******************************************************************************
126    
127     //******************************************************************************
128     //
129     // cube de x
130     // >
131    
132     inline vifl cub( vifl _x ) {
133    
134     return( _x * _x * _x );
135    
136     }
137    
138     // cub( ) <
139     //******************************************************************************
140    
141     //******************************************************************************
142     //
143     // cube de x
144     // >
145    
146     inline vifl cub( vifl *_x ) {
147    
148     return( *_x * *_x * *_x );
149    
150     }
151    
152     // cub( ) <
153     //******************************************************************************
154    
155     //******************************************************************************
156     //
157     // racine cubique de x
158     // >
159    
160     inline vifl rcub( vifl _x ) {
161    
162     if( _x < (vifl) 0.0 ) {
163    
164     return( (vifl) -1.0 * powl( _x, co_1_3 ) );
165    
166     }
167     else {
168    
169     return( powl( _x, co_1_3 ) );
170    
171     }
172    
173     }
174    
175     // rcub( ) <
176     //******************************************************************************
177    
178     //******************************************************************************
179     //
180     // racine cubique de x
181     // >
182    
183     inline vifl rcub( vifl *_x ) {
184    
185     if( *_x < (vifl) 0.0 ) {
186    
187     return( (vifl) -1.0 * powl( *_x, co_1_3 ) );
188    
189     }
190     else {
191    
192     return( powl( *_x, co_1_3 ) );
193    
194     }
195    
196     }
197    
198     // rcub( ) <
199     //******************************************************************************
200    
201     //******************************************************************************
202     // écart relatif en % entre deux nombres >
203    
204     inline vifl ecart_rel( vifl *_x1, vifl *_x2 ) {
205    
206     return( ( ( *_x1 - *_x2 ) / *_x1 ) * (vifl) 100.0 );
207    
208     }
209    
210     // ecart_rel <
211     //******************************************************************************
212    
213     //******************************************************************************
214     // si x2-epsilon <= x1 <= x2+epsilon : renvoie co_oui sinon renvoie co_non >
215    
216     inline ty_RSLT egal( vifl _x1, vifl _x2, vifl _epsilon ) {
217    
218     if( ( _x1 >= ( _x2 - _epsilon ) ) &&
219     ( _x1 <= ( _x2 + _epsilon ) ) ) {
220    
221     return( co_oui );
222    
223     }
224     else {
225    
226     return( co_non );
227    
228     }
229    
230     }
231    
232     inline ty_RSLT egal( vifl *_x1, vifl *_x2, vifl *_epsilon ) {
233    
234     if( ( *_x1 >= ( *_x2 - *_epsilon ) ) &&
235     ( *_x1 <= ( *_x2 + *_epsilon ) ) ) {
236    
237     return( co_oui );
238    
239     }
240     else {
241    
242     return( co_non );
243    
244     }
245    
246     }
247    
248     // ecart_rel <
249     //******************************************************************************
250    
251     //******************************************************************************
252     //
253     // fontion permettant de déplacer un segment de droite selon sa normale
254     // (à droite ou à gauche du trajet de a -> b)
255     // h
256    
257     ty_RSLT depla_sd_2d( vifl *_x1a_i , vifl *_x2a_i , // coord initales du point a
258     vifl *_x1b_i , vifl *_x2b_i , // coord initales du point b
259     vifl *_delta , // écart entre les segments selon la normale
260     ty_RSLT _cote , // côté droit ou gauche
261     vifl *_x1a_f , vifl *_x2a_f , // coord finales du point a
262     vifl *_x1b_f , vifl *_x2b_f ); // coord finales du point b
263    
264     //******************************************************************************
265     //
266     // dérivation approchée - formule à 5 points
267     //
268     // formule 1 : dy(x0)/dx = (-25y0 + 48y1 - 36y2 + 16y3 - 3y4) / 3 / (x4 - x0)
269     //
270     // formule 2 : dy(x1)/dx = ( -3y0 - 10y1 + 18y2 - 6y3 + y4) / 3 / (x4 - x0)
271     //
272     // formule 3 : dy(x2)/dx = ( y0 - 8y1 + 8y3 - y4) / 3 / (x4 - x0)
273     //
274     // formule 4 : dy(x3)/dx = ( -y0 + 6y1 - 18y2 + 10y3 + 3y4) / 3 / (x4 - x0)
275     //
276     // formule 5 : dy(x4)/dx = ( 3y0 - 16y1 + 36y2 - 48y3 + 25y4) / 3 / (x4 - x0)
277     // h
278    
279     ty_RSLT deriv_5_pnts( vifl *_x0 ,
280     vifl *_x4 ,
281     vifl *_y0 , // valeur de la fonction à x0
282     vifl *_y1 , // valeur de la fonction à x1
283     vifl *_y2 , // valeur de la fonction à x2
284     vifl *_y3 , // valeur de la fonction à x3
285     vifl *_y4 , // valeur de la fonction à x4
286     ty_RSLT _type , // type de formule à utiliser
287    
288     vifl *_deriv ); // valeur de la dérivée
289    
290     //******************************************************************************
291     //
292     // distance euclidienne entre 2 points (2D)
293     // >
294    
295     inline vifl dist( vifl *_x1a , vifl *_x2a , // 1er point
296     vifl *_x1b , vifl *_x2b ) { // 2e point
297    
298     return( sqrtl( (*_x1a - *_x1b) * (*_x1a - *_x1b) +
299     (*_x2a - *_x2b) * (*_x2a - *_x2b) ) );
300    
301     }
302    
303     //******************************************************************************
304     //
305     // distance euclidienne entre 2 points (3D)
306     // >
307    
308     inline vifl dist( vifl *_x1a , vifl *_x2a , vifl *_x3a , // 1er point
309     vifl *_x1b , vifl *_x2b , vifl *_x3b ) { // 2e point
310    
311     return( sqrtl( (*_x1a - *_x1b) * (*_x1a - *_x1b) +
312     (*_x2a - *_x2b) * (*_x2a - *_x2b) +
313     (*_x3a - *_x3b) * (*_x3a - *_x3b) ) );
314    
315     }
316    
317     //******************************************************************************
318     //
319     // distance miniale séparant un point P d'un segment de droite dans le
320     // plan x1-x2
321     // h
322    
323     vifl distmin_point_sd_2d( vifl *_x1P , vifl *_x2P , // point P
324     vifl *_x1a , vifl *_x2a , // 1er extrémité du segment de droite
325     vifl *_x1b , vifl *_x2b ); // 2e extrémité du segment de droite
326    
327     //******************************************************************************
328     //
329     // vérifie si un nombre est pair
330     // >
331    
332     inline ty_RSLT est_pair( ulong _x ) {
333    
334     if( ( ( _x >> 1 ) << 1 ) == _x ) { return( co_oui ); }
335    
336     return(co_non);
337    
338     }
339    
340     // est_pair( ) <
341     //******************************************************************************
342    
343     //******************************************************************************
344     //
345     // fonction factorielle: facto = _n! o— _n = 0, 1, 2, 3, ... , 1754
346     // h
347    
348     vifl facto( uint _n );
349    
350     //******************************************************************************
351     //
352     // fonction factorielle: facto = _n! o— _n = 0, 1, 2, 3, ... , 1754
353     // h
354    
355     vifl facto_x387( uint _n );
356    
357     //******************************************************************************
358     //
359     // fontion permettant de savoir si un point P est à droite ou à gauche d'un
360     // trajet allant d'un point a vers un point b (ou sur ce dernier)
361     // h
362    
363     ty_RSLT trajet_dg_2d( vifl *_x1P , vifl *_x2P , // point P
364     vifl *_x1a , vifl *_x2a , // 1er extrémité du trajet
365     vifl *_x1b , vifl *_x2b ); // 2e extrémité du trajet
366    
367     //******************************************************************************
368     //
369     // point d'intersection de 2 segments de droite (sd) dans le plan
370     // h
371    
372     ty_RSLT pnt_intrsc_sd( vifl *_x1a , // coord de la 1ère extrémité du 1er segment
373     vifl *_x2a ,
374     vifl *_x1b , // coord de la 2e extrémité du 1er segment
375     vifl *_x2b ,
376     vifl *_x1c , // coord de la 1ère extrémité du 2e segment
377     vifl *_x2c ,
378     vifl *_x1d , // coord de la 2e extrémité du 2e segment
379     vifl *_x2d ,
380    
381     ty_RSLT *_resultat ,
382     vifl *_x1i , // coord du point d'intersection des 2 segments ou de leur prolongement
383     vifl *_x2i );
384    
385     //******************************************************************************
386     //
387     // maximum parmi deux nombres
388     // >
389    
390     inline int maxi( int _x1, int _x2 ) {
391    
392     if( _x1 > _x2 ) { return( _x1 ); }
393    
394     return( _x2 );
395    
396     }
397    
398     inline uint maxi( uint _x1, uint _x2 ) {
399    
400     if(_x1 > _x2) { return( _x1 ); }
401    
402     return(_x2);
403    
404     }
405    
406     inline ulong maxi( ulong _x1, ulong _x2 ) {
407    
408     if( _x1 > _x2 ) { return( _x1 ); }
409    
410     return( _x2 );
411    
412     }
413    
414     inline vifl maxi( vifl *_x1, vifl *_x2 ) {
415    
416     if( *_x1 > *_x2 ) { return( *_x1 ); }
417    
418     return( *_x2 );
419    
420     }
421    
422     //******************************************************************************
423     //
424     // minimum parmi deux nombres
425     // >
426    
427     inline int mini( int _x1, int _x2 ) {
428    
429     if( _x1 < _x2 ) { return( _x1 ); }
430    
431     return( _x2 );
432    
433     }
434    
435     inline uint mini( uint _x1, uint _x2 ) {
436    
437     if( _x1 < _x2 ) { return( _x1 ); }
438    
439     return( _x2 );
440    
441     }
442    
443     inline ulong mini( ulong _x1, ulong _x2 ) {
444    
445     if( _x1 < _x2 ) { return( _x1 ); }
446    
447     return( _x2 );
448    
449     }
450    
451     inline vifl mini( vifl _x1, vifl _x2 ) {
452    
453     if( _x1 < _x2 ) { return( _x1 ); }
454    
455     return( _x2 );
456    
457     }
458    
459     inline vifl mini( vifl *_x1, vifl *_x2 ) {
460    
461     if( *_x1 < *_x2 ) { return( *_x1 ); }
462    
463     return( *_x2 );
464    
465     }
466    
467     // double mini( double _x1, double _x2 );
468     //
469     // double mini( double *_x1, double *_x2 );
470    
471     //******************************************************************************
472     //
473     // fontion permettant de calculer les coordonnées de points uniformément
474     // répartis sur un segment de droite
475     // h
476    
477     ty_RSLT points_sd_2d( vifl *_x1a , vifl *_x2a , // coord du point a
478     vifl *_x1b , vifl *_x2b , // coord du point b
479     ulong _nbr_points , // nbre de points désirés
480    
481     vifl *_vx1 , vifl *_vx2 ); // vecteurs des coord des points
482    
483     //******************************************************************************
484     //
485     // produit de n termes avec la valeur de départ vd et l'incrément inc
486     // h
487    
488     vifl produit(uint _n, vifl _vd, vifl _inc);
489    
490     //******************************************************************************
491     //
492     // produit de n termes avec la valeur de départ vd et l'incrément inc
493     // h
494    
495     // vifl produit_x387(uint _n, vifl _vd, vifl _inc) {
496    
497     #endif
498    
499     // (c) 2008 Jean-Marc Drouet ************************************ bib_m001.h * <

Properties

Name Value
svn:executable