/*************************************************************************************************************************************/ /* */ /* 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... */