/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S P O U R L E S F O N C T I O N S D E G E N E R A T I O N S A L A T O I R E S : */
/* */
/* */
/* Definition : */
/* */
/* Ce fichier contient toutes les definitions */
/* necessaires pour les generations des champs */
/* fractals. */
/* */
/* */
/* Author of '$xiii/aleat.2$vv$DEF' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19880000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S D I F F E R E N T E S I N T E R P O L A T I O N S : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E L ' I N T E R P O L A T I O N L I N E A I R E : */
/* */
/* */
/* Interpolation bi-lineaire (avec un seul niveau d'iteration dans l'image ci-dessous) : */
/* */
/* */
/* ##*********oooooooo++++++++++++++++++++++++++++++++++++++ooooooo */
/* ##*******oooooo+++++++---------------++++++++++++++++++ooooooooo */
/* #******oooooo++++++------::------------++++++++++++ooooooooooo** */
/* #*****ooooo+++++-----:::::::::::--------++++++++oooooooooooo**** */
/* *****oooo+++++----:::::......::::::-----++++++ooooooooo********* */
/* ****oooo++++----::::.... ....:::::----+++++oooo*************** */
/* ****ooo++++----:::.... ....::::----+++oooo**************** */
/* **ooooo++++----::::.... .....::::----++++oooo*************** */
/* *ooooo++++-----:::::.... .....:::::-----++++ooooooooooo******* */
/* oooo++++++-----::::::..........::::::-----++++++oooooooooooooooo */
/* ooo++++++-------::::::.......:::::::--------+++++++ooooooooooooo */
/* ++++++++--------::::::::...:::::::::---------++++++++++++ooooooo */
/* ++++++-----------:::::::::::::::::::-------------++++++++++++ooo */
/* +++----------------:::::::::::::::-------------------++++++++++o */
/* -------------------------::------------------------------+++++++ */
/* --------------------------------------------:::::::--------+++++ */
/* ----------------------------------------::::::::::::::-------+++ */
/* :::::::-----------------+++------------::::::::::::::::::------+ */
/* :::::::::-----------++++++++++---------::::::::......::::::----- */
/* ::::::::---------+++++++++++++++--------::::::::.....:::::------ */
/* :::-----------+++++++++++o+++++++++--------:::::::::::::-------+ */
/* ----------++++++++++++ooooooo+++++++++---------::::::-------++++ */
/* -----+++++++++++++ooooooooooooo++++++++++-----------------++++++ */
/* +++++++++++++oooooooooooooooooooooo++++++++++----------++++++++o */
/* ++++++++oooooooooooooooo***ooooooooooo++++++++++++-+++++++++oooo */
/* +oooooooooooooooooo***********ooooooooooooo++++++++++++++ooooooo */
/* oooooooooooo**********************ooooooooooooooo+++oooooooooooo */
/* oooo************************************oooooooooooooooooooo**** */
/* *********************#######******************oooooooo********** */
/* *********#########################****************************** */
/* ###########################################****************##### */
/* ################################################################ */
/* */
/*************************************************************************************************************************************/
#define INTERPOLATION_LINEAIRE(fonction_origine,fonction_extremite,coordonnee_barycentrique) \
BARY(fonction_origine,fonction_extremite,coordonnee_barycentrique) \
/* Definition de la fonction d'interpolation lineaire : */ \
/* */ \
/* Y ^ */ \
/* | */ \
/* | */ \
/* fE |........................+ B */ \
/* | + . */ \
/* | + . */ \
/* | + . */ \
/* | + . */ \
/* fO |........ + . */ \
/* | A. . */ \
/* | . . */ \
/* | . . */ \
/* | . . */ \
/* |------------------------------------------------------> */ \
/* O t=0 t=1 X */ \
/* */ \
/* on cherche donc un polynome du premier degre passant par A(fO) et B(fE) ; il vaut : */ \
/* */ \
/* (fE-fO) */ \
/* P(t) = ---------.t + fO */ \
/* L */ \
/* */ \
/* avec ici : */ \
/* */ \
/* L=1-0=1 (amplitude de 't')... */ \
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E L ' I N T E R P O L A T I O N C U B I Q U E : */
/* */
/* */
/* Interpolation bi-cubique (avec un seul niveau d'iteration dans l'image ci-dessous) : */
/* */
/* */
/* #####*******oooooo++++++++-------------------------+++++++ooooo* */
/* ###******ooooo+++++-------------------------++++++++++ooooooo*** */
/* ##******oooo+++-----::::::::::::::::------+++++++oooooooooo***** */
/* #******ooo+++----::::...........:::::-----++++oooooooo********** */
/* ******ooo+++---:::..... .....::::---++++ooooo************** */
/* *****ooo+++---:::... ....:::---++++oooo*************** */
/* ****oooo+++--:::... ....:::--+++oooo**************** */
/* ***oooo+++---:::... ....:::---+++oooo*************** */
/* oooooo+++---:::.... ....:::---+++ooooo************** */
/* oooo+++++---:::.... ....:::----++++oooooooo********* */
/* o+++++++----::::..... .....::::----+++++ooooooooooooooo */
/* ++++++-----:::::........ ........::::::-----+++++++++ooooooooo */
/* ++---------:::::::................::::::::--------++++++++++++oo */
/* ----------::::::::::::::....::::::::::::::::::-----------+++++++ */
/* -----::::::::::::::::::::::::::::::::::::::::::::::::--------+++ */
/* :::::::::::::::::--------:--:::::::::::::::::::::::::::::------- */
/* :::::::::::::---------------------::::::::::........::::::::---- */
/* :::::::::::-------------------------:::::::............::::::--- */
/* :::::::::::-------+++++++++++++------::::::.............::::::-- */
/* ::::::::::------++++++++++++++++------:::::.............:::::--- */
/* ::::::::------++++++++++++++++++++-----::::::..........::::::--- */
/* :::::-------++++++++oooooooooo++++++-----::::::::::::::::::----- */
/* ---------+++++++oooooooooooooooo++++++------::::::::::::------++ */
/* ----++++++++oooooooooooo**ooooooooo++++++-------------------++++ */
/* ++++++++oooooooooo************oooooooo+++++++-----------+++++++o */
/* ++oooooooooo**********************oooooooo+++++++++++++++++ooooo */
/* ooooo********************************oooooooooooo+++ooooooooooo* */
/* *************#################************ooooooooooooooooo***** */
/* *****#############################****************************** */
/* *#####################################************************## */
/* ##########################################****************###### */
/* ############################################************######## */
/* */
/*************************************************************************************************************************************/
/* Le 20101228092201, l'ordre de certains 'MUL2(...)' est passee de : */
/* */
/* MUL2(...,AMPLITUDE_DU_PARAMETRE_D_INTERPOLATION_CUBIQUE) */
/* */
/* a : */
/* */
/* MUL2(AMPLITUDE_DU_PARAMETRE_D_INTERPOLATION_CUBIQUE,...) */
/* */
/* afin que lors d'une eventuelle derivation formelle la derivee de la constante */
/* 'AMPLITUDE_DU_PARAMETRE_D_INTERPOLATION_CUBIQUE' (='d_CONSTANTES') apparaisse en premier */
/* argument d'un 'MUL2(...)' et qu'ainsi un 'MUL2(0,...)' soit facilement identifiable en */
/* vue de faire des simplifications d'expressions formelles... */
-define AMPLITUDE_DU_PARAMETRE_D_INTERPOLATION_CUBIQUE \
-_-_-_- AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES
/* Valeur de L=1-0=1 (c'est-a-dire le segment de variation des coordonnees barycentriques). */
-define INTERPOLATION_CUBIQUE_t3(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite) \
-_-_-_- DIVI(SOUS(MUL2(AMPLITUDE_DU_PARAMETRE_D_INTERPOLATION_CUBIQUE \
-_-_-_- ,ADD2(derivee_extremite,derivee_origine) \
-_-_-_- ) \
-_-_-_- ,DOUB(SOUS(fonction_extremite,fonction_origine)) \
-_-_-_- ) \
-_-_-_- ,EXP3(AMPLITUDE_DU_PARAMETRE_D_INTERPOLATION_CUBIQUE) \
-_-_-_- )
/* Definition du coefficient cubique de la fonction d'interpolation cubique... */
-define INTERPOLATION_CUBIQUE_t2(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite) \
-_-_-_- DIVI(SOUS(TRIP(SOUS(fonction_extremite,fonction_origine)) \
-_-_-_- ,MUL2(AMPLITUDE_DU_PARAMETRE_D_INTERPOLATION_CUBIQUE \
-_-_-_- ,ADD2(derivee_extremite,DOUB(derivee_origine)) \
-_-_-_- ) \
-_-_-_- ) \
-_-_-_- ,EXP2(AMPLITUDE_DU_PARAMETRE_D_INTERPOLATION_CUBIQUE) \
-_-_-_- )
/* Definition du coefficient carre de la fonction d'interpolation cubique... */
-define INTERPOLATION_CUBIQUE_t1(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite) \
-_-_-_- derivee_origine
/* Definition du coefficient lineaire de la fonction d'interpolation cubique... */
-define INTERPOLATION_CUBIQUE_t0(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite) \
-_-_-_- fonction_origine
/* Definition du coefficient constant de la fonction d'interpolation cubique... */
-define INTERPOLATION_CUBIQUE(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite,coordonnee_barycentrique) \
-_-_-_- HORNER_1_03(coordonnee_barycentrique \
-_-_-_- ,INTERPOLATION_CUBIQUE_t3(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite) \
-_-_-_- ,INTERPOLATION_CUBIQUE_t2(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite) \
-_-_-_- ,INTERPOLATION_CUBIQUE_t1(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite) \
-_-_-_- ,INTERPOLATION_CUBIQUE_t0(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite) \
-_-_-_- )
/* Definition de la fonction d'interpolation cubique : */
/* */
/* Y ^ dE */
/* | / */
/* | / */
/* fE |........................+/B */
/* | + @/. */
/* | dO + @/ . */
/* | \ + @ . */
/* | \ + @ . */
/* fO |........\+ @ . */
/* | A.\@ @ . */
/* | . \@ @ . */
/* | . @@ . */
/* | . . */
/* |------------------------------------------------------> */
/* O t=0 t=1 X */
/* */
/* on cherche donc un polynome du troisieme degre passant par A(fO) et B(fE), et */
/* ayant en ces points les derivees dO et dE ; la parametrisation a lieu a l'aide */
/* de la variable 't', et le polynome P(t) est : */
/* */
/* 3 2 1 0 */
/* P(t) = a.t + b.t + c.t + d.t */
/* */
/* avec : */
/* */
/* (dE+dO).L - 2.(fE-fO) */
/* a = ----------------------- */
/* 3 */
/* L */
/* */
/* 3.(fE-fO) - (dE+2.dO).L */
/* b = ------------------------- */
/* 2 */
/* L */
/* */
/* c = dO */
/* */
/* d = fO */
/* */
/* dans le cas qui nous interesse : L=1-0=1 (amplitude du parametre 't') et de */
/* plus, les derivees 'dE' et 'dO' doivent etre exprimees dans les memes unites */
/* que 'fE' et 'fO', c'est-a-dire [min,max] et non pas [0,1]... */
/* */
/* Le 20101202075958 fut introduit (bien tardivement) 'HORNER_1_03(...)'. */
/* Definition de la derivee de la fonction d'interpolation cubique... */
/* */
/* dP(t) 2 1 0 */
/* ------- = 3.a.t + 2.b.t + c.t */
/* dt */
/* */
/* avec 'a', 'b' et 'c' definis ci-dessus... */
/* */
/* Le 20101202075958 fut introduit (bien tardivement) 'HORNER_1_02(...)'. J'ai essaye a */
/* cette occasion d'utiliser la derivation formelle de 'INTERPOLATION_CUBIQUE(...)' mais, */
/* malheureusement, cela n'a pas marche. En fait, cela n'est pas tres grave car la procedure */
/* 'd_INTERPOLATION_CUBIQUE(...)' n'est utilisee que dans un module devenu inutile il y a */
/* bien longtemps (a savoir 'v $ximf/courbes.1$FON d_INTERPOLATION_CUBIQUE'). En fait, cela */
/* semble complique par le fait que 'd_INTERPOLATION_CUBIQUE(...)' soit reference de facon */
/* conditionnelle en '$PASSE_1'... */
/* */
/* Le probleme a ete resolu le 20101222103411 via 'v $xcp/DerivFormel$K'). La definition : */
/* */
/* #define d_INTERPOLATION_CUBIQUE(Fori,dFori,Fext,dFext,lambda) \ */
/* HORNER_1_02(lambda \ */
/* ,TRIP(INTERPOLATION_CUBIQUE_t3(Fori,dFori,Fext,dFext)) \ */
/* ,DOUB(INTERPOLATION_CUBIQUE_t2(Fori,dFori,Fext,dFext)) \ */
/* ,MONO(INTERPOLATION_CUBIQUE_t1(Fori,dFori,Fext,dFext)) \ */
/* ) */
/* */
/* a donc ete supprimee a cette date... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E L A T R A N S F O R M A T I O N */
/* D E S C O O R D O N N E S B A R Y C E N T R I Q U E S A V E C G E N E R A L I S A T I O N : */
/* */
/*************************************************************************************************************************************/
-define INTERPOLATION_MIXTE(interpolation_cubique,fonction_origine,derivee_origine,fonction_extremite,derivee_extremite,lambda) \
-_-_-_- COND(IL_FAUT(interpolation_cubique) \
-_-_-_- ,INTERPOLATION_CUBIQUE(fonction_origine,derivee_origine,fonction_extremite,derivee_extremite,lambda) \
-_-_-_- ,INTERPOLATION_LINEAIRE(fonction_origine,fonction_extremite,lambda) \
-_-_-_- )
/* Definition de la fonction d'interpolation "mixte" qui est soit cubique soit lineaire */
/* (introduite le 20181227094123 pour 'v '$xrv/champs_5.1C$I INTERPOLATION_MIXTE')... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E L A T R A N S F O R M A T I O N */
/* D E S C O O R D O N N E S B A R Y C E N T R I Q U E S A V E C G E N E R A L I S A T I O N : */
/* */
/*************************************************************************************************************************************/
#define gF___NORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique,CoordBary0,CoordBary1) \
NORZ(TRON(coordonnee_barycentrique \
,CoordBary0 \
,CoordBary1 \
) \
,CoordBary0 \
,CoordBary1 \
,COORDONNEE_BARYCENTRIQUE_MINIMALE \
) \
/* Normalisation dans [0,1] d'une coordonnee barycentrique alors qu'elle est dans */ \
/* [CoordBary0,CoordBary1]. */
#define gF___DENORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique,CoordBary0,CoordBary1) \
F___DENORMALISE_NIVEAU(gF___NORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique,CoordBary0,CoordBary1))
#define g__DENORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique,CoordBary0,CoordBary1) \
__DENORMALISE_NIVEAU(gF___NORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique,CoordBary0,CoordBary1))
/* Coordonnees barycentriques denormalisees flottantes et entieres respectivement, la */
/* normalisation ayant lieu dans [CoordBary0,CoordBary1] afin de generaliser... */
#define gNsubstitution_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique,transformateur,translation,CoordBary0,CoordBary1) \
HOMO(ITb1(transformateur \
,INDX(translation(g__DENORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,CoordBary0 \
,CoordBary1 \
) \
) \
,NOIR \
) \
) \
,COORDONNEE_BARYCENTRIQUE_MINIMALE \
,COORDONNEE_BARYCENTRIQUE_MAXIMALE \
,CoordBary0 \
,CoordBary1 \
) \
/* Substitution d'une coordonnee barycentrique 'coordonnee_barycentrique'. */
#define gSUBSTITUTION_D_UNE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique,transformer,transformateur,CoordBary0,CoordBary1) \
COND(IL_NE_FAUT_PAS(transformer) \
,coordonnee_barycentrique \
,COND(IMEQ(coordonnee_barycentrique,CoordBary0,CoordBary1) \
,gNsubstitution_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,transformateur \
,NEUT \
,CoordBary0 \
,CoordBary1 \
) \
,INTERPOLATION_LINEAIRE(gNsubstitution_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,transformateur \
,NEUT \
,CoordBary0 \
,CoordBary1 \
) \
,gNsubstitution_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,transformateur \
,SUCN \
,CoordBary0 \
,CoordBary1 \
) \
,SOUS(gF___DENORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,CoordBary0 \
,CoordBary1 \
) \
,FLOT(g__DENORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,CoordBary0 \
,CoordBary1 \
) \
) \
) \
) \
) \
) \
/* Definition de la fonction de transformation des 'lambda's. Elle est definie point */ \
/* par point a l'aide du vecteur 'transformateur' d'index dans [NOIR,BLANC] qui definit */ \
/* le profil de la courbe ci-dessous ("+") qui transforme donc le 'lambda' argument. On */ \
/* notera qu'en general : */ \
/* */ \
/* transformateur(0) = 0 ('CoordBary0') */ \
/* */ \
/* et : */ \
/* */ \
/* transformateur(1) = 1 ('CoordBary1') */ \
/* */ \
/* et : */ \
/* */ \
/* 0 <= transformateur(lambda) <= 1 */ \
/* */ \
/* ce qui correspond au graphique ci-dessous, mais que cela n'est pas obligatoire... */ \
/* */ \
/* Si, par exemple, 'transformateur' contient lui-meme une fonction lineaire allant de 0 */ \
/* a 1, on retombe evidemment sur 'INTERPOLATION_LINEAIRE(...)'. Enfin, elle est appelee */ \
/* 'COORDONNEE_BARYCENTRIQUE(...)' parce qu'elle fait appel elle-meme explicitement */ \
/* a 'INTERPOLATION_LINEAIRE(...)' afin d'interpoler entre les points de 'transformateur' */ \
/* afin de le faire apparaitre comme continu. */ \
/* */ \
/* Elle est donc definie par : */ \
/* */ \
/* f(t) ^ */ \
/* | */ \
/* | */ \
/* 1 |.........................+ */ \
/* | + . */ \
/* | + . */ \
/* | + + . */ \
/* | . */ \
/* | + . */ \
/* | + + . */ \
/* | + . */ \
/* | . */ \
/* | . */ \
/* 0 +------------------------------------------------------> */ \
/* t=0 t=1 t */ \
/* */ \
/* ou 't' designe la coordonnee barycentrique 'lambda', et 'f(...)' le 'transformateur'. */ \
/* */ \
/* La generalisation de [0,1] a [CoordBary0,CoordBary1] a ete introduite le 19990303113511. */
#define F___DENORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique) \
gF___DENORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,COORDONNEE_BARYCENTRIQUE_MINIMALE \
,COORDONNEE_BARYCENTRIQUE_MAXIMALE \
) \
#define __DENORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique) \
g__DENORMALISE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,COORDONNEE_BARYCENTRIQUE_MINIMALE \
,COORDONNEE_BARYCENTRIQUE_MAXIMALE \
) \
/* Coordonnees barycentriques denormalisees flottantes et entieres respectivement. */
#define Nsubstitution_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique,transformateur,translation) \
gNsubstitution_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,transformateur \
,translation \
,COORDONNEE_BARYCENTRIQUE_MINIMALE \
,COORDONNEE_BARYCENTRIQUE_MAXIMALE \
) \
/* Substitution d'une coordonnee barycentrique 'coordonnee_barycentrique'. */
#define SUBSTITUTION_D_UNE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique,transformer,transformateur) \
gSUBSTITUTION_D_UNE_COORDONNEE_BARYCENTRIQUE(coordonnee_barycentrique \
,transformer \
,transformateur \
,COORDONNEE_BARYCENTRIQUE_MINIMALE \
,COORDONNEE_BARYCENTRIQUE_MAXIMALE \
) \
/* Definition de la fonction de transformation des 'lambda's. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D ' U N E G E N E R A T I O N N O N P E R I O D I Q U E : */
/* */
/*************************************************************************************************************************************/
#define TORE_PLAT_INFERIEUR \
FLOT(QUAR(MOINS_L_INFINI)) \
/* En fait, le tore des coordonnees existe, mais est "infiniment" grand. On notera que */ \
/* l'on n'utilise pas 'F_MOINS_L_INFINI' afin d'eviter des debordements lors d'operations */ \
/* avec 'ARRO(...)' via 'fNON_DIVISIBLE(...)'. */
#define TORE_PLAT_SUPERIEUR \
FLOT(QUAR(INFINI)) \
/* En fait, le tore des coordonnees existe, mais est "infiniment" grand. On notera que */ \
/* l'on n'utilise pas 'F_INFINI' afin d'eviter des debordements lors d'operations */ \
/* avec 'ARRO(...)' via 'fNON_DIVISIBLE(...)'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A M P F R A C T A L S P A T I A L E M E N T */
/* B I - E T T R I - D I M E N S I O N N E L : */
/* */
/*************************************************************************************************************************************/
#define FIRST_NIVEAU_DE_RECURSION \
UN \
/* Index du premier element et identificateur du premier niveau de recursivite... */