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

File Contents

# Content
1 // (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