_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E S E N S E M B L E S " I T E R A T I F S " D A N S L E P L A N C O M P L E X E , */ /* D A N S L E C O R P S D E S Q U A T E R N I O N S ( O U " H Y P E R - C O M P L E X E " ) , */ /* E T D A N S L E C O R P S D E S O C T O N I O N S ( O U " H Y P E R - H Y P E R - C O M P L E X E " ) : */ /* */ /* */ /* Nota : */ /* */ /* Lorsqu'un parametre peut prendre deux */ /* valeurs 'M' et 'J' suivant que l'on */ /* calcule l'ensemble de Mandelbrot ou un */ /* ensemble de Julia, on le note : */ /* */ /* (M,J), avec */ /* */ /* donc dans l'ordre Mandelbrot, puis Julia... */ /* */ /* */ /* Author of '$ximcf/iterations$FON' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19870000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N T R O L E D E L ' A R I T H M E T I Q U E E T E N D U E */ /* L O R S D E C A L C U L S S U R L E S N O M B R E S C O M P L E X E S : */ /* */ /*************************************************************************************************************************************/ #ifdef FAIRE_EVENTUELLEMENT_DE_L_ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_COMPLEXES DEFV(Common,DEFV(Logical,_______VERSION__ximcf_iterations_____ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_COMPLEXES)); /* Indicateur introduit le 20070129121923... */ #Aifdef FAIRE_EVENTUELLEMENT_DE_L_ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_COMPLEXES DEFV(Common,DEFV(Logical,_______VERSION__ximcf_iterations_____ARITHMETIQUE_DE_BASE_DANS_LES_NOMBRES_COMPLEXES)); /* Indicateur introduit le 20070129133050... */ #Eifdef FAIRE_EVENTUELLEMENT_DE_L_ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_COMPLEXES /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H O I X E N T R E V I S U A L I S E R L E N O M B R E D ' I T E R A T I O N S */ /* O U L ' A P P A R T E N A N C E A L ' E N S E M B L E : */ /* */ /*************************************************************************************************************************************/ #define APPARTENANCE_A_L_ENSEMBLE \ BLANC #define NON_APPARTENANCE_A_L_ENSEMBLE \ NOIR #define fAPPARTENANCE_A_L_ENSEMBLE \ FU #define fNON_APPARTENANCE_A_L_ENSEMBLE \ FZERO /* Codes de l'appartenance et de la non appartenance (introduits le 20091119165650). */ DEFV(Common,DEFV(Logical,ZINT(iterations_dans_C_HC_HHC_____visualiser_l_appartenance_plutot_que_le_nombre_d_iterations,FAUX))); /* Introduit le 20091119140032 afin de pouvoir visualiser la non appartenance ('NOIR') et */ /* l'appartenance ('BLANC') plutot que le nombre d'iterations... */ DEFV(Common,DEFV(Logical,ZINT(iterations_dans_C_HC_HHC_____renormaliser_le_nombre_d_iterations,VRAI))); /* Introduit le 20150126131332 afin de pouvoir ne pas renormaliser le nombre courant */ /* d'iterations et ainsi de visualiser sa "vraie" valeur... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H O I X E N T R E A R G U M E N T [ S ] E T M O D U L E : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(iterations_dans_C_HC_HHC_____memoriser_le_module_plutot_que_les_arguments,FAUX))); DEFV(Common,DEFV(Float,ZINT(iterations_dans_C_HC_HHC_____minimum_du_module_a_memoriser_plutot_que_les_arguments ,COORDONNEE_BARYCENTRIQUE_MINIMALE ) ) ); DEFV(Common,DEFV(Float,ZINT(iterations_dans_C_HC_HHC_____maximum_du_module_a_memoriser_plutot_que_les_arguments ,COORDONNEE_BARYCENTRIQUE_MAXIMALE ) ) ); /* Lorsque c'est une valeur de type angulaire (argument[s]) qui doit etre memorisee, cet */ /* indicateur permet de memoriser plutot le module (introduite le 20061218125816). */ /* */ /* Rappelons bien le 20061219121238 que le renvoi du module ne peut se faire qu'en */ /* activant la visualisation de[s] argument[s] de sortie. Ainsi, par exemple avec la */ /* commande 'v $xrc/mandel.01$K', il faudra utiliser les arguments suivants : */ /* */ /* arguments=VRAI */ /* */ /* qui demande la visualisation de l'argument de sortie, ainsi que de plus : */ /* */ /* etendre_precision=VRAI */ /* argument=FAUX (ou son "complement" : module=VRAI) */ /* */ /* pour remplace la sortie de l'argument de sortie par celle su module... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E X T E N S I O N D E L A P R E C I S I O N D E S R E S U L T A T S : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(iterations_dans_C_HC_HHC_____etendre_la_precision,FAUX))); /* Possibilite introduite le 20061218125816 qui permet, si besoin est, de renvoyer des */ /* resultats de type 'genere_Float' (au lieu de 'genere_p')... */ #pragma xcc__cpp_Z__liste_utiles $ximcf/iterations$EXT iterations_dans_C_HC_HHC_____IFmageR $xbmcf/iterations DEFV(Common,DEFV(Statique,DEFV(imageF,iterations_dans_C_HC_HHC_____IFmageR))); /* Image statique de type 'genere_Float' contenant, si besoin est, la version de l'image */ /* Resultat en precision "etendue". On notera que cette facon de proceder n'est pas tres */ /* "propre" ; en effet, il aurait ete plus elegant soit de dupliquer toutes les fonctions */ /* afin qu'elles renvoie d'un cote des images de type 'image' et de l'autre des images de */ /* type 'imageF'. Mais cela aurait implique un travail enorme et risque. Il aurait peut-etre */ /* aussi ete possible de faire que les fonctions puissent etre en quelque sorte de deux */ /* types differents simultanement ; mais cela aurait ete contraire aux grands principes. */ /* Cette solution consistant donc d'une part a continuer a renvoyer systematiquement une */ /* image de type 'image' (quitte a ne pas la memoriser en retour) et d'autre part a renvoyer */ /* eventuellement, via une image 'Common', une version de type 'imageF' fut donc beaucoup */ /* simple a implementer : tant pis pour l'elegance... */ #define INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC \ Bblock \ Test(IL_FAUT(iterations_dans_C_HC_HHC_____etendre_la_precision)) \ Bblock \ CALS(IFinitialisation(iterations_dans_C_HC_HHC_____IFmageR,FZERO)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Initialisation eventuelle du processus d'extension de la precision (introduite le */ \ /* 20061219090342). */ #define RANGEMENT_DU_NIVEAU_COURANT_ET_EVENTUELLEMENT_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC \ Bblock \ Test(IL_FAUT(iterations_dans_C_HC_HHC_____etendre_la_precision)) \ Bblock \ storeF_point(niveau_courant_precis,iterations_dans_C_HC_HHC_____IFmageR,X,Y); \ /* Marquage eventuel du point courant de facon precise... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ store_point(niveau_courant,imageR,X,Y,FVARIABLE); \ \ EGAL(niveau_courant_maximal,MAX2(niveau_courant,niveau_courant_maximal)); \ /* Introduit le 20200627112145 a cause d'une remarque faite a cette date concernant le */ \ /* marquage des racines N-iemes de l'unite calculee exactement... */ \ Eblock \ /* Marquage du point courant (procedure introduite le 20061218125816). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L I D A T I O N D E L A F E N E T R E D E C A L C U L D E M A N D E E : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(iterations_dans_C_HC_HHC_____editer_la_fenetre_courante_avant_et_apres_homothetie,FAUX))); DEFV(Common,DEFV(Logical,ZINT(iterations_dans_C_HC_HHC_____editer_la_fenetre_courante_sous_forme_OX_EX_OY_EY,VRAI))); /* Introduit le 20091122134759 afin de pouvoir editer la fenetre courante avant et apres */ /* homothetie, puis complete le 20110115102345 afin de pouvoir choisir entre deux formats */ /* {"OX=","EX=","OY=","EY="} (par defaut) et {"xbg=","ybg=","xhd=","yhd="} (pour simplifier */ /* l'exploitation de ces editions...). */ #define VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE \ Bblock \ Test(IFLE(Reelle(INDIRECT(coin_haut_droite)),Reelle(INDIRECT(coin_bas_gauche)))) \ Bblock \ PRINT_ERREUR("la relation d'ordre entre les abscisses de la fenetre est incorrecte, ou elles sont egales"); \ PRINT_ERREUR("de toute facon, elles sont permutees"); \ fSWAP(Reelle(INDIRECT(coin_bas_gauche)),Reelle(INDIRECT(coin_haut_droite))); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFLE(Imaginaire(INDIRECT(coin_haut_droite)),Imaginaire(INDIRECT(coin_bas_gauche)))) \ Bblock \ PRINT_ERREUR("la relation d'ordre entre les abscisses de la fenetre est incorrecte, ou elles sont egales"); \ PRINT_ERREUR("de toute facon, elles sont permutees"); \ fSWAP(Imaginaire(INDIRECT(coin_bas_gauche)),Imaginaire(INDIRECT(coin_haut_droite))); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(iterations_dans_C_HC_HHC_____editer_la_fenetre_courante_avant_et_apres_homothetie)) \ Bblock \ Test(IL_FAUT(iterations_dans_C_HC_HHC_____editer_la_fenetre_courante_sous_forme_OX_EX_OY_EY)) \ /* Le 20110115102345 fut introduit le choix entre le format {"OX=","EX=","OY=","EY="} */ \ /* (par defaut) et le format {"xbg=","ybg=","xhd=","yhd="} (pour simplifier l'exploitation */ \ /* de ces editions...). */ \ Bblock \ CAL3(Prme4("{{%+.^^^,%+.^^^},{%+.^^^,%+.^^^}}" \ ,Reelle(INDIRECT(coin_bas_gauche)),Imaginaire(INDIRECT(coin_bas_gauche)) \ ,Reelle(INDIRECT(coin_haut_droite)),Imaginaire(INDIRECT(coin_haut_droite)) \ ) \ ); \ CALS(FPrme0(" --> ")); \ CAL3(Prme4("{{%+.^^^,%+.^^^},{%+.^^^,%+.^^^}}" \ ,X_COIN_BAS_GAUCHE,Y_COIN_BAS_GAUCHE \ ,X_COIN_HAUT_DROITE,Y_COIN_HAUT_DROITE \ ) \ ); \ CALS(FPrme0(" == ")); \ CAL3(Prme4("{OX=%+.^^^ EX=%+.^^^ OY=%+.^^^ EY=%+.^^^}" \ ,X_COIN_BAS_GAUCHE,X_COIN_HAUT_DROITE \ ,Y_COIN_BAS_GAUCHE,Y_COIN_HAUT_DROITE \ ) \ ); \ CALS(FPrme0(" == ")); \ CAL3(Prme4("[%+.^^^,%+.^^^]x[%+.^^^,%+.^^^]" \ ,X_COIN_BAS_GAUCHE,X_COIN_HAUT_DROITE \ ,Y_COIN_BAS_GAUCHE,Y_COIN_HAUT_DROITE \ ) \ ); \ /* Ces editions ont ete introduites le 20091122134759 pour aider a la determination des */ \ /* "bonnes" fenetres de calcul (c'est-a-dire la ou il se passe quelque chose...). */ \ /* */ \ /* Le 20091123094717 on notera le lien avec 'v $xiidX/fonct$vv$FON 20091123093212' qui */ \ /* permet de connaitre les coordonnees normalisees dans un certain espace des points d'une */ \ /* image. */ \ /* */ \ /* Le 20091123101627, j'ai complete le format : */ \ /* */ \ /* "{{%+.^^g,%+.^^g},{%+.^^g,%+.^^g}}" */ \ /* */ \ /* par quelque chose de compatible avec 'v $xci/display$K 20091123094324' et on aura alors */ \ /* fortement interet a utiliser simultanement les options : */ \ /* */ \ /* ModeFlot='f' */ \ /* ChiffresFlot=... */ \ /* */ \ /* avec conjointement : */ \ /* */ \ /* editer_XY_curseur=VRAI */ \ /* normaliser_XY_curseur=VRAI */ \ /* */ \ /* afin de reduire la precision (16 par defaut...) et de garantir le nombre de decimales. */ \ /* */ \ /* Le 20091123120321, les formats "^^g" sont passes a "^^^" pour plus de souplesse... */ \ /* */ \ /* Le 20151014145152, j'ai ajoute une edition supplementaire de la forme : [OX,EX]x[OYxEY]. */ \ Eblock \ ATes \ Bblock \ CAL3(Prme4("AvantHomothetie='xbg=%+.^^^ ybg=%+.^^^ xhd=%+.^^^ yhd=%+.^^^'" \ ,Reelle(INDIRECT(coin_bas_gauche)),Imaginaire(INDIRECT(coin_bas_gauche)) \ ,Reelle(INDIRECT(coin_haut_droite)),Imaginaire(INDIRECT(coin_haut_droite)) \ ) \ ); \ CALS(FPrme0(" --> ")); \ CAL3(Prme4("ApresHomothetie='xbg=%+.^^^ ybg=%+.^^^ xhd=%+.^^^ yhd=%+.^^^'" \ ,X_COIN_BAS_GAUCHE,Y_COIN_BAS_GAUCHE \ ,X_COIN_HAUT_DROITE,Y_COIN_HAUT_DROITE \ ) \ ); \ Eblock \ /* Le 20110117132135, les couples "{...}" ont ete remplaces par des couples "'...'" plus */ \ /* faciles a gerer au niveau du '$CSH' ('v $xiirc/.MANE.B1.1.$U AvantHomothetie'). */ \ ETes \ \ CALS(Fsauts_de_lignes(UN)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Validation et remise en ordre eventuelle de la fenetre de calcul demandee avant son */ \ /* eventuelle extension homothetique... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A S S A G E D E S C O O R D O N N E E S D E L ' I M A G E */ /* A U X C O O R D O N N E E S D U P L A N : */ /* */ /*************************************************************************************************************************************/ #define X_COIN_BAS_GAUCHE \ CHANGEMENT_HOMOTHETIQUE_D_ABSCISSE_GAUCHE(Reelle(INDIRECT(coin_bas_gauche)) \ ,Reelle(INDIRECT(coin_haut_droite)) \ ) #define Y_COIN_BAS_GAUCHE \ CHANGEMENT_HOMOTHETIQUE_D_ORDONNEE_BAS(Imaginaire(INDIRECT(coin_bas_gauche)) \ ,Imaginaire(INDIRECT(coin_haut_droite)) \ ) #define X_COIN_HAUT_DROITE \ CHANGEMENT_HOMOTHETIQUE_D_ABSCISSE_DROITE(Reelle(INDIRECT(coin_bas_gauche)) \ ,Reelle(INDIRECT(coin_haut_droite)) \ ) #define Y_COIN_HAUT_DROITE \ CHANGEMENT_HOMOTHETIQUE_D_ORDONNEE_HAUT(Imaginaire(INDIRECT(coin_bas_gauche)) \ ,Imaginaire(INDIRECT(coin_haut_droite)) \ ) /* Definition des coins "bas-gauche" et "haut-droite" de la fenetre en fonction du rapport */ /* des dimensions de cette derniere ; on notera que si celle-ci n'est pas carree, ce sont */ /* ses abscisses dans le plan Complexe qui sont re-ajustees afin de s'accomoder du rapport */ /* suivant : */ /* */ /* dimX */ /* ------ */ /* dimY */ /* */ /* de la facon suivante (en supposant ce rapport egal a 2) : */ /* */ /* ----------------- */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* ----------------- */ /* . . */ /* . . */ /* . . */ /* . . */ /* . . */ /* . . */ /* --------------------------------- */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* | . | */ /* --------------------------------- */ /* . */ /* /|\ */ /* | */ /* | */ /* */ /* milieu de la fenetre */ /* */ /* Les ordonnees sont conservees, et seules les abscisses sont modifiees par rapport au */ /* milieu de la fenetre... */ #define X_IMAGE_PLAN(x) \ ADD2(MUL2(FLOT(COXR(x)),x_homothetie) \ ,X_COIN_BAS_GAUCHE \ ) #define Y_IMAGE_PLAN(y) \ ADD2(MUL2(FLOT(COYR(y)),y_homothetie) \ ,Y_COIN_BAS_GAUCHE \ ) /* Passage des coordonnees dans l'image aux coordonnees du plan. */ #define X_PLAN_IMAGE \ COXA(INTE(DIVI(SOUS(Reelle(suite_point),X_COIN_BAS_GAUCHE) \ ,x_homothetie \ ) \ ) \ ) #define Y_PLAN_IMAGE \ COYA(INTE(DIVI(SOUS(Imaginaire(suite_point),Y_COIN_BAS_GAUCHE) \ ,y_homothetie \ ) \ ) \ ) /* Passage des coordonnees du plan aux coordonnees dans l'image. */ #define X_PLAN_IMAGE_MODULO \ MODU(X_PLAN_IMAGE \ ,Xmin \ ,Xmax \ ) #define Y_PLAN_IMAGE_MODULO \ MODU(Y_PLAN_IMAGE \ ,Ymin \ ,Ymax \ ) /* Passage des coordonnees du plan aux coordonnees dans l'image "torique" ; */ /* on notera les 'MODU', qui font que ce l'on calcule peut etre bizarre... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A R I A B L E S N E C E S S A I R E S A U C A L C U L D E L A F E N E T R E : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(HOMOTHETIE__IMAGE__C_HC_HHC______prendre_en_compte_le_rapport_dimX_dimY,VRAI))); /* Introduit le 20120123135858 afin de svaoir si le rapport dimX/dimY doit aussi etre celui */ /* de la fenetre ('VRAI', ce qui assure la compatibilite anterieure) ou bien conserve tel */ /* quel ('FAUX')... */ DEFV(Common,DEFV(Logical,ZINT(HOMOTHETIE__IMAGE__C_HC_HHC______utiliser_dimX_dimY,VRAI))); /* Introduit le 20120123125558 afin de choisir le calcul de {x_homothetie,y_homothetie} */ /* via {dimX,dimY} ('VRAI', ce qui assure la compatibilite anterieure) ou bien via */ /* {Xmax,Ymax} ('FAUX'). */ #define VARIABLES_RELATIVES_A_LA_NECESSITE_D_HOMOTHETIE \ gVARIABLES_RELATIVES_A_LA_NECESSITE_D_HOMOTHETIE \ (COND(IL_FAUT(HOMOTHETIE__IMAGE__C_HC_HHC______prendre_en_compte_le_rapport_dimX_dimY) \ ,COND(IFEQ_a_peu_pres_absolu(DIVI(FLOT(COND(IL_FAUT(HOMOTHETIE__IMAGE__C_HC_HHC______utiliser_dimX_dimY) \ ,dimX \ ,Xmax \ ) \ ) \ ,FLOT(COND(IL_FAUT(HOMOTHETIE__IMAGE__C_HC_HHC______utiliser_dimX_dimY) \ ,dimY \ ,Ymax \ ) \ ) \ ) \ ,DIVI(SOUS(X_COIN_HAUT_DROITE,X_COIN_BAS_GAUCHE) \ ,SOUS(Y_COIN_HAUT_DROITE,Y_COIN_BAS_GAUCHE) \ ) \ ,tgEPSILON \ ) \ ,FAUX \ ,VRAI \ ) \ ,FAUX \ ) \ ); \ /* L'ajustement de la proportion des dimensions des fenetres au rapport dimX/dimY est-il */ \ /* necessaire (introduit le 20091124124351) ? */ #define BVARIABLES_D_HOMOTHETIE_C_HC_HHC \ /* Definition des variables communes a tout ce qui necessite des homotheties... */ \ VARIABLES_RELATIVES_A_LA_NECESSITE_D_HOMOTHETIE; \ /* L'ajustement de la proportion des dimensions des fenetres au rapport dimX/dimY est-il */ \ /* necessaire (introduit le 20091124124351) ? */ \ \ DEFV(Float \ ,INIT(x_homothetie \ ,DIVI(SOUS(X_COIN_HAUT_DROITE \ ,X_COIN_BAS_GAUCHE \ ) \ ,FLOT(COND(IL_FAUT(HOMOTHETIE__IMAGE__C_HC_HHC______utiliser_dimX_dimY),dimX,Xmax)) \ ) \ ) \ ); \ /* "Taille" reelle de la fenetre rapportee a la taille des images, */ \ /* */ \ /* ATTENTION, le 20000316182616 je suis passe de 'dimX' a 'dimXN'. */ \ /* */ \ /* ATTENTION, le 20091124122443, suite a 'v $xiiD/definit.1$DEF 20090928173316', je suis */ \ /* repasse de 'dimXN' a 'dimX'... */ \ DEFV(Float \ ,INIT(y_homothetie \ ,DIVI(SOUS(Y_COIN_HAUT_DROITE \ ,Y_COIN_BAS_GAUCHE \ ) \ ,FLOT(COND(IL_FAUT(HOMOTHETIE__IMAGE__C_HC_HHC______utiliser_dimX_dimY),dimY,Ymax)) \ ) \ ) \ ); \ /* "Taille" imaginaire de la fenetre rapportee a la taille des images. */ \ /* */ \ /* ATTENTION, le 20000316182616 je suis passe de 'dimY' a 'dimYN'. */ \ /* */ \ /* ATTENTION, le 20091124122443, suite a 'v $xiiD/definit.1$DEF 20090928173316', je suis */ \ /* repasse de 'dimYN' a 'dimY'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A S O U L ' E X P O S A N T N ' E S T A P R I O R I P A S U T I L E : */ /* */ /*************************************************************************************************************************************/ #define EXPOSANT_INUTILE \ DEUX \ /* Introduit le 20111130180327, il doit valoir 'DEUX' malgre tout (et non pas la valeur */ \ /* 'ARGUMENT_INUTILE' utilise anterieurement) a cause des tests qui sont faits en liaison */ \ /* avec 'compatibilite_20110825'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E S T S U R L E N O M B R E D ' I T E R A T I O N S : */ /* */ /*************************************************************************************************************************************/ #define PAS_ASSEZ_D_ITERATIONS \ IFLT(nombre_courant_d_iterations,nombre_maximal_d_iterations) \ /* Test sur le nombre d'iterations. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S E U I L D U M O D U L E : */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #define TEST_DU_CARRE_DU_MODULE_DANS_C(seuil) \ IFLT(Cmodule2(suite_point),seuil) \ /* Test quelconque de continuation des iterations dans 'F_ITERATION_DANS_C(...)'. */ #define SEUIL_MODULE_DANS_C \ EXP2(DOUB(UNITE)) DEFV(Common,DEFV(Float,ZINT(iterations_diverses_dans_C_____seuil_du_carre_du_module ,SEUIL_MODULE_DANS_C ) ) ); /* Seuil de divergence du carre du module d'un nombre complexe de la suite. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E P L I E M E N T E V E N T U E L D E S E S P A C E S : */ /* */ /*************************************************************************************************************************************/ #define ITERATIONS_DIVERSES_____REPLIER_L_ESPACE \ FAUX #define ITERATIONS_DIVERSES_____ORIGINE__ \ NEGA(COORDONNEE_BARYCENTRIQUE_MAXIMALE) #define ITERATIONS_DIVERSES_____EXTREMITE \ NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E P L I E M E N T E V E N T U E L D E L ' E S P A C E C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_C_____replier_l_espace,ITERATIONS_DIVERSES_____REPLIER_L_ESPACE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_C_____Rorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_C_____Rextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_C_____Iorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_C_____Iextremite,ITERATIONS_DIVERSES_____EXTREMITE))); /* Possibilite introduite le 20121103095740... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A I T E M E N T D E L ' U N D E R F L O W E T D E L ' O V E R F L O W : */ /* */ /*************************************************************************************************************************************/ #define TESTER_L_UNDERFLOW_ET_L_OVERFLOW \ VRAI #define NE_PAS_TESTER_L_UNDERFLOW_ET_L_OVERFLOW \ NOTL(TESTER_L_UNDERFLOW_ET_L_OVERFLOW) /* Afin de pouvoir activer ou desactiver respectivement les tests d'undeflow et d'overflow, */ /* lorsque cela s'avere necessaire... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Q U E L Q U E S D O N N E E S C O M M U N E S A U C A L C U L */ /* D A N S L E P L A N C O M P L E X E */ /* E T D A N S L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #define VARIABLES_COMMUNES_DES_ITERATIONS_DANS_C_HC_HHC \ DEFV(Positive,INIT(nombre_courant_d_iterations,UNDEF)); \ /* Nombre courant d'iterations. */ \ DEFV(genere_p,INIT(niveau_courant,NIVEAU_UNDEF)); \ /* Niveau de marquage du point courant. */ \ DEFV(genere_p,INIT(niveau_courant_maximal,NOIR)); \ /* Niveau maximal de marquage rencontre lors des iterations : cela a ete introduit le */ \ /* 20200627112145 a cause d'une remarque faite a cette date concernant le marquage des */ \ /* racines N-iemes de l'unite calculee exactement... */ \ DEFV(genere_Float,INIT(niveau_courant_precis,FLOT__NIVEAU_UNDEF)) \ /* Niveau courant de 'iterations_dans_C_HC_HHC_____IFmageR'. */ \ /* */ \ /* ATTENTION : l'absence de ";" a la fin de la derniere declaration est due au mode d'appel */ \ /* qui lui se termine par un ";"... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Q U E L Q U E S D O N N E E S U T I L E S A L ' E D I T I O N E V E N T U E L L L E */ /* D E S T R A J E C T O I R E S D A N S L E P L A N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_C_____editer_les_trajectoires,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_C_____normaliser_les_trajectoires,VRAI))); #define Xmin_Ymin__UNDEF \ MOINS_L_INFINI #define Xmax_Ymax__UNDEF \ INFINI /* Introduit le 20211013094654 et dedouble le 20211016080133... */ #define IGNORER__Xmin__Ymin \ FRA10(FRA10(Xmin_Ymin__UNDEF)) #define IGNORER__Xmax__Ymax \ FRA10(FRA10(Xmax_Ymax__UNDEF)) /* Les 'FRA10(FRA10(....))'s sont destines a permettre des 'ADD2(...)' ci-apres en ce */ /* concerne {{Xmin,Xmax},{Ymin,Ymax}}... */ /* */ /* Le 20211016080133 un lien a ete etabli entre {IGNORER__Xmin__Ymin,Xmax_Ymax__UNDEF} */ /* et {Xmin_Ymin__UNDEF,Xmax_Ymax__UNDEF} et ce afin de ne pas rencontrer un jour un */ /* probleme de parametrage incoherent... */ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_C_____compatibilite_20211015,FAUX))); /* Introduit le 20211015103315 car, en effet, avant cette date {{Xmin,Xmax},{Ymin,Ymax}} */ /* n'etaient pas pris en compte... */ DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____translation_X_d_editions_des_trajectoires,FZERO))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____Xmin__d_editions_des_trajectoires,Xmin_Ymin__UNDEF))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____Xmax__d_editions_des_trajectoires,Xmax_Ymax__UNDEF))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_C_____maille_X_d_editions_des_trajectoires,GRO10(PasX)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____translation_Y_d_editions_des_trajectoires,FZERO))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____Ymin__d_editions_des_trajectoires,Xmin_Ymin__UNDEF))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____Ymax__d_editions_des_trajectoires,Xmax_Ymax__UNDEF))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_C_____maille_Y_d_editions_des_trajectoires,GRO10(PasY)))); /* Le 20211012122652 a ete introduite la possibilite de "resserer" le maillage des points */ /* dont on visualise les trajectoires et ce, par exemple, au centre du domaine... */ /* */ /* Je rappelle le 20211014121814 qu'il n'est pas possible de definir : */ /* */ /* DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____Xmin__...,Xmin))); */ /* DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____Xmax__...,Xmax))); */ /* */ /* DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____Ymin__...,Ymin))); */ /* DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_C_____Ymax__...,Ymax))); */ /* */ /* car, en effet, {{Xmin,Xmax},{Ymin,Ymax}} sont en general des parametres d'appel des */ /* '$X's et ne sont donc pas connus au moment de leur lancement, d'ou le passage par */ /* {Xmin_Ymin__UNDEF,Xmax_Ymax__UNDEF} qui indiquent que l'initilisation de ces quatre */ /* variables n'a pas encore ete faite... */ DEFV(Local,DEFV(Logical,ZINT(gF_ITERATION_DANS_C_____une_trajectoire_est_en_cours_d_edition,LUNDEF))); /* Introduit le 20211012180614 pour simplifier les choses... */ DEFV(Local,DEFV(Positive,ZINT(gF_ITERATION_DANS_C_____numero_du_point_courant_edite,ZERO))); /* Introduit le 20190314180029 pour permettre l'edition des trajectoires {Z(0),Z(1),...}. */ /* */ /* Le 20190315093924, les mailles {X,Y} sont passees de 'Int' a 'Float' afin d'en faire */ /* des arguments "homothetiques"... */ #define gF_ITERATION_DANS_C__EDITION_EVENTUELLE_DES_TRAJECTOIRES(MarqueurIteration) \ /* L'argument 'MarqueurIteration' a ete introduit le 20190315144242 afin de pouvoir faire */ \ /* la difference entre le premier et le second appel... */ \ Bblock \ Test(IL_FAUT(gF_ITERATION_DANS_C_____editer_les_trajectoires)) \ /* Test introduit le 20190314180029... */ \ Bblock \ DEFV(Int,INIT(coordonnee_X_de_depart_d_une_trajectoire \ ,ADD2(X \ ,gF_ITERATION_DANS_C_____translation_X_d_editions_des_trajectoires \ ) \ ) \ ); \ DEFV(Int,INIT(coordonnee_Y_de_depart_d_une_trajectoire \ ,ADD2(Y \ ,gF_ITERATION_DANS_C_____translation_Y_d_editions_des_trajectoires \ ) \ ) \ ); \ \ DEFV(Int,INIT(maille_X_denormalisee \ ,_lDENORMALISE_OX(gF_ITERATION_DANS_C_____maille_X_d_editions_des_trajectoires) \ ) \ ); \ DEFV(Int,INIT(maille_Y_denormalisee \ ,_lDENORMALISE_OY(gF_ITERATION_DANS_C_____maille_Y_d_editions_des_trajectoires) \ ) \ ); \ /* Introduit le 20211013135602... */ \ \ Test(IFOU(IFOU(IFEQ(gF_ITERATION_DANS_C_____Xmin__d_editions_des_trajectoires,Xmin_Ymin__UNDEF) \ ,IFEQ(gF_ITERATION_DANS_C_____Xmax__d_editions_des_trajectoires,Xmax_Ymax__UNDEF) \ ) \ ,IFOU(IFEQ(gF_ITERATION_DANS_C_____Ymin__d_editions_des_trajectoires,Xmin_Ymin__UNDEF) \ ,IFEQ(gF_ITERATION_DANS_C_____Ymax__d_editions_des_trajectoires,Xmax_Ymax__UNDEF) \ ) \ ) \ ) \ Bblock \ /* Cas ou au moins l'un des {{Xmin,Xmax},{Ymin,Ymax}} n'a pas ete initialise... */ \ Test(IL_FAUT(gF_ITERATION_DANS_C_____compatibilite_20211015)) \ /* Test introduit le 20211015103315... */ \ Bblock \ EGAL(gF_ITERATION_DANS_C_____Xmin__d_editions_des_trajectoires,IGNORER__Xmin__Ymin); \ EGAL(gF_ITERATION_DANS_C_____Xmax__d_editions_des_trajectoires,IGNORER__Xmax__Ymax); \ EGAL(gF_ITERATION_DANS_C_____Ymin__d_editions_des_trajectoires,IGNORER__Xmin__Ymin); \ EGAL(gF_ITERATION_DANS_C_____Ymax__d_editions_des_trajectoires,IGNORER__Xmax__Ymax); \ /* Avec ces valeurs, {{Xmin,Xmax},{Ymin,Ymax}} seront ignorees... */ \ Eblock \ ATes \ Bblock \ EGAL(gF_ITERATION_DANS_C_____Xmin__d_editions_des_trajectoires \ ,COND(IFEQ(gF_ITERATION_DANS_C_____Xmin__d_editions_des_trajectoires \ ,Xmin_Ymin__UNDEF \ ) \ ,Xmin \ ,gF_ITERATION_DANS_C_____Xmin__d_editions_des_trajectoires \ ) \ ); \ EGAL(gF_ITERATION_DANS_C_____Xmax__d_editions_des_trajectoires \ ,COND(IFEQ(gF_ITERATION_DANS_C_____Xmax__d_editions_des_trajectoires \ ,Xmax_Ymax__UNDEF \ ) \ ,Xmax \ ,gF_ITERATION_DANS_C_____Xmax__d_editions_des_trajectoires \ ) \ ); \ \ EGAL(gF_ITERATION_DANS_C_____Ymin__d_editions_des_trajectoires \ ,COND(IFEQ(gF_ITERATION_DANS_C_____Ymin__d_editions_des_trajectoires \ ,Xmin_Ymin__UNDEF \ ) \ ,Ymin \ ,gF_ITERATION_DANS_C_____Ymin__d_editions_des_trajectoires \ ) \ ); \ EGAL(gF_ITERATION_DANS_C_____Ymax__d_editions_des_trajectoires \ ,COND(IFEQ(gF_ITERATION_DANS_C_____Ymax__d_editions_des_trajectoires \ ,Xmax_Ymax__UNDEF \ ) \ ,Ymax \ ,gF_ITERATION_DANS_C_____Ymax__d_editions_des_trajectoires \ ) \ ); \ /* Introduit sous cette forme le 20211013094654... */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFET(IFET(DIVISIBLE(coordonnee_X_de_depart_d_une_trajectoire \ ,maille_X_denormalisee \ ) \ ,IFINff(coordonnee_X_de_depart_d_une_trajectoire \ ,ADD2(gF_ITERATION_DANS_C_____Xmin__d_editions_des_trajectoires \ ,maille_X_denormalisee \ ) \ ,ADD2(gF_ITERATION_DANS_C_____Xmax__d_editions_des_trajectoires \ ,maille_X_denormalisee \ ) \ ) \ ) \ ,IFET(DIVISIBLE(coordonnee_Y_de_depart_d_une_trajectoire \ ,maille_Y_denormalisee \ ) \ ,IFINff(coordonnee_Y_de_depart_d_une_trajectoire \ ,ADD2(gF_ITERATION_DANS_C_____Ymin__d_editions_des_trajectoires \ ,maille_Y_denormalisee \ ) \ ,ADD2(gF_ITERATION_DANS_C_____Ymax__d_editions_des_trajectoires \ ,maille_Y_denormalisee \ ) \ ) \ ) \ ) \ ) \ Bblock \ CAL3(Prme1("point=%d",gF_ITERATION_DANS_C_____numero_du_point_courant_edite)); \ CAL3(Prme2(" iteration=%d%s",nombre_courant_d_iterations,MarqueurIteration)); \ /* On notera le 20190314185753 que la premiere iteration vaudra : */ \ /* */ \ /* 1 --> 'Imandelbrot_dans_C(...)' */ \ /* */ \ /* ce qui est bien, mais : */ \ /* */ \ /* 2 --> 'Ijulia_dans_C(...)' */ \ /* */ \ /* et ce a cause de 'v $ximcf/iterations$FON EGAL.nombre_courant_d_iterations.UN.;' */ \ /* ci-apres... */ \ CAL3(Prme2(" (%+.^^^,%+.^^^)" \ ,COND(IL_FAUT(gF_ITERATION_DANS_C_____normaliser_les_trajectoires) \ ,NORM(Reelle(suite_point),X_COIN_BAS_GAUCHE,X_COIN_HAUT_DROITE) \ ,Reelle(suite_point) \ ) \ ,COND(IL_FAUT(gF_ITERATION_DANS_C_____normaliser_les_trajectoires) \ ,NORM(Imaginaire(suite_point),Y_COIN_BAS_GAUCHE,Y_COIN_HAUT_DROITE) \ ,Imaginaire(suite_point) \ ) \ ) \ ); \ \ Test(TOUJOURS_VRAI) \ /* Introduit le 20211013133259 pour des raisons de test... */ \ Bblock \ CAL3(Prme3(" X=%d E [%d,%d]" \ ,X \ ,gF_ITERATION_DANS_C_____Xmin__d_editions_des_trajectoires \ ,gF_ITERATION_DANS_C_____Xmax__d_editions_des_trajectoires \ ) \ ); \ CAL3(Prme3(" Y=%d E [%d,%d]" \ ,Y \ ,gF_ITERATION_DANS_C_____Ymin__d_editions_des_trajectoires \ ,gF_ITERATION_DANS_C_____Ymax__d_editions_des_trajectoires \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CALS(Fsauts_de_lignes(UN)); \ \ EGAL(gF_ITERATION_DANS_C_____une_trajectoire_est_en_cours_d_edition,VRAI); \ Eblock \ ATes \ Bblock \ EGAL(gF_ITERATION_DANS_C_____une_trajectoire_est_en_cours_d_edition,FAUX); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition eventuelle des trajectoires (introduite le 20190314180029...). */ \ /* */ \ /* On notera que cette edition est appelee deux fois par iteration. On aura alors pour */ \ /* chaque iteration les deux lignes suivantes : */ \ /* */ \ /* point=... iteration=... {Reelle(suite_point),Imaginaire(suite_point)} AVANT */ \ /* point=... iteration=... {Reelle(suite_point),Imaginaire(suite_point)} APRES */ \ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S N E C E S S A I R E S A U C A L C U L E N " F L O T T A N T " */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #define BVARIABLES_F_ITERATION_DANS_C \ /* Definition des variables communes a 'Julia' et 'Mandelbrot'. */ \ BVARIABLES_D_HOMOTHETIE_C_HC_HHC \ /* "Taille" reelle et imaginaire de la fenetre rapportee a la taille des images. */ \ DEFV(complexe,point_courant); \ /* Point complexe courant 'C' dans la fenetre. */ \ DEFV(complexe,suite_point); \ /* Suite des points complexes Z lors de l'iteration. */ \ /* n */ \ DEFV(complexe,point_manoeuvre); \ /* Point complexe de maneuvre lors de l'iteration. */ \ VARIABLES_COMMUNES_DES_ITERATIONS_DANS_C_HC_HHC; #define INITIALISATION_DU_POINT_COURANT_DANS_C \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ Bblock \ Cinitialisation(point_courant,X_IMAGE_PLAN(X),Y_IMAGE_PLAN(Y)); \ /* Le "point_courant" 'C' est le point courant {X,Y} sur le maillage de l'image. */ \ Eblock \ /* Initialisation du point complexe courant sur un maillage {X,Y}. */ DEFV(Common,DEFV(Float,ZINT(iterations_dans_C_HC_HHC_____epsilon,gEPSILON))); /* Epsilon utilise via 'TEST_D_UNDERFLOW_D_UNE_SUITE_COMPLEXE(...)' lors des iterations... */ #define TEST_D_UNDERFLOW_D_UNE_SUITE_COMPLEXE(suite_complexe,epsilon) \ Bblock \ EGAL(Reelle(suite_complexe),TROP_PETIT(Reelle(suite_complexe),epsilon)); \ EGAL(Imaginaire(suite_complexe),TROP_PETIT(Imaginaire(suite_complexe),epsilon)); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter des underflows */ \ /* flottants... */ \ Eblock \ /* Test des underflows d'une suite complexe... */ #define TEST_D_OVERFLOW_D_UNE_SUITE_COMPLEXE(suite_complexe,anti_epsilon) \ Bblock \ EGAL(Reelle(suite_complexe),TROP_GRAND(Reelle(suite_complexe),anti_epsilon)); \ EGAL(Imaginaire(suite_complexe),TROP_GRAND(Imaginaire(suite_complexe),anti_epsilon)); \ /* Lorsqu'une composante devient trop grande, on la plafonne afin d'eviter des underflows */ \ /* flottants... */ \ Eblock \ /* Test des overflows d'une suite complexe... */ #define gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES \ Bblock \ CLIR(gF_ITERATION_DANS_C_____numero_du_point_courant_edite); \ Eblock \ /* Introduit le 20190314183222... */ #define gF_ITERATION_DANS_C(test_d_arret,initialisation_point_courant,init_iteration,calculs_communs,fonc_iteration,fin_iteration) \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ /* */ \ /* L'argument 'initialisation_point_courant' a ete introduit le 20091012111043, par exemple */ \ /* pour permettre de definir le "point_courant" autrement que comme etant le point courant */ \ /* {X,Y} sur le maillage de l'image (par exemple via deux matrices d'indirection, une pour */ \ /* chaque coordonnee 'X' et 'Y'). */ \ /* */ \ /* L'argument 'fin_iteration' a ete introduit le 20150225152454... */ \ Bblock \ BLOC(initialisation_point_courant); \ /* Le "point_courant" 'C' est a priori le point courant {X,Y} sur le maillage de l'image. */ \ \ BLOC(init_iteration); \ /* Initialisation de la suite des nombres complexes sur le "point_courant", soit : */ \ /* */ \ /* Z = 0 */ \ /* 0 */ \ /* */ \ /* ou : */ \ /* */ \ /* Z = C */ \ /* 0 */ \ /* */ \ /* et, initialisation du compteur des iterations. */ \ \ Tant(IFET(test_d_arret \ ,PAS_ASSEZ_D_ITERATIONS \ ) \ ) \ Bblock \ BLOC(calculs_communs); \ \ INCR(nombre_courant_d_iterations,I); \ \ gF_ITERATION_DANS_C__EDITION_EVENTUELLE_DES_TRAJECTOIRES("/1"); \ /* Possibilite introduite le 20190314180029... */ \ \ BLOC(fonc_iteration); \ /* Puis : */ \ /* */ \ /* 2 */ \ /* Z + C */ \ /* n */ \ /* */ \ /* ou : */ \ /* */ \ /* 2 */ \ /* Z + A */ \ /* n */ \ /* */ \ /* ou encore autre chose (voir 'GENERE__FonctionP_I_ITERAT_F_C(...)') auquel cas, le */ \ /* calcul precedent de 'point_manoeuvre' peut etre inutile... */ \ \ Test(IL_FAUT(gF_ITERATION_DANS_C_____replier_l_espace)) \ Bblock \ DEFV(complexe,suite_point_manoeuvre); \ \ aCmodulo(suite_point_manoeuvre \ ,suite_point \ ,gF_ITERATION_DANS_C_____Rorigine__ \ ,gF_ITERATION_DANS_C_____Rextremite \ ,gF_ITERATION_DANS_C_____Iorigine__ \ ,gF_ITERATION_DANS_C_____Iextremite \ ); \ /* Repliement eventuel de l'espace introduit le 20121103101108... */ \ \ Cegal(suite_point,suite_point_manoeuvre); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ TEST_D_UNDERFLOW_D_UNE_SUITE_COMPLEXE(suite_point,iterations_dans_C_HC_HHC_____epsilon); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter */ \ /* des underflows flottants... */ \ \ gF_ITERATION_DANS_C__EDITION_EVENTUELLE_DES_TRAJECTOIRES("/2"); \ /* Possibilite introduite le 20190314180029... */ \ Eblock \ ETan \ \ Test(IL_FAUT(visualisation_arguments_de_sortie)) \ Bblock \ Test(IL_NE_FAUT_PAS(iterations_dans_C_HC_HHC_____memoriser_le_module_plutot_que_les_arguments)) \ Bblock \ EGAL(niveau_courant_precis \ ,Cargument_2PI(suite_point) \ ); \ EGAL(niveau_courant \ ,GENP(SCAL(niveau_courant_precis \ ,CERCLE_TRIGONOMETRIQUE \ ,BLANC \ ) \ ) \ ); \ Eblock \ ATes \ Bblock \ EGAL(niveau_courant_precis \ ,Cmodule(suite_point) \ ); \ EGAL(niveau_courant \ ,GENP(SCAL(TRON(niveau_courant_precis \ ,iterations_dans_C_HC_HHC_____minimum_du_module_a_memoriser_plutot_que_les_arguments \ ,iterations_dans_C_HC_HHC_____maximum_du_module_a_memoriser_plutot_que_les_arguments \ ) \ ,SOUS(iterations_dans_C_HC_HHC_____maximum_du_module_a_memoriser_plutot_que_les_arguments \ ,iterations_dans_C_HC_HHC_____minimum_du_module_a_memoriser_plutot_que_les_arguments \ ) \ ,BLANC \ ) \ ) \ ); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Test(IL_NE_FAUT_PAS(iterations_dans_C_HC_HHC_____visualiser_l_appartenance_plutot_que_le_nombre_d_iterations)) \ /* Test introduit le 20091119140032... */ \ Bblock \ EGAL(niveau_courant_precis \ ,CASP_Float(nombre_courant_d_iterations) \ ); \ /* La procedure 'CASP_Float(...)' a remplace un 'CASP(genere_Float,...)' le 20090331103211. */ \ EGAL(niveau_courant \ ,GENP(COND(IL_FAUT(iterations_dans_C_HC_HHC_____renormaliser_le_nombre_d_iterations) \ ,SCAL(nombre_courant_d_iterations \ ,nombre_maximal_d_iterations \ ,BLANC \ ) \ ,nombre_courant_d_iterations \ ) \ ) \ ); \ /* Visualisation du nombre d'iterations... */ \ Eblock \ ATes \ Bblock \ EGAL(niveau_courant_precis \ ,COND(PAS_ASSEZ_D_ITERATIONS \ ,fNON_APPARTENANCE_A_L_ENSEMBLE \ ,fAPPARTENANCE_A_L_ENSEMBLE \ ) \ ); \ EGAL(niveau_courant \ ,COND(PAS_ASSEZ_D_ITERATIONS \ ,NON_APPARTENANCE_A_L_ENSEMBLE \ ,APPARTENANCE_A_L_ENSEMBLE \ ) \ ); \ /* Visualisation de la non appartenance ('NOIR') et de l'appartenance ('BLANC'). Cette */ \ /* possibilite a ete introduite le 20091119140032 afin de faciliter les choses... */ \ Eblock \ ETes \ Eblock \ ETes \ \ RANGEMENT_DU_NIVEAU_COURANT_ET_EVENTUELLEMENT_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; \ /* Et enfin, marquage du point courant. */ \ \ BLOC(fin_iteration); \ /* Cette possibilite a ete introduite le 20150225152454... */ \ \ Test(IL_FAUT(gF_ITERATION_DANS_C_____editer_les_trajectoires)) \ Bblock \ Test(EST_VRAI(gF_ITERATION_DANS_C_____une_trajectoire_est_en_cours_d_edition)) \ Bblock \ INCR(gF_ITERATION_DANS_C_____numero_du_point_courant_edite,I); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock #define F_ITERATION_DANS_C(test_d_arret,init_iteration,fonc_iteration,exposant,fin_iteration) \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ /* */ \ /* L'argument 'fin_iteration' a ete introduit le 20150225152454... */ \ Bblock \ gF_ITERATION_DANS_C(test_d_arret \ ,BLOC(Bblock \ INITIALISATION_DU_POINT_COURANT_DANS_C; \ Eblock \ ) \ /* Introduit le 20091012111043... */ \ ,BLOC(init_iteration); \ ,BLOC(Bblock \ aCpuissance(point_manoeuvre,suite_point,exposant); \ /* Calculons : */ \ /* */ \ /* 2 */ \ /* Z */ \ /* n */ \ /* */ \ /* a priori (mais cela peut etre inutile dans certains cas...). */ \ /* */ \ /* Le 20091118113333 : */ \ /* */ \ /* Cproduit(point_manoeuvre,suite_point,suite_point); */ \ /* */ \ /* a ete remplace par : */ \ /* */ \ /* Cpuissance(point_manoeuvre,suite_point,exposant) */ \ /* */ \ /* ou 'exposant' sera assez souvent egal a 'ZERO'. Mais afin de garantir la compatibilite */ \ /* anterieure, meme la ou il est evident que 'ZERO' serait correct (et optimiserait les */ \ /* calculs), en fait 'DEUX' sera utilise... */ \ Eblock \ ) \ ,BLOC(fonc_iteration); \ ,BLOC(fin_iteration); \ /* Cette possibilite a ete introduite le 20150225152454... */ \ ); \ Eblock /*===================================================================================================================================*/ /* :Debut_listMN_MANDELBROT_COMPLEXE_11: */ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E M A N D E L B R O T D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Z = 0 */ /* 0 */ /* */ /* 2 */ /* Z = Z + C */ /* n+1 n */ /* */ /* (ou 'C' designe le point courant). */ /* */ /* Si |Z | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Mandelbrot. */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* ** */ /* ***** */ /* ***** */ /* * * ********* * */ /* ******************* ** */ /* ********************** */ /* ************************** */ /* **************************** */ /* * ***** **************************** */ /* *********** ***************************** */ /* ************ **************************** */ /* ********************************************************* */ /* ************ **************************** */ /* *********** ***************************** */ /* * ***** **************************** */ /* **************************** */ /* ************************** */ /* ********************** */ /* ******************* ** */ /* * * ********* * */ /* ***** */ /* ***** */ /* ** */ /* */ /* */ /* Nota : */ /* */ /* Nous verrons que l'on appelle */ /* Ensemble de Julia J les ensembles */ /* A */ /* obtenus a partir des iterations */ /* suivantes : */ /* */ /* Z = C */ /* 0 */ /* */ /* (ou 'C' designe le point courant), */ /* */ /* 2 */ /* Z = Z + A */ /* n+1 n */ /* */ /* (ou 'A' designe un nombre complexe */ /* Argument arbitraire, et parametre de l'ensemble). */ /* */ /* */ /* Si nous reecrivons la definition de */ /* l'ensemble de Mandelbrot M (en remplacant */ /* 'C' par 'A') : */ /* */ /* Z = 0 */ /* 0 */ /* */ /* (ce qui revient a faire C=0 ci-dessus, et donc */ /* a se placer a l'origine), */ /* */ /* 2 */ /* Z = Z + A */ /* n+1 n */ /* */ /* (ou 'A' designe le point courant), */ /* */ /* nous voyons que calculer M, c'est calculer */ /* en chaque point 'A' l'ensemble de Julia */ /* J (origine) a l'origine : */ /* A */ /* */ /* M(A) <==> J (origine) */ /* A */ /* */ /* or pour que J soit connexe, il faut et il */ /* A */ /* suffit que l'origine appartienne a J . Donc */ /* A */ /* M definit l'ensemble des J connexes, puisque */ /* A */ /* pour M, la suite Z reste bornee. */ /* n */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_MANDELBROT_COMPLEXE_11: */ BFonctionP DEFV(Common,DEFV(Float,SINT(Imandelbrot_dans_C_____exposant,FDEUX))); /* Introduit le 20091118113333... */ /* */ /* Le 20100608130024, le 'Int' est devenu un 'Float' pour plus de generalite... */ DEFV(Common,DEFV(Float,SINT(Imandelbrot_dans_C_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_C))); /* Seuil de divergence du carre du module d'un nombre complexe de la suite dans ce cas */ /* particulier (introduit le 20091118181636)... */ DEFV(Common,DEFV(Logical,SINT(Imandelbrot_dans_C_____charger_____l_etat_initial,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageJ,Imandelbrot_dans_C_____etat_initial),ADRESSE_NON_ENCORE_DEFINIE))); DEFV(Common,DEFV(Logical,SINT(Imandelbrot_dans_C_____sauvegarder_l_etat_final__,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageJ,Imandelbrot_dans_C_____etat_final__),ADRESSE_NON_ENCORE_DEFINIE))); /* La possibilite de charger et sauvegarder les etats initiaux et finaux a ete */ /* introduit le 20150227205446... */ DEFV(Common,DEFV(FonctionP,POINTERp(Imandelbrot_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_C /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; /* Introduit le 20190314183222... */ begin_image Bblock F_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(Imandelbrot_dans_C_____seuil_du_carre_du_module) ,BLOC(Bblock Test(IL_FAUT(Imandelbrot_dans_C_____charger_____l_etat_initial)) Bblock Cegal(suite_point,loadJ_point(Imandelbrot_dans_C_____etat_initial,X,Y)); Eblock ATes Bblock Cegal(suite_point,C_____nombre_complexe__0__0); /* Initialisation de la suite des nombres complexes sur l'origine, soit : */ /* */ /* Z = 0 */ /* 0 */ /* */ /* On notera que l'on pourrait optimiser, en partant directement sur 'C', mais la difference */ /* entre Julia et Mandelbrot ne serait plus evidente... */ Eblock ETes CLIR(nombre_courant_d_iterations); /* Initialisation du compteur des iterations. */ Eblock ) ,BLOC(Bblock aCsomme(suite_point,point_manoeuvre,point_courant); /* Puis : */ /* */ /* 2 */ /* Z + C */ /* n */ /* */ /* ou 'C' designe le point complexe Courant. */ Eblock ) ,Imandelbrot_dans_C_____exposant ,BLOC(Bblock Test(IL_FAUT(Imandelbrot_dans_C_____sauvegarder_l_etat_final__)) Bblock storeJ_point(suite_point,Imandelbrot_dans_C_____etat_final__,X,Y); Eblock ATes Bblock Eblock ETes Eblock ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E M A N D E L B R O T D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E A V E C S Y M E T R I E S E V E N T U E L L E S */ /* P A R R A P P O R T A U X A X E S R E E L E T I M A G I N A I R E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Imandelbrot_dans_C_avec_symetries_axiales_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_C))); /* Seuil de divergence du carre du module d'un nombre complexe de la suite dans ce cas */ /* particulier (introduit le 20091118181636)... */ DEFV(Common,DEFV(Float,SINT(Imandelbrot_dans_C_avec_symetries_axiales_____exposant,FDEUX))); /* Introduit le 20091118113333... */ /* */ /* Le 20100608130024, le 'Int' est devenu un 'Float' pour plus de generalite... */ DEFV(Common,DEFV(FonctionP,POINTERp(Imandelbrot_dans_C_avec_symetries_axiales(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ,faire_une_symetrie_par_rapport_a_l_axe_reel ,faire_une_symetrie_par_rapport_a_l_axe_imaginaire ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ DEFV(Argument,DEFV(Logical,faire_une_symetrie_par_rapport_a_l_axe_reel)); /* Cet indicateur logique permet de demander une symetrie par rapport a l'axe reel */ /* avant le calcul du carre de l'element courant de la suite 'Z(n)'. */ DEFV(Argument,DEFV(Logical,faire_une_symetrie_par_rapport_a_l_axe_imaginaire)); /* Cet indicateur logique permet de demander une symetrie par rapport a l'axe imaginaire */ /* avant le calcul du carre de l'element courant de la suite 'Z(n)'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_C /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; /* Introduit le 20190314183222... */ begin_image Bblock F_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(Imandelbrot_dans_C_avec_symetries_axiales_____seuil_du_carre_du_module) ,BLOC(Bblock Cegal(suite_point,C_____nombre_complexe__0__0); /* Initialisation de la suite des nombres complexes sur l'origine, soit : */ /* */ /* Z = 0 */ /* 0 */ /* */ /* On notera que l'on pourrait optimiser, en partant directement sur 'C', mais la difference */ /* entre Julia et Mandelbrot ne serait plus evidente... */ CLIR(nombre_courant_d_iterations); /* Initialisation du compteur des iterations. */ Eblock ) ,BLOC(Bblock Test(IL_FAUT(faire_une_symetrie_par_rapport_a_l_axe_reel)) Bblock EGAL(Imaginaire(suite_point),NEGA(Imaginaire(suite_point))); /* La partie Imaginaire change de signe, ce qui correspond en fait a l'operation de */ /* "conjugaison"... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(faire_une_symetrie_par_rapport_a_l_axe_imaginaire)) Bblock EGAL(Reelle(suite_point),NEGA(Reelle(suite_point))); /* La partie Reelle change de signe... */ Eblock ATes Bblock Eblock ETes aCproduit(point_manoeuvre,suite_point,suite_point); /* Malheureusement, il faut recalculer : */ /* */ /* 2 */ /* Z */ /* n */ /* */ aCsomme(suite_point,point_manoeuvre,point_courant); /* Puis : */ /* */ /* 2 */ /* Z + C */ /* n */ /* */ /* ou 'C' designe le point complexe Courant. */ Eblock ) ,Imandelbrot_dans_C_avec_symetries_axiales_____exposant ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E M A N D E L B R O T D I T " I N V E R S E " */ /* D A N S U N E F E N E T R E D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Z = C */ /* 0 */ /* */ /* 1 k */ /* Z = (---- + C) */ /* n+1 Z */ /* n */ /* */ /* (ou 'C' designe le point courant). */ /* */ /* Si |Z | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Mandelbrot "inverse"... */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* ......................######################.................... */ /* .................###############################................ */ /* ..............################-##...###############............. */ /* ...........##############.....#......--###############.......... */ /* ...........##############.............################.......... */ /* ..........#############--#................#############......... */ /* ..........##############.................#%############......... */ /* ..........#############.................O--:###########......... */ /* ..........############o:O:..............ooO############......... */ /* ..........#######o::o#----:...........:O::O%###########......... */ /* ...........######::::%-----o--o::-::--------o#########.......... */ /* ...........#########-------------------------#oo::####.......... */ /* ............######---------...........-------%::::Oo#........... */ /* .............####-----.....................---%%:###............ */ /* ...............o##-...........................--#%.............. */ /* ................................................................ */ /* ...............o##-...........................--#%.............. */ /* .............####-----.....................---%%:###............ */ /* ............######---------...........-------%::::Oo#........... */ /* ...........#########-------------------------#oo::####.......... */ /* ...........######::::%-----o--o::-::--------o#########.......... */ /* ..........#######o::o#----:...........:O::O%###########......... */ /* ..........############o:O:..............ooO############......... */ /* ..........#############.................O--:###########......... */ /* ..........##############.................#%############......... */ /* ..........#############--#................#############......... */ /* ...........##############.............################.......... */ /* ...........##############.....#......--###############.......... */ /* ..............################-##...###############............. */ /* .................###############################................ */ /* ......................######################.................... */ /* ............................----................................ */ /* */ /* (exposant=8) */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Imandelbrot_inverse_dans_C_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_C))); /* Seuil de divergence du carre du module d'un nombre complexe de la suite dans ce cas */ /* particulier (introduit le 20091118181636)... */ DEFV(Common,DEFV(FonctionP,POINTERp(Imandelbrot_inverse_dans_C(imageR ,exposant ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(Positive,exposant)); /* Exposant 'k' ci-dessus... */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_C /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; /* Introduit le 20190314183222... */ begin_image Bblock F_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(MONX(Imandelbrot_inverse_dans_C_____seuil_du_carre_du_module,exposant)) ,BLOC(Bblock Cegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le nombre courant 'C' : */ /* */ /* Z = C */ /* 0 */ /* */ CLIR(nombre_courant_d_iterations); /* Initialisation du compteur des iterations. */ Eblock ) ,BLOC(Bblock DEFV(complexe,point_manoeuvre_1); DEFV(complexe,point_manoeuvre_2); DEFV(complexe,point_manoeuvre_3); DEFV(complexe,point_manoeuvre_4); /* Points complexes de maneuvre lors de l'iteration. */ Test(IZNE(Cmodule2(suite_point))) Bblock aCquotient(point_manoeuvre_1,C_____nombre_complexe_p1__0,suite_point); /* Calcul de : */ /* */ /* 1 */ /* ---- */ /* Z */ /* n */ /* */ aCsomme(point_manoeuvre_2,point_manoeuvre_1,point_courant); /* Calcul de : */ /* */ /* 1 */ /* ---- + C */ /* Z */ /* n */ /* */ Cegal(point_manoeuvre_3,C_____nombre_complexe_p1__0); Repe(exposant) Bblock aCproduit(point_manoeuvre_4,point_manoeuvre_3,point_manoeuvre_2); Cegal(point_manoeuvre_3,point_manoeuvre_4); /* Calcul de : */ /* */ /* 1 k */ /* (---- + C) */ /* Z */ /* n */ /* */ Eblock ERep Cegal(suite_point,point_manoeuvre_3); /* Et enfin, mise a jour de : */ /* */ /* Z */ /* n */ /* */ Eblock ATes Bblock Cinitialisation(suite_point,FLOT(INFINI),FLOT(INFINI)); /* Cas d'une division par 0 : on force l'infini en se moquant du signe puisque de toute */ /* c'est ensuite 'Cmodule2(...)' qui est teste... ATTENTION, on notera l'utilisation de */ /* 'FLOT(INFINI)' et non pas de 'F_INFINI' afin d'eviter d'eventuels problemes de */ /* debordement ulterieurs... */ Eblock ETes Eblock ) ,DEUX ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /* :Debut_listMN_JULIA_COMPLEXE_11: */ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E J U L I A D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Z = C */ /* 0 */ /* */ /* (ou 'C' designe le point courant), */ /* */ /* 2 */ /* Z = Z + A */ /* n+1 n */ /* */ /* (ou 'A' designe un nombre complexe */ /* Argument arbitraire). */ /* */ /* Si |Z | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Julia */ /* calcule pour le nombre complexe 'A'. */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* *...... .....*.... */ /* *......*.................****... */ /* ********...............***..... */ /* ........**.............***..... */ /* .........**...........**........ */ /* ..........***************........ */ /* ........**...***..******...... */ /* ....*............***......... */ /* ...............**........... */ /* ..............***....*..*.. */ /* ..........********...... */ /* ...........***...... */ /* ..........**...... */ /* ........*****.. */ /* ........*..... */ /* .....***..... */ /* .....*........ */ /* ..*****........ */ /* ......**.......... */ /* ......***........... */ /* ......********.......... */ /* ..*..*....***.............. */ /* ...........**............... */ /* .........***............*.... */ /* ......******..***...**........ */ /* ........***************......... */ /* ........**...........**........ */ /* .....***.............**....... */ /* .....***...............******* */ /* ...****.................*...... */ /* ....*..... ...... */ /* ****.... */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_JULIA_COMPLEXE_11: */ BFonctionP DEFV(Common,DEFV(Float,SINT(Ijulia_dans_C_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_C))); /* Seuil de divergence du carre du module d'un nombre complexe de la suite dans ce cas */ /* particulier (introduit le 20091118181636)... */ DEFV(Common,DEFV(Float,SINT(Ijulia_dans_C_____exposant,FDEUX))); /* Introduit le 20091118113333... */ /* */ /* Le 20100608130024, le 'Int' est devenu un 'Float' pour plus de generalite... */ DEFV(Common,DEFV(Float,SINT(Ijulia_dans_C_____ponderation_point_argument_A,FU))); DEFV(Common,DEFV(Float,SINT(Ijulia_dans_C_____ponderation__point_courant_C,FZERO))); /* Introduit le 20130825092858... */ DEFV(Common,DEFV(Logical,SINT(Ijulia_dans_C_____charger_____l_etat_initial,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageJ,Ijulia_dans_C_____etat_initial),ADRESSE_NON_ENCORE_DEFINIE))); DEFV(Common,DEFV(Logical,SINT(Ijulia_dans_C_____sauvegarder_l_etat_final__,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageJ,Ijulia_dans_C_____etat_final__),ADRESSE_NON_ENCORE_DEFINIE))); /* La possibilite de charger et sauvegarder les etats initiaux et finaux a ete */ /* introduit le 20150227205446... */ DEFV(Common,DEFV(FonctionP,POINTERp(Ijulia_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(nombre_argument) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(nombre_argument))); /* Nombre complexe "generateur" de l'ensemble de Julia que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_C DEFV(complexe,point_argument); /* Point complexe argument. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; /* Introduit le 20190314183222... */ Cegal(point_argument,INDIRECT(nombre_argument)); /* Recuperation du nombre complexe "generateur"... */ begin_image Bblock F_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(Ijulia_dans_C_____seuil_du_carre_du_module) ,BLOC(Bblock Test(IL_FAUT(Ijulia_dans_C_____charger_____l_etat_initial)) Bblock Cegal(suite_point,loadJ_point(Ijulia_dans_C_____etat_initial,X,Y)); Eblock ATes Bblock Cegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* Z = C */ /* 0 */ /* */ Eblock ETes EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock DEFV(complexe,point_manoeuvre_1); aCcombinaison_lineaire_2(point_manoeuvre_1 ,Ijulia_dans_C_____ponderation_point_argument_A,point_argument ,Ijulia_dans_C_____ponderation__point_courant_C,point_courant ); aCsomme(suite_point,point_manoeuvre,point_manoeuvre_1); /* Puis : */ /* */ /* 2 */ /* Z + A */ /* n */ /* */ /* ou 'A' designe le point complexe Argument. */ /* */ /* Ou plus generalement (introduit le 20130825092858) : */ /* */ /* 2 */ /* Z + p .A + p .C */ /* n A C */ /* */ /* avec pA=1 et pC=0 par defaut... */ Eblock ) ,Ijulia_dans_C_____exposant ,BLOC(Bblock Test(IL_FAUT(Ijulia_dans_C_____sauvegarder_l_etat_final__)) Bblock storeJ_point(suite_point,Ijulia_dans_C_____etat_final__,X,Y); Eblock ATes Bblock Eblock ETes Eblock ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E V E R H U L S T D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Z = C */ /* 0 */ /* */ /* (ou 'C' designe le point courant), */ /* */ /* Z = R.Z .(1 - Z ) */ /* n+1 n n */ /* */ /* (ou 'R' designe un nombre reel Argument */ /* arbitraire appele "taux de croissance"). */ /* */ /* Si |Z | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Verhulst */ /* calcule pour le nombre reel 'R'. */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................#............................... */ /* ...............................###.............................. */ /* ................................#............................... */ /* .........................#.###########.#........................ */ /* ........................#################....................... */ /* ............####.......###################.......####........... */ /* .........##########...#####################...##########........ */ /* ....###..###########..#####################..###########..###... */ /* ################################################################ */ /* ....###..###########..#####################..###########..###... */ /* .........##########...#####################...##########........ */ /* ............####.......###################.......####........... */ /* ........................#################....................... */ /* .........................#.###########.#........................ */ /* ................................#............................... */ /* ...............................###.............................. */ /* ................................#............................... */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Logical,SINT(Iverhulst_dans_C_____utiliser_la_forme_la_plus_simple,VRAI))); /* Faut-il utiliser la forme ('VRAI') : */ /* */ /* Z = R.Z .(1 - Z ) */ /* n+1 n n */ /* */ /* ou bien la forme ('FAUX') : */ /* */ /* 2 */ /* Z = (R+1).Z - R.Z */ /* n+1 n n */ /* */ /* Ceci a ete introduit le 20040921105449. */ DEFV(Common,DEFV(Float,SINT(Iverhulst_dans_C_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_C))); /* Seuil de divergence du carre du module d'un nombre complexe de la suite dans le cas */ /* particulier du calcul de l'ensemble de Verhulst. ATTENTION : j'ai utilise quelque temps */ /* la valeur suivante : */ /* */ /* EXP2(FLOT(MILLE)) */ /* */ /* mais, je prefere revenir a la valeur standard... */ DEFV(Common,DEFV(FonctionP,POINTERp(Iverhulst_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(taux_de_croissance) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(taux_de_croissance))); /* Taux de croissance complexe 'R' de l'ensemble de Verhulst que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_C /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; /* Introduit le 20190314183222... */ begin_image Bblock F_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(Iverhulst_dans_C_____seuil_du_carre_du_module) ,BLOC(Bblock Cegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* Z = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock Test(IL_FAUT(Iverhulst_dans_C_____utiliser_la_forme_la_plus_simple)) /* Ce test a ete introduit le 20040921105449... */ Bblock DEFV(complexe,point_manoeuvre_1); DEFV(complexe,point_manoeuvre_2); /* Points complexes de maneuvre lors de l'iteration. */ aCforme_lineaire(point_manoeuvre_1,NEGA(FU),suite_point,FU); /* Calcul de : */ /* */ /* 1 - Z = -Z + 1 */ /* n n */ /* */ aCproduit(point_manoeuvre_2,suite_point,point_manoeuvre_1); /* Calcul de : */ /* */ /* Z .(1 - Z ) */ /* n n */ /* */ aCproduit(suite_point,INDIRECT(taux_de_croissance),point_manoeuvre_2); /* Calcul de : */ /* */ /* Z = R.Z .(1 - Z ) */ /* n+1 n n */ /* */ Eblock ATes Bblock /* Cette formulation a ete introduite le 20040921105449... */ DEFV(complexe,point_manoeuvre_1); DEFV(complexe,point_manoeuvre_2); DEFV(complexe,point_manoeuvre_3); DEFV(complexe,point_manoeuvre_4); /* Points complexes de maneuvre lors de l'iteration. */ aCproduit(point_manoeuvre_1,suite_point,suite_point); /* Calcul de : */ /* */ /* 2 */ /* Z */ /* n */ /* */ aCproduit(point_manoeuvre_2,INDIRECT(taux_de_croissance),point_manoeuvre_1); /* Calcul de : */ /* */ /* 2 */ /* R.Z */ /* n */ /* */ aCforme_lineaire(point_manoeuvre_3,FU,INDIRECT(taux_de_croissance),FU); /* Calcul de : */ /* */ /* R+1 */ /* */ aCproduit(point_manoeuvre_4,point_manoeuvre_3,suite_point); /* Calcul de : */ /* */ /* (R+1).Z */ /* n */ /* */ aCdifference(suite_point,point_manoeuvre_4,point_manoeuvre_2); /* Calcul de : */ /* */ /* 2 */ /* Z = (R+1).Z - R.Z */ /* n+1 n n */ /* */ Eblock ETes Eblock ) ,EXPOSANT_INUTILE /* Le 20111130114853, je note que cet argument ('DEUX') est inutile ici, de meme que */ /* calcul de 'point_manoeuvre' via 'Cpuissance(...)'. */ /* */ /* Le 20111130125631, 'DEUX' fut d'ailleurs remplace par 'EXPOSANT_INUTILE'... */ ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E C O L O N N A D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP #define TRANSFORMATION_COLONNA_1(point) \ Bblock \ Eblock \ /* "Transformation" de type 1... */ #define TRANSFORMATION_COLONNA_2(point) \ Bblock \ DEFV(Float,INIT(module,FLOT__UNDEF)); \ /* Module du nombre complexe 'point', */ \ DEFV(Float,INIT(argument,FLOT__UNDEF)); \ /* Argument du nombre complexe 'point'. */ \ EGAL(module,Cmodule(point)); \ /* Calcul du module du nombre complexe de manoeuvre, */ \ EGAL(argument,Cargument_PI(point)); \ /* Et calcul de son argument. */ \ Cinitialisation(point \ ,Xcartesienne_2D(module,argument) \ ,Ycartesienne_2D(module,argument) \ ); \ /* Et "reconstitution" du nombre complexe de manoeuvre... */ \ Eblock \ /* "Transformation" de type 2... */ #define TRANSFORMATION_COLONNA_3(point) \ Bblock \ DEFV(Float,INIT(module,FLOT__UNDEF)); \ /* Module du nombre complexe 'point', */ \ DEFV(Float,INIT(argument,FLOT__UNDEF)); \ /* Argument du nombre complexe 'point'. */ \ EGAL(module,Cmodule(point)); \ /* Calcul du module du nombre complexe de manoeuvre, */ \ EGAL(argument,Cargument_PI(point)); \ /* Et calcul de son argument, */ \ EGAL(argument,MUL2(MUL2(amplitude,module),argument)); \ /* Puis transformation de ce dernier par modulation par le 'module', */ \ /* afin de creer un effet de spirale. */ \ Cinitialisation(point \ ,Xcartesienne_2D(module,argument) \ ,Ycartesienne_2D(module,argument) \ ); \ /* Et "reconstitution" du nombre complexe de manoeuvre... */ \ Eblock \ /* "Transformation" de type 3... */ #define TRANSFORMATION_COLONNA(point) \ Bblock \ TRANSFORMATION_COLONNA_3(point) \ Eblock \ /* Transformation choisie... */ DEFV(Common,DEFV(FonctionP,POINTERp(Icolonna_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(nombre_argument) ,amplitude ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(nombre_argument))); /* Nombre complexe "generateur" de l'ensemble de COLONNA que l'on veut calculer. */ DEFV(Argument,DEFV(Float,amplitude)); /* Afin de moduler le module... */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_C DEFV(complexe,point_argument); /* Point complexe argument. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; /* Introduit le 20190314183222... */ Cegal(point_argument,INDIRECT(nombre_argument)); /* Recuperation du nombre complexe "generateur"... */ begin_image Bblock F_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(iterations_diverses_dans_C_____seuil_du_carre_du_module) ,BLOC(Bblock Cegal(suite_point,C_____nombre_complexe__0__0); /* Initialisation de la suite des nombres complexes sur l'origine, */ /* soit : */ /* */ /* Z = 0 */ /* 0 */ /* */ /* On notera que l'on pourrait optimiser, en partant directement sur 'C', mais la difference */ /* difference entre Julia et Mandelbrot ne serait plus evidente... */ CLIR(nombre_courant_d_iterations); /* Initialisation du compteur des iterations. */ Eblock ) ,BLOC(Bblock TRANSFORMATION_COLONNA(point_manoeuvre); aCsomme(suite_point,point_manoeuvre,point_courant); aCproduit(point_manoeuvre,point_argument,point_courant); TRANSFORMATION_COLONNA(point_manoeuvre); aCsomme(suite_point,suite_point,point_manoeuvre); /* Puis : */ /* */ /* 2 */ /* Z = Z + (A.Z ) + C */ /* n+1 n n */ /* */ /* ou 'C' designe le point Courant et 'A' le point Argument. */ Eblock ) ,DEUX ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock #undef TRANSFORMATION_COLONNA #undef TRANSFORMATION_COLONNA_3 #undef TRANSFORMATION_COLONNA_2 #undef TRANSFORMATION_COLONNA_1 EFonctionP /*===================================================================================================================================*/ /* :Debut_listMN_RACINES_TROISIEMES_UNITE_COMPLEXES_11: */ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E S R A C I N E S T R O I S I E M E S D E L ' U N I T E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Rappelons la methode iterative de */ /* Newton pour la resolution d'une equation */ /* du type : */ /* */ /* f(x) = 0 */ /* */ /* Soit 'G' la courbe d'equation y=f(x) : */ /* */ /* ^ */ /* Y | + / tangente en T a la courbe G */ /* | / */ /* | + / */ /* | / */ /* | +/ */ /* | *T */ /* | y = f(x) + /. */ /* | + / . */ /* | + / . */ /* | + / . */ /* | + / . */ /* ----------O----------+----/---------------------------------> */ /* | + /X X X */ /* | G + / n+1 n */ /* */ /* */ /* Partant de l'abscisse X , on determine */ /* n */ /* la tangente au point (X ,f(X )) a la courbe 'G'. */ /* n n */ /* Son equation est : */ /* */ /* y = f'(X )(x - X ) + f(X ) */ /* n n n */ /* */ /* Son intersection avec l'axe 'OX' a pour */ /* abscisse : */ /* */ /* f(X ) */ /* n */ /* X = X - -------- */ /* n+1 n f'(X ) */ /* n */ /* */ /* Enfin, on itere ce processus. */ /* */ /* */ /* De meme dans le plan complexe, soit a */ /* resoudre l'equation : */ /* */ /* 3 */ /* Z = 1 */ /* */ /* qui donne les trois racines de l'unite, on */ /* procede a l'iteration suivante : */ /* */ /* Z = C */ /* 0 */ /* */ /* 3 */ /* Z - 1 */ /* n */ /* Z = Z - -------- */ /* n+1 n 2 */ /* 3.Z */ /* n */ /* */ /* (ou 'C' designe le point courant). */ /* */ /* Si |Z | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Racine3. */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* ::::::::::::::::::::::::::::::::::::::::::::o:ooooooooooooo */ /* ::::::::::::::::::::::::::::::::::::::::::::oooooooooo:: */ /* :::::::::::::::::::::::::::::::::::::::::::::ooooooo:: */ /* :::::::::::::::::::::::::::::::::::::::::::::ooooo */ /* :::::::::::::::::::::::::::::::::::::o */ /* :::::::::::::::::::::::::::::::::::oo ooo::: */ /* ::::::::::::::::::::::::::::::::::: o::oooooo:::: */ /* :::::::::::::::::::::::::::::::::o ooooooooo::::o */ /* ::::::::::::::::::::::::::::::::: ooooooooooo ::o: */ /* :::::::::::::::::::::::::::::::::ooooooooooooo: */ /* :::::::::::::::::::::::::::::::::ooooooooooo :o */ /* :::::::::::: ::::::::::::::::::::oooooooooo:: */ /* ::::::::: oooooooo:oo :::::::::: oooooooo:: */ /* :o::::::ooooo: o::::::: ooooo */ /* :::oooo ::: ooo */ /* . */ /* ooo:::: ooo ::: */ /* o:oooooo:::::o :ooooooo ::::: */ /* ooooooooo ::::::::o:: oooooooooo ::::::::oo */ /* oooooooooooo oooooooooooooooooooo::::::::::oo */ /* ooooooooooooooooooooooooooooooooo::::::::::: o: */ /* ooooooooooooooooooooooooooooooooo:::::::::::::o */ /* ooooooooooooooooooooooooooooooooo ::::::::::: oo:o */ /* ooooooooooooooooooooooooooooooooo: :::::::::oooo: */ /* ooooooooooooooooooooooooooooooooooo :oo::::::oooo */ /* ooooooooooooooooooooooooooooooooooo:: :::ooo */ /* ooooooooooooooooooooooooooooooooooooo: */ /* ooooooooooooooooooooooooooooooooooooooooooooo::::: */ /* ooooooooooooooooooooooooooooooooooooooooooooo:::::::oo */ /* oooooooooooooooooooooooooooooooooooooooooooo::::::::::oo */ /* oooooooooooooooooooooooooooooooooooooooooooo:o::::::::::::: */ /* oooooooooooooooooooooooooooooooooooooooooooooo::::::::::ooo: */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_RACINES_TROISIEMES_UNITE_COMPLEXES_11: */ BFonctionP DEFV(Common,DEFV(Float,SINT(Iracines_troisiemes_de_l_unite_dans_C_____seuil_du_carre_du_module,F_INFINI))); /* Seuil de divergence du carre du module d'un nombre complexe de la suite dans le cas */ /* particulier de la recherche des racines troisiemes de l'unite... */ DEFV(Common,DEFV(FonctionP,POINTERp(Iracines_troisiemes_de_l_unite_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /* */ /* On notera le 20061205170611 que c'est le fait que l'on visualise a priori l'argument */ /* de sortie qui permet de visualiser la racine (parmi les 3) vers laquelle on converge, */ /* puisque qu'elles sont sur le cercle trigonometrique. Ainsi, les 3 arguments possibles */ /* sont tres differents les uns des autres et se distinguent par les couleurs. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_C DEFV(complexe,point_manoeuvre_reel); /* Constante imaginaire (1,0). */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; /* Introduit le 20190314183222... */ Cegal(point_manoeuvre_reel,C_____nombre_complexe_p1__0); /* Initialisation de la constante imaginaire (1,0). */ begin_image Bblock F_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(Iracines_troisiemes_de_l_unite_dans_C_____seuil_du_carre_du_module) ,BLOC(Bblock Cegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* Z = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock Test(IZNE(Cmodule2(suite_point))) Bblock DEFV(complexe,point_manoeuvre_1); DEFV(complexe,point_manoeuvre_2); DEFV(complexe,point_manoeuvre_3); DEFV(complexe,point_manoeuvre_4); DEFV(complexe,point_manoeuvre_5); /* Points complexes de maneuvre lors de l'iteration. */ aCforme_lineaire(point_manoeuvre_1,FLOT(TROIS),point_manoeuvre,FZERO) /* Calcul de : */ /* */ /* 2 */ /* 3.Z */ /* n */ /* */ aCproduit(point_manoeuvre_2,suite_point,point_manoeuvre); aCdifference(point_manoeuvre_3,point_manoeuvre_2,point_manoeuvre_reel); /* Puis de : */ /* */ /* 3 */ /* Z - 1 */ /* n */ /* */ aCquotient(point_manoeuvre_4,point_manoeuvre_3,point_manoeuvre_1); /* Puis de : */ /* */ /* 3 */ /* Z - 1 */ /* n */ /* -------- */ /* 2 */ /* 3.Z */ /* n */ /* */ aCdifference(point_manoeuvre_5,suite_point,point_manoeuvre_4); Cegal(suite_point,point_manoeuvre_5); /* Puis de : */ /* */ /* 3 */ /* Z - 1 */ /* n */ /* Z = Z - -------- */ /* n+1 n 2 */ /* 3.Z */ /* n */ /* */ Eblock ATes Bblock /* L'origine (0,0) est un point particulier... */ Eblock ETes Eblock ) ,EXPOSANT_INUTILE /* Le 20111130114853, je note que cet argument ('DEUX') est inutile ici, de meme que */ /* calcul de 'point_manoeuvre' via 'Cpuissance(...)'. */ /* */ /* Le 20111130125631, 'DEUX' fut d'ailleurs remplace par 'EXPOSANT_INUTILE'... */ ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /* :Debut_listMN_RACINES_N_IEMES_UNITE_COMPLEXES_11: */ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E S R A C I N E S N - I E M E S D E L ' U N I T E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Rappelons la methode iterative de */ /* Newton pour la resolution d'une equation */ /* du type : */ /* */ /* f(x) = 0 */ /* */ /* Soit 'G' la courbe d'equation y=f(x) : */ /* */ /* ^ */ /* Y | + / tangente en T a la courbe G */ /* | / */ /* | + / */ /* | / */ /* | +/ */ /* | *T */ /* | y = f(x) + /. */ /* | + / . */ /* | + / . */ /* | + / . */ /* | + / . */ /* ----------O----------+----/---------------------------------> */ /* | + /X X X */ /* | G + / n+1 n */ /* */ /* */ /* Partant de l'abscisse X , on determine */ /* n */ /* la tangente au point (X ,f(X )) a la courbe 'G'. */ /* n n */ /* Son equation est : */ /* */ /* y = f'(X )(x - X ) + f(X ) */ /* n n n */ /* */ /* Son intersection avec l'axe 'OX' a pour */ /* abscisse : */ /* */ /* f(X ) */ /* n */ /* X = X - -------- */ /* n+1 n f'(X ) */ /* n */ /* */ /* Enfin, on itere ce processus. */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_RACINES_N_IEMES_UNITE_COMPLEXES_11: */ BFonctionP DEFV(Common,DEFV(Float,SINT(Iracines_n_iemes_de_l_unite_dans_C_____seuil_du_carre_du_module,F_INFINI))); /* Seuil de divergence du carre du module d'un nombre complexe de la suite dans le cas */ /* particulier de la recherche des racines n_iemes de l'unite... */ DEFV(Common,DEFV(Logical,SINT(Iracines_n_iemes_de_l_unite_dans_C_____marquer_les_racines_de_l_unite,FAUX))); DEFV(Common,DEFV(genere_p,SINT(Iracines_n_iemes_de_l_unite_dans_C_____niveau_des_racines_de_l_unite,BLANC))); /* Introduit le 20200623115258 pour montrer la position des racines de l'unite... */ /* */ /* Le 20200627112145, je note un danger : que 'niveau_des_racines_de_l_unite', niveau de */ /* marquage des racines de l'unite soit rencontre dans 'F_ITERATION_DANS_C(...)' (soit */ /* 'v $ximcf/iterations$FON store_point.niveau_courant.imageR.X.Y.FVARIABLE..'). Mais que */ /* faire a part le test introduit le 20200627112145 ci-apres ? */ DEFV(Common,DEFV(FonctionP,POINTERp(Iracines_n_iemes_de_l_unite_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,exposant ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,exposant)); /* Exposant 'N'. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /* */ /* On notera le 20061205170611 que c'est le fait que l'on visualise a priori l'argument */ /* de sortie qui permet de visualiser la racine (parmi les N) vers laquelle on converge, */ /* puisque qu'elles sont sur le cercle trigonometrique. Ainsi, les N arguments possibles */ /* sont tres differents les uns des autres et se distinguent par les couleurs. C'est la */ /* raison pour laquelle cet argument n'est pas un parametre des programmes appelant */ /* ('v $xrc/racN.01$K visualisation_arguments_de_sortie')... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_C DEFV(complexe,exposant_complexe_moins_1); /* Exposant complexe moins 1. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; /* Introduit le 20190314183222... */ begin_image Bblock F_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(Iracines_n_iemes_de_l_unite_dans_C_____seuil_du_carre_du_module) ,BLOC(Bblock Cinitialisation(exposant_complexe_moins_1,FLOT(PRED(exposant)),I0_Complexe); /* Conversion complexe de l'exposant moins 1. */ Cegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* Z = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock Test(IZNE(Cmodule2(suite_point))) Bblock DEFV(complexe,point_manoeuvre_1); DEFV(complexe,point_manoeuvre_3); DEFV(complexe,point_manoeuvre_4); DEFV(complexe,point_manoeuvre_5); DEFV(complexe,point_manoeuvre_6); DEFV(complexe,point_manoeuvre_7); /* Points complexes de maneuvre lors de l'iteration. */ Cexponentielle_complexe(point_manoeuvre_6,suite_point,exposant_complexe_moins_1); /* Calcul de : */ /* */ /* N-1 */ /* Z */ /* n */ /* */ aCproduit(point_manoeuvre_7,suite_point,point_manoeuvre_6); /* Calcul de : */ /* */ /* N */ /* Z */ /* n */ /* */ aCforme_lineaire(point_manoeuvre_1,FLOT(exposant),point_manoeuvre_6,FZERO) /* Calcul de : */ /* */ /* N-1 */ /* N.Z */ /* n */ /* */ aCdifference(point_manoeuvre_3,point_manoeuvre_7,C_____nombre_complexe_p1__0); /* Puis de : */ /* */ /* N */ /* Z - 1 */ /* n */ /* */ aCquotient(point_manoeuvre_4,point_manoeuvre_3,point_manoeuvre_1); /* Puis de : */ /* */ /* N */ /* Z - 1 */ /* n */ /* --------- */ /* N-1 */ /* N.Z */ /* n */ /* */ aCdifference(point_manoeuvre_5,suite_point,point_manoeuvre_4); Cegal(suite_point,point_manoeuvre_5); /* Puis de : */ /* */ /* N */ /* Z - 1 */ /* n */ /* Z = Z - -------- */ /* n+1 n N-1 */ /* N.Z */ /* n */ /* */ Eblock ATes Bblock /* L'origine (0,0) est un point particulier... */ Eblock ETes Eblock ) ,EXPOSANT_INUTILE /* Le 20111130114853, je note que cet argument ('DEUX') est inutile ici, de meme que */ /* calcul de 'point_manoeuvre' via 'Cpuissance(...)'. */ /* */ /* Le 20111130125631, 'DEUX' fut d'ailleurs remplace par 'EXPOSANT_INUTILE'... */ ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image Test(IL_FAUT(Iracines_n_iemes_de_l_unite_dans_C_____marquer_les_racines_de_l_unite)) /* Introduit le 20200623115258... */ Bblock Test(IFGE(niveau_courant_maximal,Iracines_n_iemes_de_l_unite_dans_C_____niveau_des_racines_de_l_unite)) /* Introduit le 20200627112145... */ Bblock PRINT_ATTENTION("le niveau de marquage des racines de l'unite a ete rencontre lors du marquage des iterations"); CAL1(Prer2("(il vaut %d alors qu'au moins un niveau egal a %d a ete rencontre)\n" ,Iracines_n_iemes_de_l_unite_dans_C_____niveau_des_racines_de_l_unite ,niveau_courant_maximal ) ); /* Que faire alors ? Diminuer le nombre d'iterations ? */ Eblock ATes Bblock Eblock ETes Repe(exposant) Bblock DEFV(complexe,suite_point); Cinitialisation_polaire(suite_point ,Rho1_Complexe ,SCAL(CERCLE_TRIGONOMETRIQUE ,exposant ,SOUS(compteur_des_repetitions_du_Repe,PREMIERE_ITERATION_D_UN_Repe) ) ); /* Calcul exact de l'une des 'exposant's racines de l'unite... */ store_point(Iracines_n_iemes_de_l_unite_dans_C_____niveau_des_racines_de_l_unite ,imageR ,X_PLAN_IMAGE,Y_PLAN_IMAGE ,FVARIABLE ); /* Marquage de l'une des 'exposant's racines de l'unite... */ Eblock ERep Eblock ATes Bblock Eblock ETes RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' E X P O S A N T D E L Y A P U N O V */ /* D ' U N S Y S T E M E D Y N A M I Q U E D E F I N I P A R U N E S U I T E : */ /* */ /*************************************************************************************************************************************/ #define BVARIABLES_F_EXPOSANT_LYAPUNOV_SANS_point_courant \ /* Definition des variables communes a toutes les fonctions calculant l'exposant de Lyapunov */ \ /* d'un systeme dynamique... */ \ DEFV(Int,INIT(mode_de_calcul_utilise_pour_l_exposant_de_Lyapunov \ ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov \ ) \ ); \ /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ \ /* fonction iteree ; en effet, suivant les circonstances (cas ou les calculs sont purement */ \ /* elles), le mode utilise peut etre different de celui qui a ete demande... */ \ BVARIABLES_D_HOMOTHETIE_C_HC_HHC \ /* "Taille" reelle et imaginaire de la fenetre rapportee a la taille des images. */ #define BVARIABLES_F_EXPOSANT_LYAPUNOV \ /* Definition des variables communes a toutes les fonctions calculant l'exposant de Lyapunov */ \ /* d'un systeme dynamique... */ \ BVARIABLES_F_EXPOSANT_LYAPUNOV_SANS_point_courant \ /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ \ /* fonction iteree ; en effet, suivant les circonstances (cas ou les calculs sont purement */ \ /* elles), le mode utilise peut etre different de celui qui a ete demande, de meme que */ \ /* "taille" reelle et imaginaire de la fenetre rapportee a la taille des images. */ \ DEFV(complexe,point_courant); \ /* Point complexe courant 'C' dans la fenetre ; il n'est utile que pour les fonctions du */ \ /* type : */ \ /* */ \ /* IFmandelbrot_Lyapunov_dans_C(...), */ \ /* IFjulia_Lyapunov_dans_C(...), */ \ /* IFverhulst_Lyapunov_dans_C(...), */ \ /* */ #define VALIDATION_DU_MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV \ Bblock \ Choi(mode_de_calcul_demande_pour_l_exposant_de_Lyapunov) \ Bblock \ Ca3e(CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV_A_PARTIR_DE_LA_PARTIE_REELLE_DE_LA_DERIVEE \ ,CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV_A_PARTIR_DE_LA_PARTIE_IMAGINAIRE_DE_LA_DERIVEE \ ,CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV_A_PARTIR_DU_MODULE_DE_LA_DERIVEE \ ) \ Bblock \ Eblock \ ECa3 \ \ Defo \ Bblock \ PRINT_ERREUR("le mode de calcul de l'exposant de Lyapunov demande n'existe pas"); \ EGAL(mode_de_calcul_utilise_pour_l_exposant_de_Lyapunov \ ,CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV_A_PARTIR_DE_LA_PARTIE_REELLE_DE_LA_DERIVEE \ ); \ /* On force la facon de calculer l'exposant de Lyapunov lorsque le mode n'est pas reconnu. */ \ Eblock \ EDef \ Eblock \ ECho \ Eblock \ /* Validation du mode demande pour le calcul de l'exposant de Lyapunov. */ #define MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV \ Bblock \ VALIDATION_DU_MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV; \ /* Validation du mode demande pour le calcul de l'exposant de Lyapunov. */ \ \ Test(IZEQ(Imaginaire(INDIRECT(valeur_initiale_P0_de_Pn)))) \ Bblock \ EGAL(mode_de_calcul_utilise_pour_l_exposant_de_Lyapunov \ ,CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV_A_PARTIR_DE_LA_PARTIE_REELLE_DE_LA_DERIVEE \ ); \ /* Dans le cas ou le generateur est un nombre Reel, on force le mode de calcul de l'exposant */ \ /* de Lyapunov... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Choix du mode calcul de l'exposant de Lyapunov en fonction des arguments d'appel... */ #define COMMENT_CALCULER_LA_DERIVEE(methode) \ IFEQ(mode_de_calcul_utilise_pour_l_exposant_de_Lyapunov \ ,methode \ ) #define PASSAGE_DE_LA_DERIVEE_D_UNE_SUITE_A_L_EXPOSANT_DE_LYAPUNOV(derivee_courante) \ CON03(COMMENT_CALCULER_LA_DERIVEE(CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV_A_PARTIR_DE_LA_PARTIE_REELLE_DE_LA_DERIVEE) \ ,ABSO(Reelle(derivee_courante)) \ ,COMMENT_CALCULER_LA_DERIVEE(CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV_A_PARTIR_DE_LA_PARTIE_IMAGINAIRE_DE_LA_DERIVEE) \ ,ABSO(Imaginaire(derivee_courante)) \ ,COMMENT_CALCULER_LA_DERIVEE(CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV_A_PARTIR_DU_MODULE_DE_LA_DERIVEE) \ ,Cmodule(derivee_courante) \ ,FLOT__UNDEF \ ) \ /* Definition de la methode de passage de la derivee de la fonction iteree (en general */ \ /* complexe) a l'exposant de Lyapunov (du moins a la partie a cumuler...). */ #define TRES_PETIT_EXPOSANT_DE_LYAPUNOV \ F_MOINS_LE_PETIT_INFINI \ /* Valeur de l'exposant de Lyapunov lorsque il est trop petit ('log(0)' par exemple...). */ \ /* Cette valeur est de loin preferable a 'F_MOINS_L_INFINI' qui si elle est ensuite traitee */ \ /* dans des expressions arithmetiques risque de provoquer des 'OVERFLOW's... */ #define F_ITERATION_CALCUL_EXPOSANT_LYAPUNOV_DANS_C(numero_de_la_premiere_iteration,init_iteration,fonc_iteration) \ Bblock \ DEFV(Int,INIT(numero_de_l_iteration,UNDEF)); \ /* Indice 'n' de la suite 'X'... */ \ DEFV(complexe,element_courant_de_la_suite_Pn); \ /* Element courant Z de la suite. */ \ /* n */ \ DEFV(Float,INIT(approximation_de_l_exposant_de_Lyapunov,FZERO)); \ /* Valeur courante de l'approximation de l'exposant de Lyapunov. */ \ \ BLOC(init_iteration); \ /* Initialisation de la suite definissant le systeme dynamique... */ \ \ DoIn(numero_de_l_iteration \ ,numero_de_la_premiere_iteration \ ,LSTX(numero_de_la_premiere_iteration,nombre_d_iterations) \ ,I \ ) \ Bblock \ DEFV(complexe,derivee_de_la_suite_Pn); \ Cinitialisation(derivee_de_la_suite_Pn,FLOT__UNDEF,FLOT__UNDEF); \ /* Destinee a memoriser la derivee de l'element courant de la suite ; cette variable a ete */ \ /* introduite afin d'alleger les tests 'Test(...)' et 'ABSO(...)' qui vont suivre... */ \ BLOC(fonc_iteration); \ /* Calcul du systeme dynamique par iteration du calcul de la suite... */ \ \ /* ATTENTION : les tests de debordements qui suivent ne figuraient pas dans l'ancien code */ \ /* de la fonction 'IFespace_de_Lyapunov(...)', c'est-a-dire avant que ne soient introduites */ \ /* les fonctions : */ \ /* */ \ /* IFmandelbrot_Lyapunov_dans_C(...), */ \ /* IFjulia_Lyapunov_dans_C(...), */ \ /* IFverhulst_Lyapunov_dans_C(...), */ \ /* */ \ \ TEST_D_UNDERFLOW_D_UNE_SUITE_COMPLEXE(element_courant_de_la_suite_Pn,iterations_dans_C_HC_HHC_____epsilon); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter */ \ /* des underflows flottants... */ \ TEST_D_OVERFLOW_D_UNE_SUITE_COMPLEXE(element_courant_de_la_suite_Pn,RACX(F_INFINI)); \ /* Lorsqu'une composante devient trop grande, on la plafonne afin d'eviter des underflows */ \ /* flottants. On notera l'utilisation de 'RACX(...)' pour prendre en compte l'elevation au */ \ /* carre lors de l'eventuelle iteration suivante... */ \ \ TEST_D_UNDERFLOW_D_UNE_SUITE_COMPLEXE(derivee_de_la_suite_Pn,pEPSILON); \ TEST_D_OVERFLOW_D_UNE_SUITE_COMPLEXE(derivee_de_la_suite_Pn,RACX(F_INFINI)); \ /* Et on fait de meme pour la derivee... */ \ \ /* ATTENTION : les tests de debordements qui precedent ne figuraient pas dans l'ancien code */ \ /* de la fonction 'IFespace_de_Lyapunov(...)', c'est-a-dire avant que ne soient introduites */ \ /* les fonctions : */ \ /* */ \ /* IFmandelbrot_Lyapunov_dans_C(...), */ \ /* IFjulia_Lyapunov_dans_C(...), */ \ /* IFverhulst_Lyapunov_dans_C(...), */ \ /* */ \ \ Test(IZNE(PASSAGE_DE_LA_DERIVEE_D_UNE_SUITE_A_L_EXPOSANT_DE_LYAPUNOV(derivee_de_la_suite_Pn))) \ Bblock \ INCR(approximation_de_l_exposant_de_Lyapunov \ ,LOGX(PASSAGE_DE_LA_DERIVEE_D_UNE_SUITE_A_L_EXPOSANT_DE_LYAPUNOV(derivee_de_la_suite_Pn)) \ ); \ /* Et calcul itere de l'approximation de l'exposant de Lyapunov ; on regarde pour cela la */ \ /* "vitesse" a laquelle les valeurs successives de la suite augmentent ou diminuent, d'ou */ \ /* la derivee de la suite... */ \ Eblock \ ATes \ Bblock \ INCR(approximation_de_l_exposant_de_Lyapunov \ ,TRES_PETIT_EXPOSANT_DE_LYAPUNOV \ ); \ /* Et ce afin d'eviter de calculer 'LOGX(0)'. */ \ /* */ \ /* ATTENTION, la valeur 'TRES_PETIT_EXPOSANT_DE_LYAPUNOV' est telle qu'elle peut etre */ \ /* cumulee comme toute autre valeur sans risque d'OVERFLOWs ulterieurs... */ \ Eblock \ ETes \ Eblock \ EDoI \ \ EGAL(approximation_de_l_exposant_de_Lyapunov \ ,fDIVZ(DIVI(approximation_de_l_exposant_de_Lyapunov \ ,LOGX(FDEUX) \ ) \ ,FLOT(nombre_d_iterations) \ ) \ ); \ /* Et calcul de l'approximation de l'exposant de Lyapunov. On notera que l'on divise d'une */ \ /* part par log(2), et d'autre part par le nombre d'iterations. C'est uniquement pour faire */ \ /* "joli", puisqu'en general il y a apres un appel a 'Ifloat_std_avec_renormalisation(...)'. */ \ /* */ \ /* Le 20071201105941 'DIVZ(...)' fut remplace tardivement par 'fDIVZ(...)'... */ \ \ Test(IFET(IL_NE_FAUT_PAS(visualiser_les_exposants_negatifs) \ ,IZLT(approximation_de_l_exposant_de_Lyapunov) \ ) \ ) \ Bblock \ EGAL(approximation_de_l_exposant_de_Lyapunov,FZERO); \ /* Lorsqu'il faut ignorer les exposants negatifs (correspondant, rappelons-le aux parties */ \ /* stables), on ramene l'approximation a zero... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFET(IL_NE_FAUT_PAS(visualiser_les_exposants_positifs) \ ,IZGT(approximation_de_l_exposant_de_Lyapunov) \ ) \ ) \ Bblock \ EGAL(approximation_de_l_exposant_de_Lyapunov,FZERO); \ /* Lorsqu'il faut ignorer les exposants positifs (correspondant, rappelons-le aux parties */ \ /* chaotiques), on ramene l'approximation a zero... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ storeF_point(MUL2(facteur_multiplicatif,approximation_de_l_exposant_de_Lyapunov) \ ,imageR \ ,X,Y \ ); \ /* Generation de l'image "flottante"... */ \ Eblock \ /* Calcul general de l'exposant de Lyapunov d'un systeme dynamique defini par une suite... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " F L O T T A N T " D E L ' E X P O S A N T D E L Y A P U N O V */ /* P O U R L ' E N S E M B L E D E M A N D E L B R O T */ /* D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Voir la fonction 'Imandelbrot_dans_C(...)'. */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,POINTERF(IFmandelbrot_Lyapunov_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ) ) ) DEFV(Argument,DEFV(imageF,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ DEFV(Argument,DEFV(Int,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov)); /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ /* fonction iteree (voir 'choix_du_mode_de_calcul_de_l_exposant_de_Lyapunov' dans le */ /* fichier 'v $ximcf/iterations$DEF'). */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_negatifs)); /* Cet indicateur logique controle la visualisation des zones des parties stables. Il */ /* permet de visualiser les exposants negatifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties stables. */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_positifs)); /* Cet indicateur logique controle la visualisation des zones des parties chaotiques. Il */ /* permet de visualiser les exposants positifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties chaotiques. */ DEFV(Argument,DEFV(Float,facteur_multiplicatif)); /* Ce facteur multiplicatif est la uniquement pour permettre de faire en quelque sorte une */ /* inversion video du champ genere (pour la valeur -1.0). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_EXPOSANT_LYAPUNOV /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; VALIDATION_DU_MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV; /* Choix du mode calcul de l'exposant de Lyapunov en fonction des arguments d'appel... */ CALS(IFinitialisation(imageR,FZERO)); /* Initialisation, on ne sait jamais... */ begin_image Bblock F_ITERATION_CALCUL_EXPOSANT_LYAPUNOV_DANS_C(PREMIERE_ITERATION_DANS_L_ESPACE_DE_LYAPUNOV ,BLOC(Bblock INITIALISATION_DU_POINT_COURANT_DANS_C; /* Initialisation du "point Courant" 'C'. */ Cegal(element_courant_de_la_suite_Pn,C_____nombre_complexe__0__0); /* Initialisation de la suite des nombres complexes sur l'origine, soit : */ /* */ /* Z = 0 */ /* 0 */ /* */ /* on notera que l'on pourrait optimiser, en partant directement sur 'C', mais alors, la */ /* difference entre Julia et Mandelbrot ne serait plus evidente... */ Eblock ) ,BLOC(Bblock DEFV(complexe,point_manoeuvre); /* Point complexe de maneuvre lors de l'iteration. */ aCproduit(point_manoeuvre ,element_courant_de_la_suite_Pn ,element_courant_de_la_suite_Pn ); aCsomme(element_courant_de_la_suite_Pn,point_manoeuvre ,point_courant); /* Calcul de : */ /* */ /* 2 */ /* Z = Z + C */ /* n+1 n */ /* */ /* ou 'C' designe le point complexe Courant. */ aCforme_lineaire(derivee_de_la_suite_Pn ,FDEUX ,element_courant_de_la_suite_Pn ,FZERO ); /* Calcul de : */ /* */ /* d(Z ) = 2.Z */ /* n+1 n */ /* */ Eblock ) ); Eblock end_image RETIF(imageR); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " S T A N D A R D " D E L ' E X P O S A N T D E L Y A P U N O V */ /* P O U R L ' E N S E M B L E D E M A N D E L B R O T */ /* D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Voir la fonction 'Imandelbrot_dans_C(...)'. */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Imandelbrot_Lyapunov_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ DEFV(Argument,DEFV(Int,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov)); /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ /* fonction iteree (voir 'choix_du_mode_de_calcul_de_l_exposant_de_Lyapunov' dans le */ /* fichier 'v $ximcf/iterations$DEF'). */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_negatifs)); /* Cet indicateur logique controle la visualisation des zones des parties stables. Il */ /* permet de visualiser les exposants negatifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties stables. */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_positifs)); /* Cet indicateur logique controle la visualisation des zones des parties chaotiques. Il */ /* permet de visualiser les exposants positifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties chaotiques. */ DEFV(Argument,DEFV(Float,facteur_multiplicatif)); /* Ce facteur multiplicatif est la uniquement pour permettre de faire en quelque sorte une */ /* inversion video du champ genere (pour la valeur -1.0). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_EXPOSANT_LYAPUNOV_SANS_point_courant BDEFV(imageF,ensemble_de_Mandelbrot); /* Exposant de Lyapunov d'un morceau de l'ensemble de Mandelbrot "flottant"... */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; VALIDATION_DU_MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV; /* Choix du mode calcul de l'exposant de Lyapunov en fonction des arguments d'appel... */ CALS(IFmandelbrot_Lyapunov_dans_C(ensemble_de_Mandelbrot ,coin_bas_gauche ,coin_haut_droite ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ); /* Calcul de l'exposant de Lyapunov d'un morceau de l'ensemble de Mandelbrot en "flottant", */ /* et donc sans renormalisation... */ CALS(Ifloat_std_avec_renormalisation(imageR,ensemble_de_Mandelbrot)); /* Et enfin, conversion du champ flottant en une image avec renormalisation. */ EDEFV(imageF,ensemble_de_Mandelbrot); /* Exposant de Lyapunov d'un morceau de l'ensemble de Mandelbrot "flottant"... */ RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " F L O T T A N T " D E L ' E X P O S A N T D E L Y A P U N O V */ /* P O U R L ' E N S E M B L E D E J U L I A */ /* D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Voir la fonction 'Ijulia_dans_C(...)'. */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,POINTERF(IFjulia_Lyapunov_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(nombre_argument) ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ) ) ) DEFV(Argument,DEFV(imageF,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(nombre_argument))); /* Nombre complexe "generateur" de l'ensemble de Julia que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ DEFV(Argument,DEFV(Int,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov)); /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ /* fonction iteree (voir 'choix_du_mode_de_calcul_de_l_exposant_de_Lyapunov' dans le */ /* fichier 'v $ximcf/iterations$DEF'). */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_negatifs)); /* Cet indicateur logique controle la visualisation des zones des parties stables. Il */ /* permet de visualiser les exposants negatifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties stables. */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_positifs)); /* Cet indicateur logique controle la visualisation des zones des parties chaotiques. Il */ /* permet de visualiser les exposants positifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties chaotiques. */ DEFV(Argument,DEFV(Float,facteur_multiplicatif)); /* Ce facteur multiplicatif est la uniquement pour permettre de faire en quelque sorte une */ /* inversion video du champ genere (pour la valeur -1.0). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_EXPOSANT_LYAPUNOV DEFV(complexe,point_argument); /* Point complexe argument. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; VALIDATION_DU_MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV; /* Choix du mode calcul de l'exposant de Lyapunov en fonction des arguments d'appel... */ CALS(IFinitialisation(imageR,FZERO)); /* Initialisation, on ne sait jamais... */ Cegal(point_argument,INDIRECT(nombre_argument)); /* Recuperation du nombre complexe "generateur"... */ begin_image Bblock F_ITERATION_CALCUL_EXPOSANT_LYAPUNOV_DANS_C(PREMIERE_ITERATION_DANS_L_ESPACE_DE_LYAPUNOV ,BLOC(Bblock INITIALISATION_DU_POINT_COURANT_DANS_C; /* Initialisation du "point Courant" 'C'. */ Cegal(element_courant_de_la_suite_Pn,point_courant); /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', soit : */ /* */ /* Z = C */ /* 0 */ /* */ Eblock ) ,BLOC(Bblock DEFV(complexe,point_manoeuvre); /* Point complexe de maneuvre lors de l'iteration. */ aCproduit(point_manoeuvre ,element_courant_de_la_suite_Pn ,element_courant_de_la_suite_Pn ); aCsomme(element_courant_de_la_suite_Pn,point_manoeuvre,point_argument); /* Calcul de : */ /* 2 */ /* Z = Z + A */ /* n+1 n */ /* */ /* ou 'A' designe le point complexe Argument. */ aCforme_lineaire(derivee_de_la_suite_Pn ,FDEUX ,element_courant_de_la_suite_Pn ,FZERO ); /* Calcul de : */ /* */ /* d(Z ) = 2.Z */ /* n+1 n */ /* */ Eblock ) ); Eblock end_image RETIF(imageR); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " S T A N D A R D " D E L ' E X P O S A N T D E L Y A P U N O V */ /* P O U R L ' E N S E M B L E D E J U L I A */ /* D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Voir la fonction 'Ijulia_dans_C(...)'. */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Ijulia_Lyapunov_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(nombre_argument) ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(nombre_argument))); /* Nombre complexe "generateur" de l'ensemble de Julia que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ DEFV(Argument,DEFV(Int,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov)); /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ /* fonction iteree (voir 'choix_du_mode_de_calcul_de_l_exposant_de_Lyapunov' dans le */ /* fichier 'v $ximcf/iterations$DEF'). */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_negatifs)); /* Cet indicateur logique controle la visualisation des zones des parties stables. Il */ /* permet de visualiser les exposants negatifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties stables. */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_positifs)); /* Cet indicateur logique controle la visualisation des zones des parties chaotiques. Il */ /* permet de visualiser les exposants positifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties chaotiques. */ DEFV(Argument,DEFV(Float,facteur_multiplicatif)); /* Ce facteur multiplicatif est la uniquement pour permettre de faire en quelque sorte une */ /* inversion video du champ genere (pour la valeur -1.0). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_EXPOSANT_LYAPUNOV_SANS_point_courant BDEFV(imageF,ensemble_de_Julia); /* Exposant de Lyapunov d'un morceau de l'ensemble de Julia "flottant"... */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; VALIDATION_DU_MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV; /* Choix du mode calcul de l'exposant de Lyapunov en fonction des arguments d'appel... */ CALS(IFjulia_Lyapunov_dans_C(ensemble_de_Julia ,coin_bas_gauche ,coin_haut_droite ,nombre_argument ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ); /* Calcul de l'exposant de Lyapunov d'un morceau de l'ensemble de Julia en "flottant", */ /* et donc sans renormalisation... */ CALS(Ifloat_std_avec_renormalisation(imageR,ensemble_de_Julia)); /* Et enfin, conversion du champ flottant en une image avec renormalisation. */ EDEFV(imageF,ensemble_de_Julia); /* Exposant de Lyapunov d'un morceau de l'ensemble de Julia "flottant"... */ RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " F L O T T A N T " D E L ' E X P O S A N T D E L Y A P U N O V */ /* P O U R L ' E N S E M B L E D E V E R H U L S T */ /* D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Voir la fonction 'Iverhulst_dans_C(...)'. */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,POINTERF(IFverhulst_Lyapunov_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(taux_de_croissance) ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ) ) ) DEFV(Argument,DEFV(imageF,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(taux_de_croissance))); /* Taux de croissance complexe 'R' de l'ensemble de Verhulst que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ DEFV(Argument,DEFV(Int,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov)); /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ /* fonction iteree (voir 'choix_du_mode_de_calcul_de_l_exposant_de_Lyapunov' dans le */ /* fichier 'v $ximcf/iterations$DEF'). */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_negatifs)); /* Cet indicateur logique controle la visualisation des zones des parties stables. Il */ /* permet de visualiser les exposants negatifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties stables. */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_positifs)); /* Cet indicateur logique controle la visualisation des zones des parties chaotiques. Il */ /* permet de visualiser les exposants positifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties chaotiques. */ DEFV(Argument,DEFV(Float,facteur_multiplicatif)); /* Ce facteur multiplicatif est la uniquement pour permettre de faire en quelque sorte une */ /* inversion video du champ genere (pour la valeur -1.0). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_EXPOSANT_LYAPUNOV /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; VALIDATION_DU_MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV; /* Choix du mode calcul de l'exposant de Lyapunov en fonction des arguments d'appel... */ CALS(IFinitialisation(imageR,FZERO)); /* Initialisation, on ne sait jamais... */ begin_image Bblock F_ITERATION_CALCUL_EXPOSANT_LYAPUNOV_DANS_C(PREMIERE_ITERATION_DANS_L_ESPACE_DE_LYAPUNOV ,BLOC(Bblock INITIALISATION_DU_POINT_COURANT_DANS_C; /* Initialisation du "point Courant" 'C'. */ Cegal(element_courant_de_la_suite_Pn,point_courant); /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', soit : */ /* */ /* Z = C */ /* 0 */ /* */ Eblock ) ,BLOC(Bblock DEFV(complexe,point_manoeuvre_1); DEFV(complexe,point_manoeuvre_2); /* Points complexes de maneuvre lors de l'iteration. */ aCforme_lineaire(point_manoeuvre_1 ,NEGA(FU) ,element_courant_de_la_suite_Pn ,FU ); /* Calcul de : */ /* */ /* 1 - Z = -Z + 1 */ /* n n */ /* */ aCproduit(point_manoeuvre_2 ,element_courant_de_la_suite_Pn ,point_manoeuvre_1 ); /* Calcul de : */ /* */ /* Z .(1 - Z ) */ /* n n */ /* */ aCproduit(element_courant_de_la_suite_Pn ,INDIRECT(taux_de_croissance) ,point_manoeuvre_2 ); /* Calcul de : */ /* */ /* Z = R.Z .(1 - Z ) */ /* n+1 n n */ /* */ aCproduit(point_manoeuvre_1 ,INDIRECT(taux_de_croissance) ,element_courant_de_la_suite_Pn ); /* Calcul de : */ /* */ /* R.Z */ /* n */ /* */ aCforme_lineaire(point_manoeuvre_2,NEGA(FDEUX),point_manoeuvre_1,FZERO); /* Calcul de : */ /* */ /* -2.R.Z */ /* n */ /* */ aCsomme(derivee_de_la_suite_Pn ,point_manoeuvre_2 ,INDIRECT(taux_de_croissance) ); /* Calcul de : */ /* */ /* d(Z ) = R - 2.R.Z */ /* n+1 n */ /* */ /* d(Z ) = -2.R.Z + R */ /* n+1 n */ /* */ Eblock ) ); Eblock end_image RETIF(imageR); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " S T A N D A R D " D E L ' E X P O S A N T D E L Y A P U N O V */ /* P O U R L ' E N S E M B L E D E V E R H U L S T */ /* D A N S U N E F E N E T R E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Voir la fonction 'Iverhulst_dans_C(...)'. */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Iverhulst_Lyapunov_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(taux_de_croissance) ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(taux_de_croissance))); /* Taux de croissance complexe 'R' de l'ensemble de Verhulst que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ DEFV(Argument,DEFV(Int,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov)); /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ /* fonction iteree (voir 'choix_du_mode_de_calcul_de_l_exposant_de_Lyapunov' dans le */ /* fichier 'v $ximcf/iterations$DEF'). */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_negatifs)); /* Cet indicateur logique controle la visualisation des zones des parties stables. Il */ /* permet de visualiser les exposants negatifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties stables. */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_positifs)); /* Cet indicateur logique controle la visualisation des zones des parties chaotiques. Il */ /* permet de visualiser les exposants positifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties chaotiques. */ DEFV(Argument,DEFV(Float,facteur_multiplicatif)); /* Ce facteur multiplicatif est la uniquement pour permettre de faire en quelque sorte une */ /* inversion video du champ genere (pour la valeur -1.0). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_EXPOSANT_LYAPUNOV_SANS_point_courant BDEFV(imageF,ensemble_de_Verhulst); /* Exposant de Lyapunov d'un morceau de l'ensemble de Verhulst "flottant"... */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; VALIDATION_DU_MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV; /* Choix du mode calcul de l'exposant de Lyapunov en fonction des arguments d'appel... */ CALS(IFverhulst_Lyapunov_dans_C(ensemble_de_Verhulst ,coin_bas_gauche ,coin_haut_droite ,taux_de_croissance ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ); /* Calcul de l'exposant de Lyapunov d'un morceau de l'ensemble de Verhulst en "flottant", */ /* et donc sans renormalisation... */ CALS(Ifloat_std_avec_renormalisation(imageR,ensemble_de_Verhulst)); /* Et enfin, conversion du champ flottant en une image avec renormalisation. */ EDEFV(imageF,ensemble_de_Verhulst); /* Exposant de Lyapunov d'un morceau de l'ensemble de Verhulst "flottant"... */ RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /* :Debut_listMN_ESPACE_LYAPUNOV_COMPLEXE_11: */ /*************************************************************************************************************************************/ /* */ /* E S P A C E D E V E R H U L S T - L Y A P U N O V : */ /* */ /* */ /* Definition : */ /* */ /* Rappelons le principe de la Dynamique de */ /* Verhulst (voir les fichiers 'v $xrk/verhulst.??$K'). */ /* Une version "simplifiee" est donnee par l'iteration */ /* suivante : */ /* */ /* X = R.X .(1 - X ) */ /* n+1 n n */ /* */ /* Le comportement de cette suite depend fortement de */ /* la valeur de 'R', et pour R > 3.56994571869, son */ /* comportement devient chaotique, ainsi que le montre */ /* le graphe suivant : */ /* */ /* */ /* R ^ */ /* | . */ /* |*** * *** * * * * . */ /* | * * * *** * * * * ** * * ** . */ /* | * . */ /* | *** ** ** * * * * ** *. */ /* | * * . */ /* | * *** ** * * * * * *. */ /* | * * * ** * * * * * . */ /* | * ** * *** * . */ /* | * * * ** * . */ /* | * * * * * * * . */ /* | * * * * * ** * * ** . */ /* | ** ** ** * * * . */ /* | ** **** * * * . */ /* | * * * * . */ /* | * * * . */ /* | * * . */ /* | * * . */ /* | * * . */ /* | * . */ /* | * . */ /* | * . */ /* | * . */ /* | * . */ /* | * . */ /* | * . */ /* | * . */ /* | * . */ /* | * . */ /* | * . */ /* | . */ /* |-------------------------------------------------------------------------> */ /* 0 1 X */ /* n */ /* */ /* */ /* La dynamique de Markus, utilise la meme suite, */ /* mais le taux de croissance 'R' change a chaque */ /* iteration suivant une certaine loi en prenant */ /* deux valeurs possibles 'R1' et 'R2'. J'ai etendu */ /* cela a 3 valeurs 'R1', 'R2' et 'R3'. Ainsi, la loi */ /* de variation pourra etre : */ /* */ /* R1 --> R2 --> R3 --> R1 --> R2 --> R3 --> ... */ /* */ /* Le triplet (R1,R2,R3) est considere comme etant */ /* les coordonnees {X,Y,Z} d'un point d'un espace */ /* tridimensionnel, dont le coloriage est fonction */ /* du caractere chaotique de la suite 'X' associe. */ /* Le critere de chaos est donne par l'exposant de */ /* Lyapunov ; lorsque celui-ci est negatif, la suite */ /* 'X' est stable, alors que lorsqu'il est positif, */ /* cette derniere est chaotique. Ainsi, seront obtenues */ /* des coupes du type : */ /* */ /* */ /* #########################*o*#################################### */ /* #########################*o*#################################### */ /* #########################o**#################################### */ /* ########################*-*#######*############################# */ /* ########################*o*#######*############################# */ /* #######################*o**##################################### */ /* #######################*o*###################################### */ /* ######################*o**###################################### */ /* ######################*-**#######*############################## */ /* #####################**o*########o###########################*## */ /* #####################*+**########*############################## */ /* ####################**o*######################################## */ /* ####################*o**######################################## */ /* ###################**o**######################################## */ /* ###################*o**#########*####################*****###### */ /* ##################**o**#########*############################### */ /* #######***o***####*o**########################################## */ /* #################**o**########################################## */ /* ################**o**###############################********o+*o */ /* ################*oo**##########*###############**oo+o*****###### */ /* ###############**+***##########o###############**############### */ /* ###############*oo**###########*################################ */ /* ##############**:***############################################ */ /* ########*####**oo**############################################# */ /* *********###**o+***############################################# */ /* ***ooo+o####**+o**############*################################# */ /* +oo****####**oo***############o################################# */ /* ****######**o+***#############*################################# */ /* #########***+o**##############*################################# */ /* ########***oo***################################################ */ /* #######***oo***##############*################################## */ /* ######***o-o***##############*################################## */ /* */ /* */ /* ou en "negatif" : */ /* */ /* */ /* . . */ /* */ /* . */ /* . . . */ /* . */ /* . : */ /* . : */ /* . . */ /* . . */ /* . */ /* . */ /* . . . */ /* . . */ /* . - . */ /* . . */ /* . . . */ /* . : */ /* . .. . . */ /* .. ... .. . */ /* ... ....... + */ /* ..... ...:.... . */ /* ..:...........::-.. . */ /* ....:::.:::-:+:.. . */ /* .........::.. . */ /* ......:... : . */ /* ........ : */ /* ...+.. . */ /* ...:.. . */ /* ...:.. . - */ /* ..... : . . */ /* ...... : .. */ /* ..:.. . .. */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_ESPACE_LYAPUNOV_COMPLEXE_11: */ #define FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_01(x,precision) \ NEUT(x) \ /* Choix d'une precision egale a celle de la machine telle qu'elle est programmee. */ #nodefine FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_02(x,precision) \ DIVI(ARRO(MUL2(x,FLOT(precision))) \ ,FLOT(precision) \ ) \ /* Choix d'une precision variable definie par 'precision' qui sera en general une puissance */ \ /* de 10... */ \ /* */ \ /* Le 20030222103003, 'FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_02(...)' */ \ /* est passe de 'define' a 'nodefine' afin de ne pas etre recupere par le processus */ \ /* 'v $xcc/cpp$Z _VERSION_'. */ #ifdef FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ DEFV(Common,DEFV(Logical,_____FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_01)); #Aifdef FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #Eifdef FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ #ifdef FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ DEFV(Common,DEFV(Logical,_____FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_02)); #Aifdef FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ #Eifdef FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ DEFV(Common,DEFV(Int,ZINT(espace_de_Lyapunov_____precision,CENT_MILLE))); /* Definition de la precision des calculs en 'VERSION_02'... */ #define FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV(x) \ FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_01(x,espace_de_Lyapunov_____precision) \ /* Choix d'une precision courante a adopter pour les calculs. Cette fonction devra etre */ \ /* appliquee a toute valeur flottante : les variables, mais aussi malheureusement toutes */ \ /* les expressions intermediaires. Pour simplifier, on pourra ecrire peut-etre : */ \ /* */ \ /* #define DYNAMIQUE_DE_VERHULST_REELLE(...) \ */ \ /* FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV(MUL2(... \ */ \ /* ... \ */ \ /* ) \ */ \ /* ) \ */ \ /* */ \ /* #define DERIVEE_DE_LA_DYNAMIQUE_DE_VERHULST_REELLE(...) \ */ \ /* FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV(MUL2(... \ */ \ /* ... \ */ \ /* ) \ */ \ /* ) \ */ \ /* */ \ /* la fonction de precision portant globalement sur la formule, et non pas sur tous les */ \ /* resultats intermediaires... */ #define QUEL_TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV(taux_de_croissance) \ IFEQ(ITb0(suite_des_taux_de_croissance \ ,INDX(numero_de_l_iteration,PREMIERE_ITERATION_DANS_L_ESPACE_DE_LYAPUNOV) \ ) \ ,taux_de_croissance \ ) #define TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV \ CON07(QUEL_TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV(TAUX_DE_CROISSANCE_R1_DANS_L_ESPACE_DE_LYAPUNOV) \ ,IFespace_de_Lyapunov_____R1 \ ,QUEL_TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV(TAUX_DE_CROISSANCE_R2_DANS_L_ESPACE_DE_LYAPUNOV) \ ,IFespace_de_Lyapunov_____R2 \ ,QUEL_TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV(TAUX_DE_CROISSANCE_R3_DANS_L_ESPACE_DE_LYAPUNOV) \ ,IFespace_de_Lyapunov_____R3 \ ,QUEL_TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV(TAUX_DE_CROISSANCE_R4_DANS_L_ESPACE_DE_LYAPUNOV) \ ,IFespace_de_Lyapunov_____R4 \ ,QUEL_TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV(TAUX_DE_CROISSANCE_R5_DANS_L_ESPACE_DE_LYAPUNOV) \ ,IFespace_de_Lyapunov_____R5 \ ,QUEL_TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV(TAUX_DE_CROISSANCE_R6_DANS_L_ESPACE_DE_LYAPUNOV) \ ,IFespace_de_Lyapunov_____R6 \ ,QUEL_TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV(TAUX_DE_CROISSANCE_R7_DANS_L_ESPACE_DE_LYAPUNOV) \ ,IFespace_de_Lyapunov_____R7 \ ,ABSO(ITb0(suite_des_taux_de_croissance \ ,INDX(numero_de_l_iteration,PREMIERE_ITERATION_DANS_L_ESPACE_DE_LYAPUNOV) \ ) \ ) \ ) /* Fonction de selection d'un taux de croissance en fonction de l'indice courant 'n' de */ /* de l'iteration. On choisit pour : */ /* */ /* R1 : la coordonnee 'X' dans le plan complexe, */ /* R2 : la coordonnee 'Y' dans le plan complexe, */ /* R3 : la coordonnee 'Z' Argument. */ /* */ /* Le 20101103112420 la valeur 'FLOT__UNDEF' qui etait forcee jusqu'a cette date dans le */ /* cas ou aucun code {R1,R2,R3} n'etait reconnu a ete remplace par la valeur courante de */ /* 'suite_des_taux_de_croissance' afin de permettre ainsi des taux de croissance absolument */ /* quelconques. On notera que l'on prend la valeur absolue car, en effet, un taux de */ /* croissance est evidemment positif ; malgre cela, il est suggere dans ce cas de mettre */ /* dans 'suite_des_taux_de_croissance' des valeurs negatives afin d'eviter des confusions */ /* avec {R1,R2,R3}... */ /* */ /* Le 20151006085649 a ete introduite 'CON03(...)' afin d'alleger la syntaxe et d'anticiper */ /* l'introduction de 'CON05(...)'. */ /* */ /* L'introduction de 'CON05(...)' a eu lieu le 20151006091325. */ /* */ /* Le 20151007091822, 'CON05(...)' a ete remplace par 'CON07(...)'. On notera que */ /* l'utilisation d'un nombre impair de coordonnees {R1,R2,R3,R4,R5,R6,R7} est destine a */ /* faciliter l'usage fait dans 'v $xiirc/.LYAP.C3.1.$U .xci.valeurs_trig.X'... */ DEFV(Common,DEFV(Float,ZINT(espace_de_Lyapunov_____constante_de_complementation,FU))); /* Constante introduite le 20160721163549 lorsque je me suis rendu compte que cette */ /* constante pouvait varier jusqu'a 1.1111111... */ #define CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_REELLE(suite_Pn,taux_de_croissance) \ Bblock \ DEFV(complexe,suite_Pn_etendue); \ /* Pour calculer l'eventuelle suite etendue... */ \ \ Test(IFEQ(IFespace_de_Lyapunov_____exposant,FU)) \ Bblock \ Cegal(suite_Pn_etendue \ ,suite_Pn \ ); \ /* Optimisation pour un exposant egal a 1... */ \ Eblock \ ATes \ Bblock \ Cinitialisation(suite_Pn_etendue \ ,PUIX(Reelle(suite_Pn),IFespace_de_Lyapunov_____exposant) \ ,NEUT(Imaginaire(suite_Pn)) \ ); \ Eblock \ ETes \ \ UTILISER_EVENTUELLEMENT_L_ARITHMETIQUE_ETENDUE_DANS_C \ (VRAI \ ,BLOC( \ Bblock \ Cinitialisation(suite_Pn \ ,MUL2(taux_de_croissance \ ,MUL2(Reelle(suite_Pn_etendue) \ ,SOUS(espace_de_Lyapunov_____constante_de_complementation \ ,Reelle(suite_Pn_etendue) \ ) \ ) \ ) \ ,NEUT(Imaginaire(suite_Pn_etendue)) \ ); \ /* Calcul itere de la suite : */ \ /* */ \ /* X = R.X .(1 - X ) */ \ /* n+1 n n */ \ /* */ \ /* L'utilisation possible du 'GooF' a ete introduit le 20181108123454 et on notera qu'elle */ \ /* est controlee par 'C_____si_GooF_activable_arithmetique_etendue_au_lieu_arithmetique...' */ \ /* meme si on semble etre dans les reels, mais en fait il s'agit de complexes a parties */ \ /* imaginaires nulles... */ \ /* */ \ /* Le 20151031085602, la suite a ete generalisee de la facon suivante : */ \ /* */ \ /* p p */ \ /* X = R.X .(1 - X ) */ \ /* n+1 n n */ \ /* */ \ /* ou 'p' designe un certain exposant (evidemment egal a 1 par defaut...). */ \ Eblock \ ) \ ); \ Eblock \ /* Procedure introduite le 20151030100641... */ #define CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_IMAGINAIRE(suite_Pn,taux_de_croissance) \ Bblock \ DEFV(complexe,point_manoeuvre_1); \ DEFV(complexe,point_manoeuvre_2); \ /* Points complexes de maneuvre lors de l'iteration. */ \ DEFV(complexe,suite_Pn_etendue); \ /* Pour calculer l'eventuelle suite etendue... */ \ \ aCpuissance(suite_Pn_etendue \ ,suite_Pn \ ,IFespace_de_Lyapunov_____exposant \ ); \ /* Le 20151031085602, la suite a ete generalisee de la facon suivante : */ \ /* */ \ /* p p */ \ /* Z = R.Z .(1 - Z ) */ \ /* n+1 n n */ \ /* */ \ /* ou 'p' designe un certain exposant (evidemment egal a 1 par defaut...). */ \ \ aCforme_lineaire(point_manoeuvre_1 \ ,NEGA(FU) \ ,suite_Pn_etendue \ ,espace_de_Lyapunov_____constante_de_complementation \ ); \ /* Calcul de : */ \ /* */ \ /* 1 - Z = -Z + 1 */ \ /* n n */ \ /* */ \ \ aCproduit(point_manoeuvre_2 \ ,suite_Pn_etendue \ ,point_manoeuvre_1 \ ); \ /* Calcul de : */ \ /* */ \ /* Z .(1 - Z ) */ \ /* n n */ \ /* */ \ \ aCforme_lineaire(suite_Pn \ ,taux_de_croissance \ ,point_manoeuvre_2 \ ,FZERO \ ); \ /* Calcul de : */ \ /* */ \ /* Z = R.Z .(1 - Z ) */ \ /* n+1 n n */ \ /* */ \ Eblock \ /* Procedure introduite le 20151030100641... */ #define CALCUL_DE_LA_DERIVEE_DE_LA_DYNAMIQUE_DE_VERHULST_REELLE(suite_Pn,derivee_suite_Pn,taux_de_croissance) \ Bblock \ Test(IL_FAUT(IFespace_de_Lyapunov_____calculer_formellement_les_derivees)) \ /* Test introduit le 20151030110739... */ \ Bblock \ EGAL(Reelle(derivee_suite_Pn) \ ,MUL2(taux_de_croissance \ ,SOUS(espace_de_Lyapunov_____constante_de_complementation,DOUB(Reelle(suite_Pn))) \ ) \ ); \ /* Calcul de la derivee de la suite : */ \ /* */ \ /* d(X ) = R.(1 - 2.X ) */ \ /* n+1 n+1 */ \ /* */ \ Eblock \ ATes \ Bblock \ DEFV(complexe,suite_Pn_a_gauche); \ DEFV(complexe,suite_Pn_a_droite); \ \ Cinitialisation(suite_Pn_a_gauche \ ,SOUS(Reelle(suite_Pn),IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees) \ ,NEUT(Imaginaire(suite_Pn)) \ ); \ Cinitialisation(suite_Pn_a_droite \ ,ADD2(Reelle(suite_Pn),IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees) \ ,NEUT(Imaginaire(suite_Pn)) \ ); \ \ CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_REELLE(suite_Pn_a_gauche \ ,taux_de_croissance \ ); \ CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_REELLE(suite_Pn_a_droite \ ,taux_de_croissance \ ); \ \ EGAL(Reelle(derivee_suite_Pn) \ ,DERIVATION_PARTIELLE(Reelle(suite_Pn_a_gauche) \ ,Reelle(suite_Pn_a_droite) \ ,DOUB(IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees) \ ) \ ); \ /* Calcul de la derivee de la suite par des differences finies... */ \ Eblock \ ETes \ Eblock \ /* Procedure introduite le 20151030100641... */ #define CALCUL_DE_LA_DERIVEE_DE_LA_DYNAMIQUE_DE_VERHULST_IMAGINAIRE(suite_Pn,derivee_suite_Pn,taux_de_croissance) \ Bblock \ Test(IL_FAUT(IFespace_de_Lyapunov_____calculer_formellement_les_derivees)) \ /* Test introduit le 20151030110739... */ \ Bblock \ DEFV(complexe,point_manoeuvre); \ /* Point complexe de maneuvre lors de l'iteration. */ \ \ aCforme_lineaire(point_manoeuvre \ ,NEGA(FDEUX) \ ,suite_Pn \ ,espace_de_Lyapunov_____constante_de_complementation \ ); \ /* Calcul de : */ \ /* */ \ /* 1 - 2.Z = -2.Z + 1 */ \ /* n+1 n+1 */ \ /* */ \ \ aCforme_lineaire(derivee_suite_Pn \ ,taux_de_croissance \ ,point_manoeuvre \ ,FZERO \ ); \ /* Calcul de : */ \ /* */ \ /* d(Z ) = R.(1 - 2.Z ) */ \ /* n+1 n+1 */ \ /* */ \ Eblock \ ATes \ Bblock \ DEFV(complexe,suite_Pn_a_gauche); \ DEFV(complexe,suite_Pn_a_droite); \ \ Cinitialisation(suite_Pn_a_gauche \ ,SOUS(Reelle(suite_Pn),IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees) \ ,SOUS(Imaginaire(suite_Pn),IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees) \ ); \ Cinitialisation(suite_Pn_a_droite \ ,ADD2(Reelle(suite_Pn),IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees) \ ,ADD2(Imaginaire(suite_Pn),IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees) \ ); \ \ CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_IMAGINAIRE(suite_Pn_a_gauche \ ,taux_de_croissance \ ); \ CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_IMAGINAIRE(suite_Pn_a_droite \ ,taux_de_croissance \ ); \ \ Cinitialisation(derivee_suite_Pn \ ,DERIVATION_PARTIELLE(Reelle(suite_Pn_a_gauche) \ ,Reelle(suite_Pn_a_droite) \ ,DOUB(IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees) \ ) \ ,DERIVATION_PARTIELLE(Imaginaire(suite_Pn_a_gauche) \ ,Imaginaire(suite_Pn_a_droite) \ ,DOUB(IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees) \ ) \ ); \ /* Calcul de la derivee de la suite par des differences finies... */ \ Eblock \ ETes \ Eblock \ /* Procedure introduite le 20151030100641... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " F L O T T A N T " D E L ' E S P A C E D E V E R H U S L T - L Y A P U N O V */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(Logical,SINT(IFespace_de_Lyapunov_____utiliser_la_dynamique_etendue,FAUX))); DEFV(Common,DEFV(Float,SINT(IFespace_de_Lyapunov_____exposant,FU))); /* Le 20151031085602 a ete introduite la possibilite d'utiliser une dynamique plus */ /* compliquee que 'R.Z.(1-Z)'... */ DEFV(Common,DEFV(Logical,SINT(IFespace_de_Lyapunov_____calculer_formellement_les_derivees,VRAI))); DEFV(Common,DEFV(Float,SINT(IFespace_de_Lyapunov_____epsilon_d_approximation_des_derivees,tgEPSILON))); /* Le 20151030110739 a ete introduite la possibilite de calculer les derviees par des */ /* differences finies dans le but de pouvoir compliquer un peu la definition de l'iteration */ /* de Verhulst. */ DEFV(Common,DEFV(Logical,SINT(IFespace_de_Lyapunov_____faire_une_rotation_tridimensionnelle,FAUX))); /* Introduit le 20210815103934... */ /* */ /* On notera le 20210815121225 que cela ne fait pas en realite une rotation */ /* tridimensionnelle (sauf peut-etre pour de tres petits angles) et ce a cause du */ /* fait que la dynamique de Verhulst est chaotique et qu'alors la moindre petite */ /* modification sur une valeur initiale (ou intermediaire), ce qui a necessairement */ /* lieu de la rotation, a des consequences macroscopiques sur la suite du processus. */ /* Cela fut en fait introduit pour le plaisir... */ DEFV(Common,DEFV(Float,SINT(IFespace_de_Lyapunov_____R4,FZERO))); DEFV(Common,DEFV(Float,SINT(IFespace_de_Lyapunov_____R5,FZERO))); /* Les parametres 'R4' et 'R5' ont ete introduits le 20151006091325... */ DEFV(Common,DEFV(Float,SINT(IFespace_de_Lyapunov_____R6,FZERO))); DEFV(Common,DEFV(Float,SINT(IFespace_de_Lyapunov_____R7,FZERO))); /* Les parametres 'R6' et 'R7' ont ete introduits le 20151007091822... */ DEFV(Common,DEFV(FonctionF,POINTERF(IFespace_de_Lyapunov(imageR ,Zf ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(valeur_initiale_P0_de_Pn) ,suite_des_taux_de_croissance ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ) ) ) DEFV(Argument,DEFV(imageF,imageR)); /* Image Resultat a generer en flottant. */ DEFV(Argument,DEFV(Float,Zf)); /* Coordonnee 'Z' flottante donnant dans un segment du type [0,1] la tranche verticale */ /* dans laquelle on genere la coupe bi-dimensionnelle de l'espace de Lyapunov. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(valeur_initiale_P0_de_Pn))); /* Nombre complexe "generateur" de l'espace de Lyapunov que l'on veut calculer. On notera */ /* que si ce nombre complexe se reduit a sa partie reelle, les calculs sont optimises... */ DEFV(Argument,DEFV(Float,DTb0(suite_des_taux_de_croissance))); /* Donne la suite des taux de croissance. Ce tableau a autant d'elements qu'il est prevu */ /* d'iterations, soit 'nombre_d_iterations'... */ /* */ /* Le 20101103112420, le type de 'suite_des_taux_de_croissance' est passe de 'Int' a */ /* 'Float' afin que ce vecteur puisse contenir des codes de taux de croissance (par */ /* exemple 'TAUX_DE_CROISSANCE_R1_DANS_L_ESPACE_DE_LYAPUNOV'), mais aussi les taux de */ /* croissance eux-memes, auquel cas il est suggere d'utiliser des valeurs negatives, les */ /* taux etant evidemment positifs, dont on prendra donc la valeur absolue ; ainsi il n'y */ /* aura pas de confusions entre les codes {R1,R2,R3} et ces valeurs specifiques... */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ DEFV(Argument,DEFV(Int,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov)); /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ /* fonction iteree (voir 'choix_du_mode_de_calcul_de_l_exposant_de_Lyapunov' dans le */ /* fichier 'v $ximcf/iterations$DEF'). */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_negatifs)); /* Cet indicateur logique controle la visualisation des zones des parties stables. Il */ /* permet de visualiser les exposants negatifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties stables. */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_positifs)); /* Cet indicateur logique controle la visualisation des zones des parties chaotiques. Il */ /* permet de visualiser les exposants positifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties chaotiques. */ DEFV(Argument,DEFV(Float,facteur_multiplicatif)); /* Ce facteur multiplicatif est la uniquement pour permettre de faire en quelque sorte une */ /* inversion video du champ genere (pour la valeur -1.0). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_EXPOSANT_LYAPUNOV_SANS_point_courant /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV; /* Choix du mode calcul de l'exposant de Lyapunov en fonction des arguments d'appel... */ CALS(IFinitialisation(imageR,FZERO)); /* Initialisation, on ne sait jamais... */ BSaveModifyVariable(Logical ,IFespace_de_Lyapunov_____calculer_formellement_les_derivees ,COND(IL_FAUT(IFespace_de_Lyapunov_____utiliser_la_dynamique_etendue) ,FAUX ,IFespace_de_Lyapunov_____calculer_formellement_les_derivees ) ); /* Ainsi, on force le calcul par differences finies des derivees pour la dynamique */ /* etendue, ce qui est logique puisque l'on ne connait pas a priori la derivee formelle. */ begin_image Bblock #define NE_PAS_TRANSLATER_TRANSFORMATION_3D_Fxyz \ NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz \ /* Afin de raccourcir certaines lignes ci-dessous... */ F_ITERATION_CALCUL_EXPOSANT_LYAPUNOV_DANS_C(PREMIERE_ITERATION_DANS_L_ESPACE_DE_LYAPUNOV ,BLOC(Bblock Cegal(element_courant_de_la_suite_Pn,INDIRECT(valeur_initiale_P0_de_Pn)); /* Recuperation du nombre complexe "generateur"... */ Eblock ) ,BLOC(Bblock DEFV(Float,INIT(IFespace_de_Lyapunov_____R1,X_IMAGE_PLAN(X))); DEFV(Float,INIT(IFespace_de_Lyapunov_____R2,Y_IMAGE_PLAN(Y))); DEFV(Float,INIT(IFespace_de_Lyapunov_____R3,Zf)); /* Introduit le 20210815100953 afin de permettre des transformations tridimensionnelles */ /* des coordonnees {X,Y,Z}... */ Test(IL_FAUT(IFespace_de_Lyapunov_____faire_une_rotation_tridimensionnelle)) /* Possibilite introduite le 20210815103934... */ Bblock DEFV(Float,INIT(rotation_de_R1 ,TRANSFORMATION_GEOMETRIQUE_3D_Fx (IFespace_de_Lyapunov_____R1 ,IFespace_de_Lyapunov_____R2 ,IFespace_de_Lyapunov_____R3 ,NE_PAS_TRANSLATER_TRANSFORMATION_3D_Fxyz ) ) ); DEFV(Float,INIT(rotation_de_R2 ,TRANSFORMATION_GEOMETRIQUE_3D_Fy (IFespace_de_Lyapunov_____R1 ,IFespace_de_Lyapunov_____R2 ,IFespace_de_Lyapunov_____R3 ,NE_PAS_TRANSLATER_TRANSFORMATION_3D_Fxyz ) ) ); DEFV(Float,INIT(rotation_de_R3 ,TRANSFORMATION_GEOMETRIQUE_3D_Fz (IFespace_de_Lyapunov_____R1 ,IFespace_de_Lyapunov_____R2 ,IFespace_de_Lyapunov_____R3 ,NE_PAS_TRANSLATER_TRANSFORMATION_3D_Fxyz ) ) ); EGAL(IFespace_de_Lyapunov_____R1,rotation_de_R1); EGAL(IFespace_de_Lyapunov_____R2,rotation_de_R2); EGAL(IFespace_de_Lyapunov_____R3,rotation_de_R3); /* Rotation de {R1,R2,R3} introduite le 20210815103934... */ Eblock ATes Bblock Eblock ETes Test(IZEQ(Imaginaire(INDIRECT(valeur_initiale_P0_de_Pn)))) Bblock /* Cas ou le generateur est un nombre Reel (c'est-a-dire un nombre complexe dont la partie */ /* imaginaire est nulle...), on optimise (du jamais vu...) : */ CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_REELLE (element_courant_de_la_suite_Pn ,TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV ); CALCUL_DE_LA_DERIVEE_DE_LA_DYNAMIQUE_DE_VERHULST_REELLE (element_courant_de_la_suite_Pn ,derivee_de_la_suite_Pn ,TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV ); Eblock ATes Bblock /* Cas ou le generateur est un nombre complexe (c'est-a-dire un nombre complexe dont la */ /* partie imaginaire n'est pas nulle...) : */ CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_IMAGINAIRE (element_courant_de_la_suite_Pn ,TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV ); CALCUL_DE_LA_DERIVEE_DE_LA_DYNAMIQUE_DE_VERHULST_IMAGINAIRE (element_courant_de_la_suite_Pn ,derivee_de_la_suite_Pn ,TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV ); Eblock ETes Eblock ) ); #undef NE_PAS_TRANSLATER_TRANSFORMATION_3D_Fxyz Eblock end_image ESaveModifyVariable(Logical ,IFespace_de_Lyapunov_____calculer_formellement_les_derivees ); RETIF(imageR); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " S T A N D A R D " D E L ' E S P A C E D E V E R H U S L T - L Y A P U N O V */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Iespace_de_Lyapunov(imageR ,Zf ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(valeur_initiale_P0_de_Pn) ,suite_des_taux_de_croissance ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer en "standard". */ DEFV(Argument,DEFV(Float,Zf)); /* Coordonnee 'Z' flottante donnant dans un segment du type [0,1] la tranche verticale */ /* dans laquelle on genere la coupe bi-dimensionnelle de l'espace de Lyapunov. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(valeur_initiale_P0_de_Pn))); /* Nombre complexe "generateur" de l'espace de Lyapunov que l'on veut calculer. On notera */ /* que si ce nombre complexe se reduit a sa partie reelle, les calculs sont optimises... */ DEFV(Argument,DEFV(Float,DTb0(suite_des_taux_de_croissance))); /* Donne la suite des taux de croissance. Ce tableau a autant d'elements qu'il est prevu */ /* d'iterations, soit 'nombre_d_iterations'... */ /* */ /* Le 20101103112420, le type de 'suite_des_taux_de_croissance' est passe de 'Int' a */ /* 'Float' afin que ce vecteur puisse contenir des codes de taux de croissance (par */ /* exemple 'TAUX_DE_CROISSANCE_R1_DANS_L_ESPACE_DE_LYAPUNOV'), mais aussi les taux de */ /* croissance eux-memes, auquel cas il est suggere d'utiliser des valeurs negatives, les */ /* taux etant evidemment positifs, dont on prendra donc la valeur absolue ; ainsi il n'y */ /* aura pas de confusions entre les codes {R1,R2,R3} et ces valeurs specifiques... */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ DEFV(Argument,DEFV(Int,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov)); /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ /* fonction iteree (voir 'choix_du_mode_de_calcul_de_l_exposant_de_Lyapunov' dans le */ /* fichier 'v $ximcf/iterations$DEF'). */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_negatifs)); /* Cet indicateur logique controle la visualisation des zones des parties stables. Il */ /* permet de visualiser les exposants negatifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties stables. */ DEFV(Argument,DEFV(Logical,visualiser_les_exposants_positifs)); /* Cet indicateur logique controle la visualisation des zones des parties chaotiques. Il */ /* permet de visualiser les exposants positifs ('VRAI'), ou de les ignorer ('FAUX') auquel */ /* cas, ils sont mis a zero. Cela permet d'uniformiser les zones qui correspondent aux */ /* parties chaotiques. */ DEFV(Argument,DEFV(Float,facteur_multiplicatif)); /* Ce facteur multiplicatif est la uniquement pour permettre de faire en quelque sorte une */ /* inversion video du champ genere (pour la valeur -1.0). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(mode_de_calcul_utilise_pour_l_exposant_de_Lyapunov,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov)); /* Choix de la facon de calculer l'exposant de Lyapunov a partir de la derivee de la */ /* fonction iteree ; en effet, suivant les circonstances (cas ou les calculs sont purement */ /* elles), le mode utilise peut etre different de celui qui a ete demande... */ BDEFV(imageF,coupe_dans_l_espace_de_Lyapunov); /* Coupe bidimensionnelle dans l'espace tridimensionnel de Lyapunov. */ /*..............................................................................................................................*/ MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV; /* Choix du mode calcul de l'exposant de Lyapunov en fonction des arguments d'appel... */ CALS(IFespace_de_Lyapunov(coupe_dans_l_espace_de_Lyapunov ,Zf ,coin_bas_gauche ,coin_haut_droite ,valeur_initiale_P0_de_Pn ,suite_des_taux_de_croissance ,nombre_d_iterations ,mode_de_calcul_demande_pour_l_exposant_de_Lyapunov ,visualiser_les_exposants_negatifs ,visualiser_les_exposants_positifs ,facteur_multiplicatif ) ); /* Calcul de l'espace de Lyapunov en "flottant", et donc sans renormalisation... */ CALS(Ifloat_std_avec_renormalisation(imageR,coupe_dans_l_espace_de_Lyapunov)); /* Et enfin, conversion du champ flottant en une image avec renormalisation. Mais on fera */ /* tres ATTENTION au fait que cet 'Ifloat_std_avec_renormalisation(...)' est dependant du */ /* contenu de l'image courante uniquement. Dans ces conditions, lors du calcul d'une suite */ /* d'images, par exemple a l'aide de 'v $xrk/lyapunov.01$K', les extrema utilises par cette */ /* renormalisation pourront varier d'une image a une autre. C'est ceci qui explique le */ /* phenomene de "pompage" des niveaux que l'on observe dans la sequence suivante : */ /* */ /* xivPdf 2 1 / 009320_009447 */ /* */ /* Je vois difficilement comment eviter ce phenomene, qui va jusqu'a donner l'impression */ /* de retour en arriere dans le zoom precedent. On pourrait bien sur utiliser directement */ /* la fonction 'IFespace_de_Lyapunov(...)', et faire dans le programme appelant l'operation */ /* de renormalisation suivant les extrema globaux pour l'ensemble des images, mais cela */ /* serait d'une grande lourdeur... */ EDEFV(imageF,coupe_dans_l_espace_de_Lyapunov); /* Coupe bidimensionnelle dans l'espace tridimensionnel de Lyapunov. */ RETI(imageR); Eblock EFonctionP #undef CALCUL_DE_LA_DERIVEE_DE_LA_DYNAMIQUE_DE_VERHULST_IMAGINAIRE #undef CALCUL_DE_LA_DERIVEE_DE_LA_DYNAMIQUE_DE_VERHULST_REELLE #undef CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_IMAGINAIRE #undef CALCUL_DE_LA_DYNAMIQUE_DE_VERHULST_REELLE #undef TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV #undef QUEL_TAUX_DE_CROISSANCE_DANS_L_ESPACE_DE_LYAPUNOV #undef FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV #Undef FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_02 /* Le 20030222103003, 'FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_02(...)' */ /* est passe de 'undef' a 'Undef' afin de ne pas etre recupere par le processus */ /* 'v $xcc/cpp$Z _VERSION_'. */ #undef FONCTION_DE_PRECISION_DANS_L_ESPACE_DE_LYAPUNOV_VERSION_01 #undef F_ITERATION_CALCUL_EXPOSANT_LYAPUNOV_DANS_C #undef TRES_PETIT_EXPOSANT_DE_LYAPUNOV #undef PASSAGE_DE_LA_DERIVEE_D_UNE_SUITE_A_L_EXPOSANT_DE_LYAPUNOV #undef COMMENT_CALCULER_LA_DERIVEE #undef MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV #undef VALIDATION_DU_MODE_DE_CALCUL_DE_L_EXPOSANT_DE_LYAPUNOV #undef BVARIABLES_F_EXPOSANT_LYAPUNOV #undef BVARIABLES_F_EXPOSANT_LYAPUNOV_SANS_point_courant /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E S U I T E Q U E L C O N Q U E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #define BVARIABLES_F_ITERATION_QUELCONQUE_DANS_C_SANS_point_courant \ /* Definition des variables communes a toutes les fonctions calculant une suite quelconque */ \ /* dans le plan Complexe... */ \ BVARIABLES_D_HOMOTHETIE_C_HC_HHC \ /* "Taille" reelle et imaginaire de la fenetre rapportee a la taille des images. */ #define BVARIABLES_F_ITERATION_QUELCONQUE_DANS_C \ /* Definition des variables communes a toutes les fonctions calculant une suite quelconque */ \ /* dans le plan Complexe... */ \ BVARIABLES_F_ITERATION_QUELCONQUE_DANS_C_SANS_point_courant \ /* "Taille" reelle et imaginaire de la fenetre rapportee a la taille des images. */ \ DEFV(complexe,point_courant); \ /* Point complexe courant 'C' dans la fenetre. */ #define F_ITERATION_QUELCONQUE_DANS_C(premiere_iteration_absolue,premiere_iteration_effective,initialisation,iteration,test_defaut) \ Bblock \ DEFV(Int,INIT(numero_de_l_iteration,UNDEF)); \ /* Indice 'n' de la suite 'X'... */ \ DEFV(complexe,element_courant_de_la_suite_Pn); \ /* Element courant Z de la suite. */ \ /* n */ \ BLOC(initialisation); \ /* Initialisation de la suite definissant le systeme dynamique... */ \ \ DoIn(numero_de_l_iteration \ ,premiere_iteration_effective \ ,LSTX(premiere_iteration_absolue,nombre_d_iterations) \ ,I \ ) \ Bblock \ BLOC(iteration); \ /* Calcul du systeme dynamique par iteration du calcul de la suite... */ \ \ Test(IL_FAUT(test_defaut)) \ Bblock \ TEST_D_UNDERFLOW_D_UNE_SUITE_COMPLEXE(element_courant_de_la_suite_Pn \ ,iterations_dans_C_HC_HHC_____epsilon \ ); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter */ \ /* des underflows flottants... */ \ TEST_D_OVERFLOW_D_UNE_SUITE_COMPLEXE(element_courant_de_la_suite_Pn,RACX(F_INFINI)); \ /* Lorsqu'une composante devient trop grande, on la plafonne afin d'eviter des underflows */ \ /* flottants. On notera l'utilisation de 'RACX(...)' pour prendre en compte l'elevation au */ \ /* carre lors de l'eventuelle iteration suivante... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Eblock \ EDoI \ \ storeJ_point(element_courant_de_la_suite_Pn \ ,imageR \ ,X,Y \ ); \ /* Generation de l'image "complexe"... */ \ Eblock \ /* Calcul general d'une suite quelconque dans le plan complexe... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T E U R D E F O N C T I O N S C A L C U L A N T */ /* U N E F O N C T I O N D A N S L E P L A N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #pragma xcg__gen_ext_Z__gen_Fonction_SE__GENERE__Fonction GENERE__FonctionJ_I_FONCTION_C POINTERJ /* Introduit le 20040520121238. */ #define GENERE__FonctionJ_I_FONCTION_C(nom_et_arguments_de_la_fonction,Nfonction,Vfonction,alpha,beta_,gamma,delta,nom,editer,simp) \ /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees */ \ /* a la recuperation automatique des fichiers d'arguments ; on trouvera donc : */ \ /* */ \ /* GENERE__FonctionP_FONCTION_C(nom_et_arguments_de_la_fonction,Nfonction,Vfonction) */ \ /* */ \ /* D'autre part, la fonction 'Nfonction' devra etre de nom '__...' afin que son nombre */ \ /* d'arguments ne soit pas verifie ('v $xcg/gen.arg$D/debut$I __f'). */ \ /* */ \ /* Les arguments {alpha,beta_,gamma,delta} ont ete introduits le 20091021152725 suite a */ \ /* l'extension 'v $ximcd/operator$FON Cforme_homographique'. En general, ils vaudront : */ \ /* definie par : */ \ /* */ \ /* alpha = 1 */ \ /* beta_ = 0 */ \ /* gamma = 0 */ \ /* delta = 1 */ \ /* */ \ /* afin que la transformation homographique soit neutre... */ \ /* */ \ /* Les arguments {nom,editer} ont ete introduits le 20120121174948... */ \ /* */ \ /* L'argument {simp} (pour "SIMPlifier") a ete introduit le 20120124091005... */ \ DEFV(FonctionJ,POINTERJ(nom_et_arguments_de_la_fonction)) \ /* ATTENTION, il ne faut pas ecrire : */ \ /* */ \ /* DEFV(Common,DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction))) */ \ /* */ \ /* puisqu'en effet la directive 'Common' est utilisee lors de l'appel par : */ \ /* */ \ /* DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(...)) */ \ /* */ \ /* Actuellement cette redondance ne serait pas genante, mais plus tard... */ \ DEFV(Argument,DEFV(imageJ,imageR)); \ /* Image Resultat a generer. */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); \ /* Definition du point situe en bas et a gauche de la fenetre, */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); \ /* Definition du point situe en haut et a droite de la fenetre. */ \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ BVARIABLES_F_ITERATION_QUELCONQUE_DANS_C \ /*..............................................................................................................................*/ \ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; \ \ begin_image \ Bblock \ DEFV(complexe,point_courant_transforme); \ \ INITIALISATION_DU_POINT_COURANT_DANS_C; \ /* Initialisation du "point Courant" 'C'. */ \ \ Cforme_homographique(point_courant_transforme,alpha,point_courant,beta_,gamma,point_courant,delta); \ /* Transformation homographique du "point Courant" 'C'. Ceci fut introduit le 20091021152725 */ \ /* afin de pouvoir representer la fonction 'exp(1/z)' en utilisant directement la fonction */ \ /* 'fFCexponentielle_neperienne(...)' et en appliquant la transformation homographique */ \ /* definie par : */ \ /* */ \ /* alpha = 0 */ \ /* beta_ = 1 */ \ /* gamma = 1 */ \ /* delta = 0 */ \ /* */ \ /* astucieux... */ \ \ CALS(Nfonction(point_courant_transforme)); \ /* Application de la transformation... */ \ \ Test(IL_FAUT(editer)) \ Bblock \ Test(IL_NE_FAUT_PAS(simp)) \ /* Test introduit le 20120124091005... */ \ Bblock \ CAL3(Prme5("%s(%+.^^^,%+.^^^)=(%+.^^^,%+.^^^)\n" \ ,nom \ ,Reelle(point_courant_transforme),Imaginaire(point_courant_transforme) \ ,Reelle(Vfonction),Imaginaire(Vfonction) \ ) \ ); \ /* Possibilite introduite le 20120121174948... */ \ Eblock \ ATes \ Bblock \ CAL3(Prme4("%+.^^^ %+.^^^ %+.^^^ %+.^^^\n" \ ,Reelle(point_courant_transforme),Imaginaire(point_courant_transforme) \ ,Reelle(Vfonction),Imaginaire(Vfonction) \ ) \ ); \ /* Possibilite introduite le 20120124091005 pour simplifier le traitement de ces sorties... */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ storeJ_point(Vfonction \ ,imageR \ ,X,Y \ ); \ /* Generation de l'image "complexe"... */ \ Eblock \ end_image \ \ RETIJ(imageR); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' gamma ' */ /* D A N S L E P L A N C O M P L E X E A V E C L E P R O L O N G E M E N T A N A L Y T I Q U E : */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_prolongement_analytique_gamma_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_prolongement_analytique_gamma_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_prolongement_analytique_gamma_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCgamma_sommation_Euler_MacLaurin /* Common,DEFV(Fonction,) : \ */ ,fFCgamma_sommation_Euler_MacLaurin_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFCgamma_sommation_Euler_MacLaurin_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFCgamma_sommation_Euler_MacLaurin_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFCgamma_sommation_Euler_MacLaurin_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFCgamma_sommation_Euler_MacLaurin_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"gamma" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_prolongement_analytique_gamma_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_prolongement_analytique_gamma_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " F L O T T A N T " D E L A F O N C T I O N ' zeta ' D E R I E M A N N */ /* D A N S L E P L A N C O M P L E X E A V E C L A S E R I E D ' E U L E R */ /* S U I V A N T U N P R O C E S S U S L I N E A I R E E N T E M P S : */ /* */ /* */ /* Definition : */ /* */ /* La fonction 'zeta' de Riemann est definie */ /* dans le plan Complexe par : */ /* */ /* 1 1 1 */ /* zeta(z) = ---- + ---- + ... + ---- + ... */ /* z z z */ /* 1 2 n */ /* */ /* ce qui peut se reecrire : */ /* */ /* -z -z -z */ /* zeta(z) = 1 + 2 + ... + n + ... */ /* */ /* */ /* n=+infini */ /* _______ */ /* \ */ /* \ -z */ /* zeta(z) = / n */ /* /______ */ /* */ /* n=1 */ /* */ /* sachant que : */ /* */ /* -z -z.Log(n) */ /* n = e */ /* */ /* ou en posant : */ /* */ /* x = R(z) */ /* y = I(z) */ /* */ /* -z -(x + i.y).Log(n) */ /* n = e */ /* */ /* -z -x.Log(n) -i.y.Log(n) */ /* n = e .e */ /* */ /* -z -x.Log(n) */ /* n = e .[cos(-y.Log(n)) + i.sin(-y.Log(n))] */ /* */ /* d'ou : */ /* */ /* n=+infini */ /* _______ */ /* \ */ /* \ -x.Log(n) */ /* zeta(z) = / e .[cos(-y.Log(n)) + i.sin(-y.Log(n))] */ /* /______ */ /* */ /* n=1 */ /* */ /* ou encore : */ /* */ /* n=+infini */ /* _______ */ /* \ */ /* \ -R(z).Log(n) */ /* zeta(z) = / e .[cos(-I(z).Log(n)) + i.sin(-I(z).Log(n))] */ /* /______ */ /* */ /* n=1 */ /* */ /* et nous nous contenterons des 'N' premiers termes de la suite, */ /* c'est-a-dire que nous n'irons pas jusqu'a l'infini... */ /* */ /* */ /* La fonction 'zeta' de Riemann possede un */ /* pole de residu 1 : le nombre z=1. Elle possede */ /* une infinite de zeros "triviaux" qui sont les */ /* nombres entiers negatifs et pairs. Elle possede */ /* aussi une infinite de zeros non triviaux de la */ /* forme : */ /* */ /* 1 */ /* z = --- + h.i */ /* 2 */ /* */ /* sachant que le fait que la partie Reelle soit */ /* constante (et egale a 1/2) constitue ce que l'on */ /* appelle l'hypothese de Riemann (non encore demontree */ /* a la date de 19990607172302). Voici les 6 premieres */ /* valeurs positives de 'h' : */ /* */ /* 14.134725... */ /* 21.02... */ /* 25.01... */ /* 30.42... */ /* 32.93... */ /* 37.58... */ /* */ /* la dixieme etant egale a 49.773832... */ /* */ /* */ /* Donnons quelques valeurs particulieres de */ /* la fonction 'zeta' de Riemann : */ /* */ /* 2.n-1 */ /* 2 2.n */ /* zeta(2.n) = --------.p B */ /* (2.n)! n */ /* */ /* ou 'Bn' designe les nombres de Bernoulli */ /* et 'p' le nombre 'pi'. On a en particulier : */ /* */ /* 2 */ /* p */ /* zeta(2) = ---- */ /* 6 */ /* */ /* 4 */ /* p */ /* zeta(4) = ---- */ /* 90 */ /* */ /* Enfin, on notera que : */ /* */ /* zeta(3) = 1.20205... */ /* */ /* ce qui va permettre de faire des tests de */ /* validite... */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(FonctionJ,POINTERJ(IJfonction_serie_zeta_dans_C(imageR ,imageA ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,numero_de_la_premiere_iteration ,nombre_d_iterations ) ) ) ) DEFV(Argument,DEFV(imageJ,imageR)); /* Image Resultat a generer. */ DEFV(Argument,DEFV(imageJ,imageA)); /* Image Argument servant a initialiser le processus, ce qui autorise donc la programmation */ /* d'un calcul iteratif en un temps lineaire (voir par exemple 'v $xrc/zeta.02$K') ; dans */ /* ces conditions : */ /* */ /* imageA : correspond a un nombre d'iterations inferieur a 'nombre_d_iterations', */ /* imageR : correspondra a 'nombre_d_iterations', et en fait seul les iterations "comprises" */ /* entre 'imageA' et 'imageR' seront calculees... */ /* */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,numero_de_la_premiere_iteration)); /* Numero de la premiere iteration demandee qui, notons le, n'est pas necessairement la */ /* valeur 'PREMIER_ELEMENT_DE_LA_FONCTION_ZETA_DE_RIEMANN', mais bien plutot une valeur */ /* superieure, ce qui permet la mise en place de calculs "progressifs" (voir a ce propos */ /* les commentaires de 'imageR' et 'imageA'). */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. Par contre 'nombre_d_iterations' lui est compte a partir */ /* de 'PREMIER_ELEMENT_DE_LA_FONCTION_ZETA_DE_RIEMANN', sachant, bien entendu, que les */ /* premieres iterations ne seront pas obligatoirement calculees, car elles pourront etre */ /* recuperees d'un calcul anterieur... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_QUELCONQUE_DANS_C /*..............................................................................................................................*/ /* ATTENTION, on ne fait pas : */ /* */ /* DEFV(complexe,valeur_initiale); */ /* Cegal(valeur_initiale,C_____nombre_complexe__0__0); */ /* CALS(IJinitialisation(imageR,ADRESSE(valeur_initiale))); */ /* */ /* au cas ou les images 'imageA' et 'imageR' seraient equivalentes... */ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; Test(IFLE(X_COIN_BAS_GAUCHE,FU)) Bblock PRINT_ATTENTION("la fenetre de calcul coupe la droite x=1, la serie ne converge donc pas dans toute la fenetre"); /* A ce propos, 'v $ximcf/operator$FON fFCzeta_sommation_Euler_MacLaurin' qui propose un */ /* prolongement analytique de la serie utilisee ici, et qui semble fonctionner correctement. */ Eblock ATes Bblock Eblock ETes begin_image Bblock F_ITERATION_QUELCONQUE_DANS_C(PREMIER_ELEMENT_DE_LA_FONCTION_ZETA_DE_RIEMANN ,numero_de_la_premiere_iteration ,BLOC(Bblock INITIALISATION_DU_POINT_COURANT_DANS_C; /* Initialisation du "point Courant" 'C'. */ Cegal(element_courant_de_la_suite_Pn ,loadJ_point(imageA ,X,Y ) ); /* Initialisation de l'approximation de la fonction 'zeta(c)'. Par exemple lorsque l'on */ /* sera sur la premiere iteration : */ /* */ /* numero_de_la_premiere_iteration == PREMIER_ELEMENT_DE_LA_FONCTION_ZETA_DE_RIEMANN */ /* */ /* on fera en general (voir 'Ifonction_serie_zeta_dans_C(...)') : */ /* */ /* zeta(C) = 0 */ /* */ /* Pour les iterations suivantes, on pourra ainsi cumuler les resultats des iterations */ /* precedentes... */ Eblock ) ,BLOC(Bblock DEFV(Float,INIT(moins_Log_de_n,NEGA(LOGX(numero_de_l_iteration)))); /* Oppose du logarithme neperien du numero d'iteration courant 'n'. */ DEFV(complexe,point_manoeuvre_1); DEFV(complexe,point_manoeuvre_2); /* Points complexes de maneuvre lors de l'iteration. */ Cnegation(point_manoeuvre_1 ,point_courant ); /* Calcul de : */ /* */ /* z = -z = -(x + i.y) */ /* 1 */ /* */ /* ou {x,y} designe le nombre complexe 'C' courant. */ aCexponentielle(point_manoeuvre_2 ,numero_de_l_iteration ,point_manoeuvre_1 ); /* Calcul de : */ /* */ /* -x.Log(n) */ /* z = e .[cos(-y.Log(n)) + i.sin(-y.Log(n))] */ /* 2 */ /* */ /* ATTENTION, on notera de plus que pour les valeurs de 'x' negatives, l'exponentielle */ /* ci-dessus peut prendre tres "facilement" des valeurs enormes. A titre d'illustration */ /* de cela, lorsque dans la fenetre de calcul, il y a des points d'abscisses negatives, */ /* c'est la colonne de points la plus a gauche (donc contenant en valeur absolue les plus */ /* grandes abscisses negatives) qui domine completement tout le reste du champ qui se */ /* retrouve (suite a la quantification en octets des niveaux) pratiquement uniforme, alors */ /* que cette colonne de gauche presente des "details". Cela peut se voir (et cela s'est vu */ /* le 19990602093737) avec le pave [-33,-31]x[-32,-30] ; on trouve alors les valeurs */ /* suivantes : */ /* */ /* Zn=(0.000000,0.000000) */ /* */ /* n=1 */ /* -Log(n)=0.000000 */ /* {x,y}=(-33.000000,-32.000000) */ /* m2=(1.000000,0.000000) */ /* Zn=(1.000000,0.000000) */ /* */ /* n=2 */ /* -Log(n)=-0.693147 */ /* {x,y}=(-33.000000,-32.000000) */ /* m2=(-8436063190.993355,-1618583989.913671) */ /* Zn=(-8436063189.993355,-1618583989.913671) */ /* */ /* ou 'm2' designe 'point_manoeuvre_2'... */ aCsomme(element_courant_de_la_suite_Pn,element_courant_de_la_suite_Pn,point_manoeuvre_2); /* Et enfin calcul iteratif de l'approximation de la fonction 'zeta(C)' : */ /* */ /* zeta(C) = zeta(C) + z */ /* 2 */ /* */ Eblock ) ,NE_PAS_TESTER_L_UNDERFLOW_ET_L_OVERFLOW ); Eblock end_image RETIJ(imageR); Eblock EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' zeta ' D E R I E M A N N */ /* D A N S L E P L A N C O M P L E X E A V E C L A S E R I E D ' E U L E R */ /* S U I V A N T U N P R O C E S S U S N O N O P T I M I S E : */ /* */ /* */ /* Definition : */ /* */ /* Voir la fonction 'IJfonction_serie_zeta_dans_C(...)', */ /* avec, il faut le noter, une petite difference au niveau */ /* des temps de calcul. En effet, lorsque l'on cherche a */ /* faire plusieurs calculs de suite en augmentant le nombre */ /* d'iterations : */ /* */ /* IJfonction_serie_zeta_dans_C(...) : peut exploiter les iterations anterieures, alors que */ /* IFfonction_serie_zeta_dans_C(...) : refait systematiquement tous les calculs, c'est-a-dire a */ /* partir de 'PREMIER_ELEMENT_DE_LA_FONCTION_ZETA_DE_RIEMANN' */ /* et donne des images "non standard". */ /* Ifonction_serie_zeta_dans_C(...) : refait systematiquement tous les calculs, c'est-a-dire a */ /* partir de 'PREMIER_ELEMENT_DE_LA_FONCTION_ZETA_DE_RIEMANN' */ /* et donne des images "standard". */ /* */ /* On verra a ce propos 'v $xrc/zeta.01$K' qui "tourne" en */ /* un temps proportionnel au carre du nombre d'iterations, */ /* alors que 'v $xrc/zeta.02$K' tourne en un temps lineaire... */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " N O N - S T A N D A R D " D E L A F O N C T I O N ' zeta ' D E R I E M A N N */ /* C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,POINTERF(IFfonction_serie_zeta_dans_C(partie_reelle_de_la_fonction_zeta_de_Riemann ,partie_imaginaire_de_la_fonction_zeta_de_Riemann ,module_de_la_fonction_zeta_de_Riemann ,phase_de_la_fonction_zeta_de_Riemann ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_d_iterations ) ) ) ) DEFV(Argument,DEFV(imageF,partie_reelle_de_la_fonction_zeta_de_Riemann)); DEFV(Argument,DEFV(imageF,partie_imaginaire_de_la_fonction_zeta_de_Riemann)); DEFV(Argument,DEFV(imageF,module_de_la_fonction_zeta_de_Riemann)); DEFV(Argument,DEFV(imageF,phase_de_la_fonction_zeta_de_Riemann)); /* Quatre images Resultat a generer qui donne respectivement la partie Reelle, la partie */ /* Imaginaire, le Module et la Phase d'une approximation de la fonction Zeta de Riemann. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BDEFV(imageJ,fonction_zeta_de_Riemann); /* Valeur de la fonction 'zeta' de Riemann dans la fenetre Argument sous la forme d'une */ /* image Complexe. */ DEFV(complexe,valeur_initiale); /* Valeur initiale de l'image Resultat. */ /*..............................................................................................................................*/ Cegal(valeur_initiale,C_____nombre_complexe__0__0); CALS(IJinitialisation(fonction_zeta_de_Riemann,ADRESSE(valeur_initiale))); /* Initialisation du processus iteratif sur : */ /* */ /* zeta(C) = 0 */ /* */ CALS(IJfonction_serie_zeta_dans_C(fonction_zeta_de_Riemann ,fonction_zeta_de_Riemann ,coin_bas_gauche ,coin_haut_droite ,PREMIER_ELEMENT_DE_LA_FONCTION_ZETA_DE_RIEMANN ,nombre_d_iterations ) ); /* Calcul de la valeur de la fonction 'zeta' de Riemann en "complexe" depuis la toute */ /* premiere iteration... */ CALS(Icomplexe_reelle(partie_reelle_de_la_fonction_zeta_de_Riemann,fonction_zeta_de_Riemann)); CALS(Icomplexe_imaginaire(partie_imaginaire_de_la_fonction_zeta_de_Riemann,fonction_zeta_de_Riemann)); /* Recuperation des parties Reelles et Imaginaires de la fonction 'zeta' de Riemann, */ CALS(Iconversion_XY_RT(module_de_la_fonction_zeta_de_Riemann,phase_de_la_fonction_zeta_de_Riemann ,partie_reelle_de_la_fonction_zeta_de_Riemann,partie_imaginaire_de_la_fonction_zeta_de_Riemann ) ); /* Puis calcul du Module et de la Phase dans [0,2.PI]. */ EDEFV(imageJ,fonction_zeta_de_Riemann); /* Valeur de la fonction 'zeta' de Riemann dans la fenetre Argument. */ RETIF(module_de_la_fonction_zeta_de_Riemann); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L " S T A N D A R D " D E L A F O N C T I O N ' zeta ' D E R I E M A N N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Ifonction_serie_zeta_dans_C(partie_reelleR ,partie_imaginaireR ,moduleR ,phaseR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_d_iterations ) ) ) ) DEFV(Argument,DEFV(image,partie_reelleR)); DEFV(Argument,DEFV(image,partie_imaginaireR)); DEFV(Argument,DEFV(image,moduleR)); DEFV(Argument,DEFV(image,phaseR)); /* Quatre images Resultat a generer qui donne respectivement la partie Reelle, la partie */ /* Imaginaire, le Module et la Phase d'une approximation de la fonction Zeta de Riemann. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_d_iterations)); /* Nombre d'iterations demande. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BDEFV(imageJ,fonction_zeta_de_Riemann); /* Valeur de la fonction 'zeta' de Riemann dans la fenetre Argument sous la forme d'une */ /* image Complexe. */ BDEFV(imageF,partie_reelle_de_la_fonction_zeta_de_Riemann); BDEFV(imageF,partie_imaginaire_de_la_fonction_zeta_de_Riemann); /* Valeur de la fonction 'zeta' de Riemann dans la fenetre Argument sous la forme de deux */ /* images Flottantes donnant la partie Reelle et la partie Imaginaire. */ BDEFV(imageF,module_de_la_fonction_zeta_de_Riemann); BDEFV(imageF,phase_de_la_fonction_zeta_de_Riemann); /* Valeur de la fonction 'zeta' de Riemann dans la fenetre Argument sous la forme de deux */ /* images Flottantes donnant le Module et la Phase. */ /*..............................................................................................................................*/ CALS(IFfonction_serie_zeta_dans_C(partie_reelle_de_la_fonction_zeta_de_Riemann ,partie_imaginaire_de_la_fonction_zeta_de_Riemann ,module_de_la_fonction_zeta_de_Riemann ,phase_de_la_fonction_zeta_de_Riemann ,coin_bas_gauche ,coin_haut_droite ,nombre_d_iterations ) ); /* Calcul de la valeur de la fonction 'zeta' de Riemann en "complexe" depuis la toute */ /* premiere iteration. */ CALS(Ifloat_std_avec_renormalisation(partie_reelleR,partie_reelle_de_la_fonction_zeta_de_Riemann)); CALS(Ifloat_std_avec_renormalisation(partie_imaginaireR,partie_imaginaire_de_la_fonction_zeta_de_Riemann)); CALS(Ifloat_std_avec_renormalisation(moduleR,module_de_la_fonction_zeta_de_Riemann)); CALS(Ifloat_std_avec_renormalisation(phaseR,phase_de_la_fonction_zeta_de_Riemann)); /* Et enfin, conversion de la fonction 'zeta' de Riemann en quatre images "standards"... */ EDEFV(imageF,phase_de_la_fonction_zeta_de_Riemann); EDEFV(imageF,module_de_la_fonction_zeta_de_Riemann); /* Valeur de la fonction 'zeta' de Riemann dans la fenetre Argument sous la forme de deux */ /* images Flottantes donnant le Module et la Phase. */ EDEFV(imageF,partie_imaginaire_de_la_fonction_zeta_de_Riemann); EDEFV(imageF,partie_reelle_de_la_fonction_zeta_de_Riemann); /* Valeur de la fonction 'zeta' de Riemann dans la fenetre Argument sous la forme de deux */ /* images Flottantes. */ EDEFV(imageJ,fonction_zeta_de_Riemann); /* Valeur de la fonction 'zeta' de Riemann dans la fenetre Argument. */ RETI(moduleR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' zeta ' D E R I E M A N N */ /* D A N S L E P L A N C O M P L E X E A V E C L E P R O L O N G E M E N T A N A L Y T I Q U E : */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* ...###%%%%OOOOOoooooooo#..... */ /* -......###%%%%%OOOOOO%%%######################################## */ /* :---......#####%%%%%%%%######################################### */ /* oo::---.......################################################## */ /* OOoo::---.........############################################## */ /* %%OOoo::---............. ##################################### */ /* #%%OOooo::---................. */ /* .##%%OOoo:::---................. */ /* ...#%%OOoo:::--.................. */ /* ....#%%OOoo::---................ */ /* --...#%%OOo:::--............. */ /* :-...##%OOoo:---........ ####################################### */ /* o:-...#%%Ooo:--.....############################################ */ /* o::-..##%Ooo:-....############################################## */ /* Oo:-...#%Oo::-.. #%%OOO%%####################################### */ /* :::: :::: :::::: */ /* -:oO%##..-:ooO%##...--.......... */ /* :ooO%#...-::oOO%##............... */ /* :oO%%#...-::oOO%%### ............ */ /* oOO%#...--::ooOO%%%###### ... */ /* OO%##...--::ooOO%%%############################################# */ /* O%##...--::ooOOO%%%%############################################ */ /* %##...--::oooOOO%%%%############################################ */ /* #....--::oooOOO%%%%############################################# */ /* ...---::ooOOOO%%%%############################################## */ /* ..--::oooOOO%%%%########### */ /* --::oooOO%%%%##### ............. */ /* ::ooOOO%%%####................... */ /* ooOO%%%###....................... */ /* O%%%###.........-----.......... */ /* %## .......-----:::::::.######################################## */ /* ......----:::::ooooooOO%######################################## */ /* */ /* */ /* Il s'agit de la phase calculee dans la */ /* fenetre [-10.0,+20.0]x[-15.0,+15.0] a */ /* l'aide du programme 'v $xrc/zeta.21$K'. */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_prolongement_analytique_zeta_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_prolongement_analytique_zeta_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_prolongement_analytique_zeta_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCzeta_sommation_Euler_MacLaurin /* Common,DEFV(Fonction,) : \ */ ,fFCzeta_sommation_Euler_MacLaurin_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFCzeta_sommation_Euler_MacLaurin_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFCzeta_sommation_Euler_MacLaurin_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFCzeta_sommation_Euler_MacLaurin_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFCzeta_sommation_Euler_MacLaurin_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"zeta" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_prolongement_analytique_zeta_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_prolongement_analytique_zeta_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' cos ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_cosinus_circulaire_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_cosinus_circulaire_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_cosinus_circulaire_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_circulaire_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_circulaire_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_circulaire_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_circulaire_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"cos" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_cosinus_circulaire_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_cosinus_circulaire_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' sin ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_sinus_circulaire_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_sinus_circulaire_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_sinus_circulaire_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_circulaire_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_circulaire_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_circulaire_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_circulaire_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"sin" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_sinus_circulaire_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_sinus_circulaire_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' tg ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_tangente_circulaire_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_tangente_circulaire_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_tangente_circulaire_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_circulaire_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_circulaire_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_circulaire_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_circulaire_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"tg" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_tangente_circulaire_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_tangente_circulaire_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' ch ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_cosinus_hyperbolique_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_cosinus_hyperbolique_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_cosinus_hyperbolique_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_hyperbolique_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_hyperbolique_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_hyperbolique_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_hyperbolique_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"ch" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_cosinus_hyperbolique_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_cosinus_hyperbolique_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' sh ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_sinus_hyperbolique_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_sinus_hyperbolique_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_sinus_hyperbolique_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_hyperbolique_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_hyperbolique_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_hyperbolique_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_hyperbolique_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"sh" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_sinus_hyperbolique_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_sinus_hyperbolique_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' th ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_tangente_hyperbolique_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_tangente_hyperbolique_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_tangente_hyperbolique_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_hyperbolique_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_hyperbolique_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_hyperbolique_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_hyperbolique_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"th" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_tangente_hyperbolique_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_tangente_hyperbolique_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' exp ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_exponentielle_neperienne_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_exponentielle_neperienne_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_exponentielle_neperienne_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCexponentielle_neperienne /* Common,DEFV(Fonction,) : \ */ ,fFCexponentielle_neperienne_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFCexponentielle_neperienne_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFCexponentielle_neperienne_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFCexponentielle_neperienne_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFCexponentielle_neperienne_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"exp" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_exponentielle_neperienne_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_exponentielle_neperienne_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20090303145735... */ EFonctionJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' log ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionJ DEFV(Common,DEFV(Logical,SINT(IJfonction_logarithme_dans_C_____edit,FAUX))); DEFV(Common,DEFV(Logical,SINT(IJfonction_logarithme_dans_C_____simp,FAUX))); /* Possibilite introduite le 20120121174948 et completee le 20120124091005... */ DEFV(Common,GENERE__FonctionJ_I_FONCTION_C(IJfonction_logarithme_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFClogarithme /* Common,DEFV(Fonction,) : \ */ ,fFClogarithme_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFClogarithme_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFClogarithme_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFClogarithme_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFClogarithme_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"log" /* Common,DEFV(Fonction,) : \ */ ,IJfonction_logarithme_dans_C_____edit /* Common,DEFV(Fonction,) : \ */ ,IJfonction_logarithme_dans_C_____simp /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionJ #undef GENERE__FonctionJ_I_FONCTION_C /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T E U R D E F O N C T I O N S I T E R A N T */ /* U N E F O N C T I O N D A N S L E P L A N C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #pragma xcg__gen_ext_Z__gen_Fonction_SE__GENERE__Fonction GENERE__FonctionP_I_ITERAT_F_C POINTERp /* Introduit le 20040520121238. */ #define GENERE__FonctionP_I_ITERAT_F_C(nom_et_arguments_de_la_fonction,Nfonction,Vfonction,seuil_du_carre_du_module) \ /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees */ \ /* a la recuperation automatique des fichiers d'arguments ; on trouvera donc : */ \ /* */ \ /* GENERE__FonctionP_FONCTION_C(nom_et_arguments_de_la_fonction,Nfonction,Vfonction) */ \ /* */ \ /* D'autre part, la fonction 'Nfonction' devra etre de nom '__...' afin que son nombre */ \ /* d'arguments ne soit pas verifie ('v $xcg/gen.arg$D/debut$I __f'). */ \ DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction)) \ /* ATTENTION, il ne faut pas ecrire : */ \ /* */ \ /* DEFV(Common,DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction))) */ \ /* */ \ /* mais : */ \ /* */ \ /* DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction)) */ \ /* */ \ /* puisqu'en effet la directive 'Common' est utilisee lors de l'appel par : */ \ /* */ \ /* DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(...)) */ \ /* */ \ /* Actuellement cette redondance ne serait pas genante, mais plus tard... */ \ DEFV(Argument,DEFV(image,imageR)); \ /* Image Resultat a generer. */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); \ /* Definition du point situe en bas et a gauche de la fenetre, */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); \ /* Definition du point situe en haut et a droite de la fenetre. */ \ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); \ /* Nombre maximal d'iterations demande. */ \ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); \ /* Cet indicateur logique permet de choisir le type d'information que */ \ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ \ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ \ /* n */ \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ BVARIABLES_F_ITERATION_DANS_C \ /*..............................................................................................................................*/ \ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; \ \ INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; \ /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ \ /* 20061219090342). */ \ \ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; \ /* Introduit le 20190314183222... */ \ \ begin_image \ Bblock \ gF_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(seuil_du_carre_du_module) \ ,BLOC(Bblock \ INITIALISATION_DU_POINT_COURANT_DANS_C; \ Eblock \ ) \ /* Introduit le 20091012111043... */ \ ,BLOC(Bblock \ Cegal(suite_point,point_courant); \ /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', */ \ /* soit : */ \ /* */ \ /* Z = C */ \ /* 0 */ \ /* */ \ EGAL(nombre_courant_d_iterations,UN); \ /* Initialisation du compteur des iterations ; ce compteur est initialise */ \ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ \ /* valeur non nulle soit rangee... */ \ Eblock \ ) \ ,BLOC(VIDE; \ ) \ ,BLOC(Bblock \ CALS(Nfonction(suite_point)); \ Cegal(suite_point,Vfonction); \ /* Et iteration de la fonction : */ \ /* */ \ /* Z = Nfonction(Z ) */ \ /* n n */ \ /* */ \ /* en notant qu'il est preferable de ne pas ecrire : */ \ /* */ \ /* Cegal(suite_point,Nfonction(suite_point)); */ \ /* */ \ /* car cette derniere ecriture, de par la programmation de 'v $ximcd/operator$FON Cegal', */ \ /* provoquerait deux fois le calcul de la fonction 'Nfonction(suite_point)'... */ \ Eblock \ ) \ ,BLOC(VIDE; \ ) \ /* Introduit le 20150225152454... */ \ ); \ Eblock \ end_image \ \ RETI(imageR); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' gamma ' */ /* D A N S L E P L A N C O M P L E X E A V E C L E P R O L O N G E M E N T A N A L Y T I Q U E : */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* O:-..%Oo:-..#%Oo:o#-...-:ooO%%#... */ /* :..#Oo:-..%Oo:-... # :ooO%##...-::o */ /* .#%o:-.#%Oo:-..#% -#oO%#...--:ooO%%# */ /* %Oo-..%Oo:-.#%Oo: . ....-:ooO%%##...- */ /* Oo:..%Oo:..#%Oo:-... :oOO%# ...--:ooO */ /* :-.#Oo:..#Oo:-..#%O##.o%#...--::oOO%%##. */ /* :. %o:..%Oo:..#%Oo:-o###.--:ooO%%##....--: */ /* -.#O:-.#Oo-..%Oo:-..#O:.:oO%%##...--::oooOO% */ /* ..%O:.#%o-.#%O:-..%Ooo ::%....-::ooOO%%###.... */ /* .%o-.%O:. %o:..#Oo:-..: o% ooOO%##.....---:::oo */ /* .%o-.%o-.%O:..%o:-.#%Oo .::.#...--:::ooOOOO%%%### */ /* :.%o-.%o-.%o-.%o-.#%o:-... -Oo ooOO%%###.......----- */ /* :.#O-.%o.#O:.#O:.#O:-.#Oo :-o#O-...----:::oooooOOOOO%% */ /* O-.O:.%o-#O:.%o-.%:. %o-..:.%.#. OO%%%%#####............ */ /* O:.%o-#O-.O:.%o-#O:.%o o-%:-# .#. --:::::::::oooooooooooo */ /* o:#O: #:.#:.#::#o:#OO O #O## #%.%....................... */ /* .:%.:O -o#.o%.:O.-o#.: .% o ##-.. OOOoooooooooo:::::::::: */ /* -o#.o%.:O#-o%.:O#.:O#.:O:. #.:O. ---......... #######%%% */ /* :O.-o%.:O#-o%.-o%.-:O#..- #: o##%%%OOOoooo:::::------ */ /* :%.-O#.:O#.:O#.:o%..-oO%#.--:# ::--......###%%%%OOOO */ /* :%.:O#.:O%.-o%#.-oO%..-:o: .o.##%%OOoo:::---...... */ /* O#.:o%.-o%#.-oO#..:oO%#.#O: ::--....##%%%OOoooo: */ /* O%.-o%#.:o%#.-:O%#..-: ..o.#%%OOo::---.... ##% */ /* o%.-:O%.-:o%#.-:oO%#. -.%:--...##%%OOoo::--- */ /* o%#.-oO#.-:oO%..-:oOo##:%OOo::--...##%%OOO */ /* .:O%..:oO#..-oO%#..-#-. ...#%%Ooo::--.... */ /* .:oO#.-:oO#..-:oO%#-#- o:--...#%%OOoo:: */ /* .-:o%#.-:oO%#..-: :o-##%Ooo:--...##%% */ /* %..-:O%#..:oO%#.. -. -...#%OOo::--.. */ /* oO#..-oO%#..-:oO%% oo:-...#%%OOo: */ /* -:O%#.-:oO%#..-:o:o#.#%Ooo:-...##% */ /* ..:oO%#.-:oO%#..-O #-..#%%Ooo:--. */ /* */ /* */ /* Il s'agit de l'image 'v $xiirc/ITGA.11$Ph p=$xiP/dentscie.R4' */ /* calculee a l'aide du programme 'v $xrc/gamma.31$K'. */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_prolongement_analytique_gamma_dans_C_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_prolongement_analytique_gamma_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCgamma_sommation_Euler_MacLaurin /* Common,DEFV(Fonction,) : \ */ ,fFCgamma_sommation_Euler_MacLaurin_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_prolongement_analytique_gamma_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' zeta ' D E R I E M A N N */ /* D A N S L E P L A N C O M P L E X E A V E C L E P R O L O N G E M E N T A N A L Y T I Q U E : */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* --...##%OOoo:::--......#####%%-:::::#o%-........................ */ /* Oo::-....#%%OOooo::---......-o-o:::O.%O:######################## */ /* #%%Ooo:--...##%%OOOoo::::---::::::::::#.#%%%%%%%%%%%%%%%%%%%%%%% */ /* ...#%%Ooo:--....##%%OOOoooo:-:::::::::O.oOOOOOOOOOOOOOOOOOOOOOOO */ /* ::-...#%%Ooo:--....###%%%O-.:::::::::::.%ooooooooooooooooooooooo */ /* %Oo:--...#%OOoo:--.....##O-%.::::::::::.:----::::::::::::::::::: */ /* .#%Ooo:-...#%%Ooo::--...::#%O::::::::%:o........................ */ /* -..#%%Oo:--..##%OOo::--:%.o-o-:O::O:-o%:........................ */ /* o:-..#%%Oo:--..##%OOo-#o::::::::::#%OOo-######################## */ /* %Oo:-..#%%Oo:-...#::.::::::::::::::::#:o%%%%%%%%%%%%%%%%%%%%%%%% */ /* .#%Oo:-..#%Oo::o#O%#:::::::::::::::::.o#OOOOOOOOOOOOOOOOOOOOOOOO */ /* -..#%Oo:-..#:#:::::::::::::::::::::::-:%oooooooooooooooooooooooo */ /* o:-.#%Oo:-%:O:::::::::::::::::::::::::O#:::::::::::::::::::::::: */ /* %o:-..#o::::::::::::::::::::::::::::::..%----------------------- */ /* .%Oo::.O::::::::::::::::::::::::::::::.OO....................... */ /* :#%:::::::::::::::::::::::::::::::o............................. */ /* #.-#-::::::::::::::::::::::::::::::::.#-:%%%%%%%%%%%%%%%%%%%%%%% */ /* .-:O%#:::::::::::::::::::::::::::::::::.-OOOOOOOOOOOOOOOOOOOOOOO */ /* :oO% .-:oO-o-:::::::::::::::::::::::::.-oooooooooooooooooooooooo */ /* O%#..-:oO%#.:.::::::::::::::::::::::::O::::::::::::::::::::::::: */ /* #..-:oO%#..-::oO.-.-:::::::::::::::::.:.------------------------ */ /* .-:oO%#...-:oO%%#....:::::::::::::::..O:........................ */ /* :oO%##..-:oOO%#...--:##-::::::::::.:-:o%........................ */ /* O%#...-:oOO%#...--::ooO%.#-O:o:.:O:oOo.O######################## */ /* #..--:oOO%#...--:ooOO%%%::#..::::::::-:o%%%%%%%%%%%%%%%%%%%%%%%% */ /* .-:ooO%##...-::ooOO%%##...o.::::::::::O#OOOooooooooooooooooooooo */ /* :oO%%#...--:ooOO%%##.....-o%:::::::::::-O::::::::::::::::::::::: */ /* O%#...--:ooOO%##.....---:::.:::::::::::.%----------------------- */ /* ...-::ooO%%##....--:::oooOOO%-::::::::-#........................ */ /* -::oOO%##....--::oooOOO%%%%#o-O-.::O.-:O........................ */ /* oO%%#....--::ooOO%%%####....#.oO::::o:.%.####################### */ /* ##...--::ooOO%%##.......----O.::::::::::%%%%%%%%%%%%%%%%%%%%%%%% */ /* */ /* */ /* Il s'agit de l'image 'v $xiirc/ITZE.11$Ph p=$xiP/dentscie.R4' */ /* calculee a l'aide du programme 'v $xrc/zeta.31$K'. */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_prolongement_analytique_zeta_dans_C_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_prolongement_analytique_zeta_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCzeta_sommation_Euler_MacLaurin /* Common,DEFV(Fonction,) : \ */ ,fFCzeta_sommation_Euler_MacLaurin_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_prolongement_analytique_zeta_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' cos ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_cosinus_circulaire_dans_C_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_cosinus_circulaire_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_cosinus_circulaire_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' sin ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_sinus_circulaire_dans_C_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_sinus_circulaire_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_sinus_circulaire_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' tg ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_tangente_circulaire_dans_C_____seuil,FDEUX))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_tangente_circulaire_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_tangente_circulaire_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' ch ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_cosinus_hyperbolique_dans_C_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_cosinus_hyperbolique_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFCcosinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_cosinus_hyperbolique_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' sh ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_sinus_hyperbolique_dans_C_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_sinus_hyperbolique_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFCsinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_sinus_hyperbolique_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' th ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_tangente_hyperbolique_dans_C_____seuil,FDEUX))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_tangente_hyperbolique_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFCtangente_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_tangente_hyperbolique_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' exp ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_exponentielle_neperienne_dans_C_____seuil,FLOT(MILLIARD)))); /* Seuil de divergence du carre du module lors des iterations. */ /* */ /* Le 20090303182646, il est passe de 'FDEUX' a 'MILLIARD'... */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_exponentielle_neperienne_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFCexponentielle_neperienne /* Common,DEFV(Fonction,) : \ */ ,fFCexponentielle_neperienne_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_exponentielle_neperienne_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20090303145735... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' log ' C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_logarithme_dans_C_____seuil,FDEUX))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_C(Iiteration_logarithme_dans_C(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFClogarithme /* Common,DEFV(Fonction,) : \ */ ,fFClogarithme_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_logarithme_dans_C_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ EFonctionP #undef GENERE__FonctionP_I_ITERAT_F_C /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D ' U N P O L Y N O M E V A R I A B L E Q U E L C O N Q U E */ /* D A N S L E P L A N C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* z = C */ /* 0 */ /* */ /* z = polynome(z ) */ /* n+1 n */ /* */ /* (ou 'C' designe le point Courant). */ /* */ /* La fonction 'polynome(...)' est definie */ /* par (la translation 't' de l'exposant pouvant */ /* etre negative a compter du 20100316172716) : */ /* */ /* 0+t 1+t p+t */ /* polynome(z) = A .z + A .z + ... + A .z + alpha.A + beta.C */ /* 0 1 p */ /* */ /* (ou 'A' et 'C' designent respectivement un */ /* nombre complexe arbitraire Argument et le */ /* point Courant). Quant a la suite de coefficients */ /* {A0,A1,...,Ap} elle est definie a partir d'un album */ /* d'images (indexe par 'Z' -majuscule-, d'ou ici le choix */ /* de 'z' -minuscule- pour designer un nombre complexe). */ /* */ /* Mais ATTENTION, si cela permet de faire varier */ /* localement le polynome au point {X,Y} on notera */ /* bien que : */ /* */ /* C # X + i.Y */ /* */ /* a priori (les coordonnees {X,Y} sont relatives */ /* a une image, alors que 'C' est dans le plan */ /* complexe. Cela signifie que lors d'un changement */ /* de la fenetre de calcul {coin_bas_gauche,coin_haut_droite} */ /* (par zoom et/ou translation), les coefficients {A0,A1,...,Ap} */ /* du polynome, eux, resteront les memes... */ /* */ /* Enfin, on notera deux choix importants possibles : */ /* */ /* {alpha=1,beta=0} : ensemble de type "Julia", */ /* {alpha=0,beta=1} : ensemble de type "Mandelbrot", */ /* */ /* toutes les autres combinaisons etant evidemment */ /* possibles... */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Int,SINT(Iiteration_polynome_variable_quelconque_dans_C_____premier_exposant_du_polynome,ZERO))); /* Introduit le 20100316172716 afin de pouvoir des polynomes contenant des puissances */ /* negatives de 'Z'... */ DEFV(Common,DEFV(FonctionP,POINTERp(Iiteration_polynome_variable_quelconque_dans_C(imageR ,definition_du_polynome ,ponderation_du_nombre_complexe_argument_A ,ARGUMENT_POINTERs(nombre_complexe_argument_A) ,ponderation_du_nombre_complexe_courant_C ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_maximal_d_iterations ,seuil_du_carre_du_module ,visualisation_arguments_de_sortie ) ) ) ) /* Fonction introduite le 20040508115225... */ DEFV(Argument,DEFV(image,imageR)); /* Image Resultat a generer. */ DEFV(Argument,DEFV(albumF,definition_du_polynome)); /* Definition du polynome variable (en {X,Y}) a l'aide d'un album. */ DEFV(Argument,DEFV(Float,ponderation_du_nombre_complexe_argument_A)); /* Ponderation du nombre complexe argument 'A' (dit 'alpha' dans 'alpha.A + beta.C'). */ DEFV(Argument,DEFV(complexe,POINTERs(nombre_complexe_argument_A))); /* Nombre complexe argument 'A'. */ DEFV(Argument,DEFV(Float,ponderation_du_nombre_complexe_courant_C)); /* Ponderation du nombre complexe courant 'C' (dit 'beta' dans 'alpha.A + beta.C'). */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Float,seuil_du_carre_du_module)); /* Seuil du carre du module definissant l'arret des iterations. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_C /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES; /* Introduit le 20190314183222... */ begin_image Bblock gF_ITERATION_DANS_C(TEST_DU_CARRE_DU_MODULE_DANS_C(seuil_du_carre_du_module) ,BLOC(Bblock INITIALISATION_DU_POINT_COURANT_DANS_C; Eblock ) /* Introduit le 20091012111043... */ ,BLOC(Bblock Cegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes avec : */ /* */ /* z = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(VIDE; ) ,BLOC(Bblock DEFV(complexe,puissance_courante); DEFV(complexe,polynome_courant); aCpuissance(puissance_courante ,point_courant ,Iiteration_polynome_variable_quelconque_dans_C_____premier_exposant_du_polynome ); /* Avant le 20100316172716, il y avait ici : */ /* */ /* Cinitialisation(puissance_courante,R1_Complexe,I0_Complexe); */ /* */ /* ce qui revient au meme lorsque l'exposant est nul : */ /* */ /* 0 */ /* puissance(z) = z = {1,0} */ /* */ /* ce qui est le cas par defaut... */ aCcombinaison_lineaire_2(polynome_courant ,ponderation_du_nombre_complexe_argument_A ,INDIRECT(nombre_complexe_argument_A) ,ponderation_du_nombre_complexe_courant_C ,point_courant ); /* Definition du polynome et initialisation avec : */ /* */ /* polynome(z ) = alpha.A + beta.C */ /* n */ /* */ begin_fuite Bblock DEFV(Float,INIT(coefficient_polynomial,AloadF_point(definition_du_polynome,X,Y,Z))); /* ATTENTION : ne pas confondre le 'Z' ci-dessus qui indexe les pages de l'album et les */ /* nombres complexes 'Z' (notes d'ailleurs 'z' a cause de cela...). */ DEFV(complexe,monome_courant); aCforme_lineaire(monome_courant,coefficient_polynomial,puissance_courante,FZERO); aCsomme(polynome_courant,polynome_courant,monome_courant); aCproduit(puissance_courante,puissance_courante,suite_point); /* Calcul du polynome courant : */ /* */ /* 0 1 p */ /* polynome(z) = A .z + A .z + ... + A .z + alpha.A + beta.C */ /* 0 1 p */ /* */ /* ou 'A(i)' designe la i-ieme page de l'album 'definition_du_polynome'... */ Eblock end_fuite Cegal(suite_point,polynome_courant); /* Et iteration de la fonction : */ /* */ /* z = polynome(z ) */ /* n+1 n */ /* */ Eblock ) ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP #undef F_ITERATION_DANS_C #undef gF_ITERATION_DANS_C #undef gF_ITERATION_DANS_C__INITIALISATIONS_DIVERSES #undef BVARIABLES_F_ITERATION_DANS_C #undef gF_ITERATION_DANS_C__EDITION_EVENTUELLE_DES_TRAJECTOIRES #undef IGNORER__Xmax__Ymax #undef IGNORER__Xmin__Ymin #undef Xmax_Ymax__UNDEF #undef Xmin_Ymin__UNDEF #undef TEST_DU_CARRE_DU_MODULE_DANS_C #undef F_ITERATION_QUELCONQUE_DANS_C #undef BVARIABLES_F_ITERATION_QUELCONQUE_DANS_C #undef BVARIABLES_F_ITERATION_QUELCONQUE_DANS_C_SANS_point_courant /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S N E C E S S A I R E S A U C A L C U L E N " E N T I E R " C O M P L E X E */ /* S U I V A N T U N P R O C E S S U S N O N O P T I M I S E : */ /* */ /*************************************************************************************************************************************/ #define BVARIABLES_I_ITERATION_DANS_C \ /* Definition des variables communes a 'Julia' et 'Mandelbrot'. */ \ VARIABLES_RELATIVES_A_LA_NECESSITE_D_HOMOTHETIE; \ /* L'ajustement de la proportion des dimensions des fenetres au rapport dimX/dimY est-il */ \ /* necessaire (introduit le 20091124124351) ? */ \ \ DEFV(Float,INIT(x_homothetie \ ,DIVI(SOUS(X_COIN_HAUT_DROITE \ ,X_COIN_BAS_GAUCHE \ ) \ ,FLOT(dimX) \ ) \ ) \ ); \ /* "Taille" reelle de la fenetre rapportee a la taille des images, */ \ DEFV(Float,INIT(y_homothetie \ ,DIVI(SOUS(Y_COIN_HAUT_DROITE \ ,Y_COIN_BAS_GAUCHE \ ) \ ,FLOT(dimY) \ ) \ ) \ ); \ /* "Taille" imaginaire de la fenetre rapportee a la taille des images. */ \ DEFV(complexe,point_courant); \ /* Point complexe courant 'C' dans la fenetre. */ \ DEFV(complexe,suite_point); \ /* Suite des points complexes Z lors de l'iteration. */ \ /* n */ \ DEFV(complexe,point_manoeuvre); \ /* Point complexe de maneuvre lors de l'iteration. */ \ DEFV(pointI_2D,transforme); \ /* Point transforme dans [Xmin,Xmax][Ymin,Ymax]. */ \ DEFV(pointI_2D,intermediaire); \ /* Point intermediaire transforme dans [Xmin,Xmax][Ymin,Ymax]. */ \ BDEFV(imageI,partie_reelle); \ /* Partie reelle dans [Xmin,Xmax] de la transformee Z = f(Z ). */ \ /* 1 0 */ \ BDEFV(imageI,partie_imaginaire); \ /* Partie imaginaire dans [Ymin,Ymax] de la transformee Z = f(Z ). */ \ /* 1 0 */ \ BDEFV(imageF,module_au_carre); \ /* Module au carre dans R de la transformee Z = f(Z ). */ \ /* 1 0 */ \ VARIABLES_COMMUNES_DES_ITERATIONS_DANS_C_HC_HHC; #define EVARIABLES_I_ITERATION_DANS_C \ /* Fin de definition des variables communes a 'Julia' et 'Mandelbrot'. */ \ EDEFV(imageF,module_au_carre); \ /* Module au carre dans R de la transformee Z = f(Z ). */ \ /* 1 0 */ \ EDEFV(imageI,partie_imaginaire); \ /* Partie imaginaire dans [Ymin,Ymax] de la transformee Z = f(Z ). */ \ /* 1 0 */ \ EDEFV(imageI,partie_reelle); \ /* Partie reelle dans [Xmin,Xmax] de la transformee Z = f(Z ). */ \ /* 1 0 */ #define INITIALISATION_I_ITERATION_DANS_C(init_iteration,fonc_iteration) \ /* Sequence d'initialisation du calcul iteratif au point {X,Y}. */ \ Bblock \ INITIALISATION_DU_POINT_COURANT_DANS_C; \ /* Le "point_courant" 'C' est le point courant {X,Y} sur le maillage de l'image. */ \ BLOC(init_iteration); \ /* Initialisation de la suite des nombres complexes sur le "point_courant", */ \ /* soit : */ \ /* */ \ /* Z = 0 */ \ /* 0 */ \ /* */ \ /* ou : */ \ /* */ \ /* Z = C */ \ /* 0 */ \ /* */ \ aCproduit(point_manoeuvre,suite_point,suite_point); \ /* Calculons : */ \ /* */ \ /* 2 */ \ /* Z */ \ /* n */ \ /* */ \ \ BLOC(fonc_iteration); \ /* Puis : */ \ /* */ \ /* 2 */ \ /* Z + C */ \ /* n */ \ /* */ \ /* ou : */ \ /* */ \ /* 2 */ \ /* Z + A */ \ /* n */ \ /* */ \ \ TEST_D_UNDERFLOW_D_UNE_SUITE_COMPLEXE(suite_point,iterations_dans_C_HC_HHC_____epsilon); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter */ \ /* des underflows flottants... */ \ \ storeI_point(X_PLAN_IMAGE_MODULO \ ,partie_reelle \ ,X,Y \ ); \ /* Memorisation de la partie reelle de la transformee dans [Xmin,Xmax]. */ \ storeI_point(Y_PLAN_IMAGE_MODULO \ ,partie_imaginaire \ ,X,Y \ ); \ /* Memorisation de la partie imaginaire de la transformee dans [Ymin,Ymax]. */ \ storeF_point(Cmodule2(suite_point) \ ,module_au_carre \ ,X,Y \ ); \ /* Memorisation du carre du module de la transformee. */ \ Eblock #define I_ITERATION_DANS_C(init_iteration) \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ Bblock \ INITIALISATION_POINT_2D(transforme,X,Y); \ /* Initialisation de Z "entiere" sur le point courant {X,Y}. */ \ /* n */ \ BLOC(init_iteration); \ /* Initialisation du compteur des iterations. */ \ \ Tant(IFET(IFLT(loadF_point(module_au_carre,ASD1(transforme,x),ASD1(transforme,y)) \ ,iterations_diverses_dans_C_____seuil_du_carre_du_module \ ) \ ,PAS_ASSEZ_D_ITERATIONS \ ) \ ) \ Bblock \ INCR(nombre_courant_d_iterations,I); \ INITIALISATION_POINT_2D(intermediaire \ ,loadI_point(partie_reelle,ASD1(transforme,x),ASD1(transforme,y)) \ ,loadI_point(partie_imaginaire,ASD1(transforme,x),ASD1(transforme,y)) \ ); \ TRANSFERT_POINT_2D(transforme,intermediaire); \ /* Puis : */ \ /* */ \ /* 2 */ \ /* Z = Z + C */ \ /* n+1 n */ \ /* */ \ /* ou : */ \ /* */ \ /* 2 */ \ /* Z = Z + A */ \ /* n+1 n */ \ /* */ \ Eblock \ ETan \ \ Test(IL_FAUT(visualisation_arguments_de_sortie)) \ Bblock \ Test(IL_NE_FAUT_PAS(iterations_dans_C_HC_HHC_____memoriser_le_module_plutot_que_les_arguments)) \ Bblock \ EGAL(niveau_courant_precis \ ,ATAN(Y_IMAGE_PLAN(ASD1(transforme,y)) \ ,X_IMAGE_PLAN(ASD1(transforme,x)) \ ) \ ); \ EGAL(niveau_courant \ ,GENP(SCAL(niveau_courant_precis \ ,CERCLE_TRIGONOMETRIQUE \ ,BLANC \ ) \ ) \ ); \ Eblock \ ATes \ Bblock \ EGAL(niveau_courant_precis \ ,Rho_2D(X_IMAGE_PLAN(ASD1(transforme,x)) \ ,Y_IMAGE_PLAN(ASD1(transforme,y)) \ ) \ ); \ EGAL(niveau_courant \ ,GENP(SCAL(TRON(niveau_courant_precis \ ,iterations_dans_C_HC_HHC_____minimum_du_module_a_memoriser_plutot_que_les_arguments \ ,iterations_dans_C_HC_HHC_____maximum_du_module_a_memoriser_plutot_que_les_arguments \ ) \ ,SOUS(iterations_dans_C_HC_HHC_____maximum_du_module_a_memoriser_plutot_que_les_arguments \ ,iterations_dans_C_HC_HHC_____minimum_du_module_a_memoriser_plutot_que_les_arguments \ ) \ ,BLANC \ ) \ ) \ ); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ EGAL(niveau_courant_precis \ ,CASP_Float(nombre_courant_d_iterations) \ ); \ /* La procedure 'CASP_Float(...)' a remplace un 'CASP(genere_Float,...)' le 20090331103211. */ \ EGAL(niveau_courant \ ,GENP(SCAL(nombre_courant_d_iterations \ ,nombre_maximal_d_iterations \ ,BLANC \ ) \ ) \ ); \ Eblock \ ETes \ \ RANGEMENT_DU_NIVEAU_COURANT_ET_EVENTUELLEMENT_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; \ /* Et enfin, marquage du point courant. */ \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D ' U N F A U X E N S E M B L E D E M A N D E L B R O T C O M P L E X E */ /* D A N S U N E F E N E T R E S U I V A N T U N P R O C E S S U S N O N O P T I M I S E : */ /* */ /* */ /* Nota : */ /* */ /* Lors du calcul de l'ensemble */ /* de Mandelbrot, a chaque iteration, */ /* on reprend en compte le nombre */ /* complexe courant 'C' d'ou on est */ /* parti ; or ici, on utilise une */ /* espece de matrice de permutation */ /* calculee une fois pour toute, */ /* dont l'apport de 'C' n'a lieu qu'a */ /* la premiere iteration : c'est donc */ /* un "faux" Mandelbrot... */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Ifaux_mandelbrot_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_I_ITERATION_DANS_C /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ begin_image Bblock INITIALISATION_I_ITERATION_DANS_C(BLOC(Bblock Cegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le point courant, soit : */ /* */ /* Z = C */ /* 0 */ /* */ /* On notera la difference avec 'IFmandelbrot' qui est rendue necessaire par le fait que */ /* lors de l'initialisation une seule iteration est effectuee, et que partant de '0', on */ /* trouverait ainsi : */ /* */ /* Z = C */ /* 1 */ /* */ /* Ainsi, lors de l'iteration (vu son principe), on resterait sur place puisque : */ /* */ /* transforme(X ou Y) = (X ou Y) */ /* */ /* via les matrices 'partie_reelle' et 'partie_imaginaire'... */ Eblock ) ,BLOC(Bblock aCsomme(suite_point,point_manoeuvre,point_courant); /* Puis : */ /* */ /* 2 */ /* Z = Z + C */ /* n+1 n */ /* */ /* ou 'C' designe le point Courant. */ Eblock ) ); Eblock end_image begin_image Bblock I_ITERATION_DANS_C(BLOC(Bblock EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations. */ Eblock ) ); Eblock end_image EVARIABLES_I_ITERATION_DANS_C RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D ' U N F A U X E N S E M B L E D E J U L I A C O M P L E X E */ /* D A N S U N E F E N E T R E S U I V A N T U N P R O C E S S U S N O N O P T I M I S E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Ifaux_julia_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(nombre_argument) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(nombre_argument))); /* Nombre complexe "generateur" de l'ensemble de Julia que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ /* de Z lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ /* n */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_I_ITERATION_DANS_C DEFV(complexe,point_argument); /* Point complexe argument. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ Cegal(point_argument,INDIRECT(nombre_argument)); /* Recuperation du nombre complexe "generateur"... */ begin_image Bblock INITIALISATION_I_ITERATION_DANS_C(BLOC(Bblock Cegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le "point_courant", soit : */ /* */ /* Z = C */ /* 0 */ /* */ Eblock ) ,BLOC(Bblock aCsomme(suite_point,point_manoeuvre,point_argument); /* Puis : */ /* */ /* 2 */ /* Z = Z + A */ /* n+1 n */ /* */ /* ou 'A' designe le point Argument. */ Eblock ) ); Eblock end_image begin_image Bblock I_ITERATION_DANS_C(BLOC(Bblock EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ); Eblock end_image EVARIABLES_I_ITERATION_DANS_C RETI(imageR); Eblock EFonctionP #undef I_ITERATION_DANS_C #undef INITIALISATION_I_ITERATION_DANS_C #undef EVARIABLES_I_ITERATION_DANS_C #undef BVARIABLES_I_ITERATION_DANS_C #undef SEUIL_MODULE_DANS_C /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S E U I L D U M O D U L E " C H E V E L U " C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Float,ZINT(F_ITERATION_CHEVELUE_DANS_C_____seuil_du_carre_du_module,EXP2(GRO16(UNITE))))); /* Seuil de divergence du carre du module d'un nombre complexe de la suite. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S N E C E S S A I R E S A U C A L C U L " C H E V E L U " C O M P L E X E */ /* E N " F L O T T A N T " S U I V A N T U N P R O C E S S U S N O N O P T I M I S E : */ /* */ /*************************************************************************************************************************************/ #define BVARIABLES_F_ITERATION_CHEVELUE_DANS_C \ /* Definition des variables communes a 'Julia' et 'Mandelbrot'. */ \ VARIABLES_RELATIVES_A_LA_NECESSITE_D_HOMOTHETIE; \ /* L'ajustement de la proportion des dimensions des fenetres au rapport dimX/dimY est-il */ \ /* necessaire (introduit le 20091124124351) ? */ \ \ DEFV(Float \ ,INIT(x_homothetie \ ,DIVI(SOUS(X_COIN_HAUT_DROITE \ ,X_COIN_BAS_GAUCHE \ ) \ ,FLOT(dimX) \ ) \ ) \ ); \ /* "Taille" reelle de la fenetre rapportee a la taille des images, */ \ DEFV(Float \ ,INIT(y_homothetie \ ,DIVI(SOUS(Y_COIN_HAUT_DROITE \ ,Y_COIN_BAS_GAUCHE \ ) \ ,FLOT(dimY) \ ) \ ) \ ); \ /* "Taille" imaginaire de la fenetre rapportee a la taille des images. */ \ DEFV(Positive,INIT(nombre_courant_d_iterations,UNDEF)); \ /* Nombre courant d'iterations. */ \ DEFV(Logical,INIT(iterer,LUNDEF)); \ /* Indicateur precisant s'il faut iterer ('VRAI') ou s'arreter ('FAUX'). */ \ DEFV(complexe,point_courant); \ /* Point complexe courant 'C' dans la fenetre. */ \ DEFV(complexe,suite_point); \ /* Suite des points complexes Z lors de l'iteration. */ \ /* n */ \ DEFV(complexe,derivee_suite_point); \ /* Suite des derivees complexes dZ lors de l'iteration, ou 'dZ' designe la derivee de */ \ /* n */ \ /* l'iteration par rapport au point courant 'C' ; elle est definie par la recurrence : */ \ /* */ \ /* dZ = (2.Z .dZ ) + 1 */ \ /* n+1 n n */ \ /* */ \ /* ou : */ \ /* */ \ /* dZ = (2.Z .dZ ) + 0 */ \ /* n+1 n n */ \ /* */ \ /* avec : */ \ /* */ \ /* dZ = 0 */ \ /* 0 */ \ /* */ \ /* ou : */ \ /* */ \ /* dZ = 1 */ \ /* 0 */ \ /* */ \ /* suivant que l'on calcule Mandelbrot ou Julia. */ \ DEFV(complexe,increment_de_la_derivee_suite_point); \ /* Increment utilise pour le calcul de la derivee complexe ; il vaut suivant l'ensemble */ \ /* que l'on calcule : (1,0) ou (0,0). */ \ DEFV(Float,INIT(distance,FLOT__UNDEF)); \ /* Valeur estimee de la distance courante du point 'z' a l'ensemble que l'on calcule ; il */ \ /* s'agit d'une approximation valant : */ \ /* */ \ /* |Z | */ \ /* 1 | n| */ \ /* d(z) = ---.-------.Log(|Z |) */ \ /* 2 |dZ | n */ \ /* | n| */ \ /* */ \ /* valable pour les petits modules et les grandes valeurs de 'n'. */ \ BDEFV(imageF,image_des_distances); \ /* Image flottante contenant les distances avant la normalisation. */ \ DEFV(complexe,point_manoeuvre); \ /* Point complexe de maneuvre lors de l'iteration. */ #define EVARIABLES_F_ITERATION_DANS_C \ /* Fin de definition des variables communes a 'Julia' et 'Mandelbrot'. */ \ EDEFV(imageF,image_des_distances); \ /* Image flottante contenant les distances avant la normalisation. */ #define DISTANCES_ANORMALES_AVANT \ F_INFINI \ /* Valeur a donner aux distances pour lesquelles on risque '1/0' et 'Log(0)' ; cette valeur */ \ /* est fortement positive afin que les tests d'eloignement par rapport au seuil soient */ \ /* possibles... */ #define DISTANCES_ANORMALES_APRES \ F_MOINS_L_INFINI \ /* Valeur a donner aux distances pour lesquelles on risque '1/0' et 'Log(0)' ; cette valeur */ \ /* est fortement negative afin que les tests de recherche de la vraie distance maximale */ \ /* pour la renormalisation soient possibles... */ #define F_ITERATION_CHEVELUE_DANS_C(init_iteration,derivee_fonc_iteration,fonc_iteration,fin_iteration) \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ Bblock \ INITIALISATION_DU_POINT_COURANT_DANS_C; \ /* Le "point_courant" 'C' est le point courant {X,Y} sur le maillage de l'image. */ \ BLOC(init_iteration); \ /* Initialisation de la suite des nombres complexes sur le "point_courant", */ \ /* soit : */ \ /* */ \ /* Z = 0 */ \ /* 0 */ \ /* */ \ /* dZ = 0 */ \ /* 0 */ \ /* */ \ /* ou : */ \ /* */ \ /* Z = C */ \ /* 0 */ \ /* */ \ /* dZ = 1 */ \ /* 0 */ \ /* */ \ /* et, initialisation du compteur des iterations. */ \ \ EGAL(iterer,VRAI); \ /* Ainsi, on fera au moins la premiere iteration... */ \ Tant(IL_FAUT(iterer)) \ Bblock \ aCproduit(point_manoeuvre,suite_point,derivee_suite_point); \ /* Calculons : */ \ /* */ \ /* Z .dZ */ \ /* n n */ \ /* */ \ aCforme_lineaire(derivee_suite_point,FDEUX,point_manoeuvre,FZERO); \ /* Puis : */ \ /* */ \ /* 2.Z .dZ */ \ /* n n */ \ /* */ \ aCsomme(derivee_suite_point,derivee_suite_point,increment_de_la_derivee_suite_point); \ /* Puis : */ \ /* */ \ /* dZ = (2.Z .dZ ) + 1 */ \ /* n+1 n n */ \ /* */ \ /* ou : */ \ /* */ \ /* dZ = (2.Z .dZ ) + 0 */ \ /* n+1 n n */ \ /* */ \ aCproduit(point_manoeuvre,suite_point,suite_point); \ /* Calculons : */ \ /* */ \ /* 2 */ \ /* Z */ \ /* n */ \ /* */ \ BLOC(fonc_iteration); \ /* Puis : */ \ /* */ \ /* 2 */ \ /* Z + C */ \ /* n */ \ /* */ \ /* ou : */ \ /* */ \ /* 2 */ \ /* Z + A */ \ /* n */ \ /* */ \ Test(IFOU(IZEQ(Cmodule(suite_point)),IZEQ(Cmodule(derivee_suite_point)))) \ Bblock \ EGAL(distance,DISTANCES_ANORMALES_AVANT); \ /* Si l'un des modules est nul, on va soit rencontrer 1/0, soit Log(0), ce qui est tres */ \ /* mauvais ; afin de forcer l'iteration, on choisit arbitrairement une distance infinie... */ \ Eblock \ ATes \ Bblock \ EGAL(distance \ ,MUL2(MOIT(DIVI(Cmodule(suite_point) \ ,Cmodule(derivee_suite_point) \ ) \ ) \ ,LOGX(Cmodule(suite_point)) \ ) \ ); \ /* Sinon, on calcule l'approximation de la distance. */ \ Eblock \ ETes \ Test(IFGE(Cmodule2(suite_point),F_ITERATION_CHEVELUE_DANS_C_____seuil_du_carre_du_module)) \ Bblock \ EGAL(iterer,FAUX); \ /* Lorsqu'on s'eloigne trop, on s'arrete... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Test(IFGE(nombre_courant_d_iterations,PRED(nombre_maximal_d_iterations))) \ Bblock \ EGAL(iterer,FAUX); \ /* On ne peut malheureusement faire une infinite d'iterations ; on notera le 'PRED' qui */ \ /* permet, lors du codage du point {X,Y}, de faire la difference entre le cas ou l'on a fait */ \ /* trop d'iterations (cas present), et le cas suivant (ou la distance d'approche est */ \ /* atteinte... */ \ Eblock \ ATes \ Bblock \ INCR(nombre_courant_d_iterations,I); \ /* Et comptage des iterations effectuees... */ \ Eblock \ ETes \ Test(IFLE(distance,seuil_de_la_distance)) \ Bblock \ EGAL(iterer,FAUX); \ /* Lorsqu'on s'approche tres pres de l'ensemble, on considere qu'on appartient */ \ /* surement a ce meme ensemble... */ \ EGAL(nombre_courant_d_iterations,nombre_maximal_d_iterations); \ /* Et ce afin de coder correctement le point {X,Y} courant ; on notera, le 'PRED' du test */ \ /* precedent, qui permet lors du codage du point {X,Y}, de faire la difference entre le cas */ \ /* ou l'on a fait trop d'iterations (cas present), et le cas courant (ou la distance */ \ /* d'approche est atteinte)... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ TEST_D_UNDERFLOW_D_UNE_SUITE_COMPLEXE(suite_point,iterations_dans_C_HC_HHC_____epsilon); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter */ \ /* des underflows flottants... */ \ Eblock \ ETan \ \ Choi(mode_de_visualisation) \ Bblock \ Ca1e(VISUALISATION_DU_NOMBRE_D_ITERATIONS) \ Bblock \ store_point(GENP(SCAL(nombre_courant_d_iterations \ ,nombre_maximal_d_iterations \ ,BLANC \ ) \ ) \ ,imageR \ ,X,Y \ ,FVARIABLE \ ); \ /* Et enfin, marquage du point courant {X,Y} soit avec l'argument de sortie, soit avec */ \ /* le nombre courant d'iterations. */ \ Eblock \ ECa1 \ \ Ca1e(VISUALISATION_DE_L_ARGUMENT_DE_SORTIE) \ Bblock \ store_point(GENP(SCAL(Cargument_2PI(suite_point) \ ,CERCLE_TRIGONOMETRIQUE \ ,BLANC \ ) \ ) \ ,imageR \ ,X,Y \ ,FVARIABLE \ ); \ /* Et enfin, marquage du point courant {X,Y} soit avec l'argument de sortie, soit avec */ \ /* le nombre courant d'iterations. */ \ Eblock \ ECa1 \ \ Ca1e(VISUALISATION_DES_ORBITES) \ Bblock \ store_point_valide(load_point(imageA,X,Y) \ ,imageR \ ,X_PLAN_IMAGE,Y_PLAN_IMAGE \ ,FVARIABLE \ ); \ /* Et enfin, marquage du point courant de Z avec le point courant {X,Y} afin de tenter de */ \ /* n */ \ /* visualiser la trajectoire ('orbite') des points en montrant le deplacement des points de */ \ /* 'imageA'. */ \ Eblock \ ECa1 \ \ Ca1e(VISUALISATION_DES_DISTANCES) \ Bblock \ storeF_point(COND(IFNE(distance,DISTANCES_ANORMALES_AVANT),distance,DISTANCES_ANORMALES_APRES) \ ,image_des_distances \ ,X,Y \ ); \ /* Et on memorise la distance courante d(z), mais en remplacant 'DISTANCES_ANORMALES_AVANT' */ \ /* par son oppose ('DISTANCES_ANORMALES_APRES') afin d'etre capable a la fin de calculer */ \ /* le vrai maximum des distances (qui alors sera mis a la place de */ \ /* 'DISTANCES_ANORMALES_APRES'). */ \ Eblock \ ECa1 \ \ Defo \ Bblock \ PRINT_ERREUR("le mode de visualisation demande n'existe pas"); \ Eblock \ EDef \ Eblock \ ECho \ \ BLOC(fin_iteration); \ /* Cette possibilite a ete introduite le 20150225152454... */ \ Eblock #define F_INITIALISATION_DES_DISTANCES \ /* Sequence d'initialisation du calcul de l'image des distances si necessaire... */ \ Bblock \ Test(IFEQ(mode_de_visualisation,VISUALISATION_DES_DISTANCES)) \ Bblock \ CALS(IFinitialisation(image_des_distances,FZERO)); \ /* Et on nettoie la matrice Resultat (flottante)... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock #define F_RENVOI_DES_DISTANCES \ /* Sequence de fin du calcul de l'image des distances si necessaire... */ \ Bblock \ Test(IFEQ(mode_de_visualisation,VISUALISATION_DES_DISTANCES)) \ Bblock \ DEFV(Float,INIT(distance_minimale,FLOT__UNDEF)); \ /* Afin de rechercher la vraie valeur minimale des distances d(z)... */ \ DEFV(Float,INIT(distance_maximale,IFnivo_maximum(image_des_distances))); \ /* Recherche de la vraie valeur maximale des distances d(z)... */ \ traite_image_BH_GD(BLOC(Bblock \ Test(IFEQ(loadF_point(image_des_distances,X,Y),DISTANCES_ANORMALES_APRES)) \ Bblock \ storeF_point(DISTANCES_ANORMALES_AVANT \ ,image_des_distances \ ,X,Y \ ); \ /* Les points pour lesquels on a evite '1/0' et 'Log(0)' avaient ete codes par */ \ /* 'DISTANCES_ANORMALES_APRES' ; maintenant que l'on connait la plus grande distance d(z) */ \ /* recontree ('distance_maximale'), on leur donne la valeur 'DISTANCES_ANORMALES_AVANT' */ \ /* afin de pouvoir rechercher le vrai minimum ('distance_minimale')... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ) \ ); \ EGAL(distance_minimale,IFnivo_minimum(image_des_distances)); \ /* Recherche de la vraie valeur minimale des distances d(z)... */ \ traite_image_BH_GD(BLOC(Bblock \ Test(IFEQ(loadF_point(image_des_distances,X,Y),DISTANCES_ANORMALES_AVANT)) \ Bblock \ storeF_point(distance_minimale \ ,image_des_distances \ ,X,Y \ ); \ /* Les points pour lesquels on a evite '1/0' et 'Log(0)' avaient ete codes par */ \ /* 'DISTANCES_ANORMALES_AVANT' ; maintenant que l'on connait la plus petite distance d(z) */ \ /* recontree ('distance_minimale'), on leur donne cette valeur ; ainsi, l'appel a */ \ /* 'Ifloat_std_avec_renormalisation' ne sera pas perturbe par 'DISTANCES_ANORMALES_AVANT'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ) \ ); \ CALS(Ifloat_std_avec_renormalisation(imageR,image_des_distances)); \ /* Conversion de l'image Resultat en une image standard... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E M A N D E L B R O T C H E V E L U C O M P L E X E */ /* D A N S U N E F E N E T R E S U I V A N T U N P R O C E S S U S N O N O P T I M I S E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Z = 0 */ /* 0 */ /* */ /* 2 */ /* Z = Z + C */ /* n+1 n */ /* */ /* (ou 'C' designe le point courant). */ /* */ /* Soit sa derivee par rapport au point 'C' : */ /* */ /* Z' = 0 */ /* 0 */ /* */ /* Z' = 2.Z .Z' + 1 */ /* n+1 n n */ /* */ /* On definit ensuite la distance : */ /* */ /* |Z | */ /* 1 n */ /* d(z) = ---.------.Log(|Z |) */ /* 2 |Z'| n */ /* n */ /* */ /* elle est valable pour les petits modules, */ /* et les grandes valeurs de 'n'... */ /* */ /* Si d(z) devient inferieur a un certain */ /* seuil, a lors 'C' appartient a l'ensemble */ /* de Mandelbrot. */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* ** */ /* ***** */ /* ***** */ /* * * ********* * */ /* ******************* ** */ /* ********************** */ /* ************************** */ /* **************************** */ /* * ***** **************************** */ /* *********** ***************************** */ /* ************ **************************** */ /* ********************************************************* */ /* ************ **************************** */ /* *********** ***************************** */ /* * ***** **************************** */ /* **************************** */ /* ************************** */ /* ********************** */ /* ******************* ** */ /* * * ********* * */ /* ***** */ /* ***** */ /* ** */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Imandelbrot_chevelu_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,nombre_maximal_d_iterations ,seuil_de_la_distance ,mode_de_visualisation ,ARGUMENT_FACULTATIF(imageA) ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Float,seuil_de_la_distance)); /* Ce seuil permet de savoir a partir de quel moment on pense etre pres de l'ensemble. */ DEFV(Argument,DEFV(Int,mode_de_visualisation)); /* Il definit le mode visualisation demandee, et vaut : */ /* VISUALISATION_DU_NOMBRE_D_ITERATIONS, ou */ /* VISUALISATION_DE_L_ARGUMENT_DE_SORTIE, ou */ /* VISUALISATION_DES_ORBITES, ou enfin */ /* VISUALISATION_DES_DISTANCES. */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument (facultatif) d'aide a la visualisation des orbites des points */ /* au cours des iterations ; son existence est conditionnee par 'mode_de_visualisation'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_CHEVELUE_DANS_C /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; F_INITIALISATION_DES_DISTANCES; traite_image_BH_GD(BLOC(F_ITERATION_CHEVELUE_DANS_C(BLOC(Bblock Cegal(suite_point,C_____nombre_complexe__0__0); /* Initialisation de la suite des nombres complexes sur l'origine, */ /* soit : */ /* */ /* Z = 0 */ /* 0 */ /* */ /* On notera que l'on pourrait optimiser, en partant directement sur 'C', mais la */ /* difference entre Julia et Mandelbrot ne serait plus evidente... */ Cegal(derivee_suite_point,C_____nombre_complexe__0__0); /* Initialisation de la derivee de la suite des nombres complexes, */ /* soit : */ /* */ /* dZ = 0 */ /* 0 */ /* */ Cegal(increment_de_la_derivee_suite_point,C_____nombre_complexe_p1__0); /* Initialisation de l'increment utilise dans le calcul de la derivee, */ /* soit : */ /* */ /* increment = (1,0) */ /* */ CLIR(nombre_courant_d_iterations); /* Initialisation du compteur des iterations. */ Eblock ) ,BLOC(VIDE; ) ,BLOC(Bblock aCsomme(suite_point,point_manoeuvre,point_courant); /* Puis : */ /* */ /* 2 */ /* Z + C */ /* n */ /* */ /* ou 'C' designe le point complexe Courant. */ Eblock ) ,BLOC(VIDE; ) /* Introduit le 20150225154041... */ ); ) ); F_RENVOI_DES_DISTANCES; EVARIABLES_F_ITERATION_DANS_C RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E J U L I A C H E V E L U C O M P L E X E */ /* D A N S U N E F E N E T R E S U I V A N T U N P R O C E S S U S N O N O P T I M I S E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Z = C */ /* 0 */ /* */ /* (ou 'C' designe le point courant), */ /* */ /* 2 */ /* Z = Z + A */ /* n+1 n */ /* */ /* Soit sa derivee par rapport au point 'C' : */ /* */ /* Z' = 1 */ /* 0 */ /* */ /* Z' = 2.Z .Z' + 0 */ /* n+1 n n */ /* */ /* On definit ensuite la distance : */ /* */ /* |Z | */ /* 1 n */ /* d(z) = ---.------.Log(|Z |) */ /* 2 |Z'| n */ /* n */ /* */ /* elle est valable pour les petits modules, */ /* et les grandes valeurs de 'n'... */ /* */ /* Si d(z) devient inferieur a un certain */ /* seuil, a lors 'C' appartient a l'ensemble */ /* de Julia calcule pour le nombre complexe 'A'. */ /* (ou 'A' designe un nombre complexe */ /* Argument arbitraire). */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* *...... .....*.... */ /* *......*.................****... */ /* ********...............***..... */ /* ........**.............***..... */ /* .........**...........**........ */ /* ..........***************........ */ /* ........**...***..******...... */ /* ....*............***......... */ /* ...............**........... */ /* ..............***....*..*.. */ /* ..........********...... */ /* ...........***...... */ /* ..........**...... */ /* ........*****.. */ /* ........*..... */ /* .....*#*..... */ /* .....*........ */ /* ..*****........ */ /* ......**.......... */ /* ......***........... */ /* ......********.......... */ /* ..*..*....***.............. */ /* ...........**............... */ /* .........***............*.... */ /* ......******..***...**........ */ /* ........***************......... */ /* ........**...........**........ */ /* .....***.............**....... */ /* .....***...............******* */ /* ...****.................*...... */ /* ....*..... ...... */ /* #***.... */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Ijulia_chevelu_dans_C(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,ARGUMENT_POINTERs(nombre_argument) ,nombre_maximal_d_iterations ,seuil_de_la_distance ,mode_de_visualisation ,ARGUMENT_FACULTATIF(imageA) ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(complexe,POINTERs(nombre_argument))); /* Nombre complexe "generateur" de l'ensemble de Julia que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Float,seuil_de_la_distance)); /* Ce seuil permet de savoir a partir de quel moment on pense etre pres de l'ensemble. */ DEFV(Argument,DEFV(Int,mode_de_visualisation)); /* Il definit le mode visualisation demandee, et vaut : */ /* VISUALISATION_DU_NOMBRE_D_ITERATIONS, ou */ /* VISUALISATION_DE_L_ARGUMENT_DE_SORTIE, ou */ /* VISUALISATION_DES_ORBITES, ou enfin */ /* VISUALISATION_DES_DISTANCES. */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument (facultatif) d'aide a la visualisation des orbites des points */ /* au cours des iterations ; son existence est conditionnee par 'mode_de_visualisation'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_CHEVELUE_DANS_C DEFV(complexe,point_argument); /* Point complexe argument. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; Cegal(point_argument,INDIRECT(nombre_argument)); /* Recuperation du nombre complexe "generateur"... */ F_INITIALISATION_DES_DISTANCES; traite_image_BH_GD(BLOC(F_ITERATION_CHEVELUE_DANS_C(BLOC(Bblock Cegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* Z = C */ /* 0 */ /* */ Cegal(derivee_suite_point,C_____nombre_complexe_p1__0); /* Initialisation de la derivee de la suite des nombres complexes, */ /* soit : */ /* */ /* dZ = 1 */ /* 0 */ /* */ Cegal(increment_de_la_derivee_suite_point,C_____nombre_complexe__0__0); /* Initialisation de l'increment utilise dans le calcul de la derivee, */ /* soit : */ /* */ /* increment = (0,0) */ /* */ CLIR(nombre_courant_d_iterations); /* Initialisation du compteur des iterations. */ Eblock ) ,BLOC(VIDE; ) ,BLOC(Bblock aCsomme(suite_point,point_manoeuvre,point_argument); /* Puis : */ /* */ /* 2 */ /* Z + A */ /* n */ /* */ /* ou 'A' designe le point complexe Argument. */ Eblock ) ,BLOC(VIDE; ) /* Introduit le 20150225154041... */ ); ) ); F_RENVOI_DES_DISTANCES; EVARIABLES_F_ITERATION_DANS_C RETI(imageR); Eblock EFonctionP #undef F_RENVOI_DES_DISTANCES #undef F_INITIALISATION_DES_DISTANCES #undef F_ITERATION_CHEVELUE_DANS_C #undef DISTANCES_ANORMALES_APRES #undef DISTANCES_ANORMALES_AVANT #undef EVARIABLES_F_ITERATION_DANS_C #undef TEST_D_OVERFLOW_D_UNE_SUITE_COMPLEXE #undef TEST_D_UNDERFLOW_D_UNE_SUITE_COMPLEXE #undef INITIALISATION_DU_POINT_COURANT_DANS_C #undef BVARIABLES_F_ITERATION_CHEVELUE_DANS_C /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N T R O L E D E L ' A R I T H M E T I Q U E E T E N D U E */ /* L O R S D E C A L C U L S S U R L E S N O M B R E S H Y P E R - C O M P L E X E S : */ /* */ /*************************************************************************************************************************************/ #ifdef FAIRE_EVENTUELLEMENT_DE_L_ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_HYPER_COMPLEXES DEFV(Common,DEFV(Logical,_______VERSION__ximcf_iterations_____ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_HYPER_COMPLEXES)); /* Indicateur introduit le 20070129121923... */ #Aifdef FAIRE_EVENTUELLEMENT_DE_L_ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_HYPER_COMPLEXES DEFV(Common,DEFV(Logical,_______VERSION__ximcf_iterations_____ARITHMETIQUE_DE_BASE_DANS_LES_NOMBRES_HYPER_COMPLEXES)); /* Indicateur introduit le 20070129133050... */ #Eifdef FAIRE_EVENTUELLEMENT_DE_L_ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_HYPER_COMPLEXES /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S E U I L D U M O D U L E : */ /* D A N S L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #define TEST_DU_CARRE_DU_MODULE_DANS_HC(seuil) \ IFLT(HCmodule2(suite_point),seuil) \ /* Test quelconque de continuation des iterations dans 'F_ITERATION_DANS_HC(...)'. */ #define SEUIL_MODULE_DANS_HC \ EXP2(DOUB(UNITE)) DEFV(Common,DEFV(Float,ZINT(iterations_diverses_dans_HC_____seuil_du_carre_du_module ,SEUIL_MODULE_DANS_HC ) ) ); /* Seuil de divergence du carre du module d'un nombre hyper-complexe de la suite. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A L I T E S U R L E S I N V E R S I O N S : */ /* */ /*************************************************************************************************************************************/ #define PARAMETRE_D_INVERSION_Ri2 \ EXP2(FDU) #define PARAMETRE_D_INVERSION_Rs2 \ EXP2(FU) /* Parametres introduits le 20121104074503... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E P L I E M E N T E V E N T U E L D E L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____replier_l_espace,ITERATIONS_DIVERSES_____REPLIER_L_ESPACE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____Rorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____Rextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____Iorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____Iextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____Jorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____Jextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____Korigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____Kextremite,ITERATIONS_DIVERSES_____EXTREMITE))); /* Possibilite introduite le 20121103095740... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S N E C E S S A I R E S A U C A L C U L E N " F L O T T A N T " */ /* D A N S L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(iterations_diverses_dans_HC_____centrer_la_rotation_3D_dans_la_fenetre,FAUX))); /* Introduit le 20121227110206 afin de faciliter le changement de centre de rotation... */ DEFV(Common,DEFV(Float,ZINT(iterations_diverses_dans_HC_____X_centre_de_rotation_3D,FZERO))); DEFV(Common,DEFV(Float,ZINT(iterations_diverses_dans_HC_____Y_centre_de_rotation_3D,FZERO))); DEFV(Common,DEFV(Float,ZINT(iterations_diverses_dans_HC_____Z_centre_de_rotation_3D,FZERO))); /* Introduit le 20091222133804 pour generaliser le processus de rotation. La valeur par */ /* defaut garantit la compatibilite anterieure... */ #define ROTATION_TRIDIMENSIONNELLE_DANS_HC(point_apres_rotation,point_avant_rotation) \ Bblock \ DEFV(Float,INIT(X_centre_de_rotation_3D,iterations_diverses_dans_HC_____X_centre_de_rotation_3D)); \ DEFV(Float,INIT(Y_centre_de_rotation_3D,iterations_diverses_dans_HC_____Y_centre_de_rotation_3D)); \ DEFV(Float,INIT(Z_centre_de_rotation_3D,iterations_diverses_dans_HC_____Z_centre_de_rotation_3D)); \ /* Definition du centre de rotation tridimensionnel par defaut... */ \ \ Test(IL_FAUT(iterations_diverses_dans_HC_____centrer_la_rotation_3D_dans_la_fenetre)) \ Bblock \ EGAL(X_centre_de_rotation_3D \ ,MOYE(Reelle(INDIRECT(coin_bas_gauche)),Reelle(INDIRECT(coin_haut_droite))) \ ); \ EGAL(Y_centre_de_rotation_3D \ ,MOYE(Imaginaire(INDIRECT(coin_bas_gauche)),Imaginaire(INDIRECT(coin_haut_droite))) \ ); \ EGAL(Z_centre_de_rotation_3D \ ,composante_J \ ); \ /* Positionnement du centre de rotation tridimensionnelle au centre de la fenetre... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ HCinitialisation(point_apres_rotation \ ,ADD2(TRANSFORMATION_GEOMETRIQUE_3D_Fx(SOUS(HReelle(point_avant_rotation) \ ,X_centre_de_rotation_3D \ ) \ ,SOUS(HImaginaire(point_avant_rotation) \ ,Y_centre_de_rotation_3D \ ) \ ,SOUS(HJmaginaire(point_avant_rotation) \ ,Z_centre_de_rotation_3D \ ) \ ,NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz \ ) \ ,X_centre_de_rotation_3D \ ) \ ,ADD2(TRANSFORMATION_GEOMETRIQUE_3D_Fy(SOUS(HReelle(point_avant_rotation) \ ,X_centre_de_rotation_3D \ ) \ ,SOUS(HImaginaire(point_avant_rotation) \ ,Y_centre_de_rotation_3D \ ) \ ,SOUS(HJmaginaire(point_avant_rotation) \ ,Z_centre_de_rotation_3D \ ) \ ,NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz \ ) \ ,Y_centre_de_rotation_3D \ ) \ ,ADD2(TRANSFORMATION_GEOMETRIQUE_3D_Fz(SOUS(HReelle(point_avant_rotation) \ ,X_centre_de_rotation_3D \ ) \ ,SOUS(HImaginaire(point_avant_rotation) \ ,Y_centre_de_rotation_3D \ ) \ ,SOUS(HJmaginaire(point_avant_rotation) \ ,Z_centre_de_rotation_3D \ ) \ ,NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz \ ) \ ,Z_centre_de_rotation_3D \ ) \ ,NEUT(HKmaginaire(point_avant_rotation)) \ ); \ /* Rotation du point Argument par rapport aux trois premiers axes... */ \ Eblock \ /* Rotation d'un point hyper-complexe par rapport aux trois premiers axes... */ #define BVARIABLES_F_ITERATION_DANS_HC \ /* Definition des variables communes a 'Julia' et 'Mandelbrot'. */ \ BVARIABLES_D_HOMOTHETIE_C_HC_HHC \ /* "Taille" reelle et imaginaire de la fenetre rapportee a la taille des images. */ \ DEFV(hyper_complexe,point_courant); \ /* Point hyper-complexe courant 'C' dans la fenetre. */ \ DEFV(hyper_complexe,suite_point); \ /* Suite des points hyper-complexes Q lors de l'iteration. */ \ /* n */ \ DEFV(hyper_complexe,point_manoeuvre); \ /* Point hyper-complexe de maneuvre lors de l'iteration. */ \ VARIABLES_COMMUNES_DES_ITERATIONS_DANS_C_HC_HHC; #define INITIALISATION_DU_POINT_COURANT_DANS_HC \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ Bblock \ DEFV(hyper_complexe,point_courant_avant_rotation); \ /* Point de manoeuvre... */ \ \ HCinitialisation(point_courant_avant_rotation,X_IMAGE_PLAN(X),Y_IMAGE_PLAN(Y),composante_J,composante_K); \ /* Le "point_courant" 'C' est le point courant {X,Y} sur le maillage de l'image auquel */ \ /* on "adjoint" les 'composante_J' et 'composante_K' pour passer dans l'hyper-espace. */ \ ROTATION_TRIDIMENSIONNELLE_DANS_HC(point_courant,point_courant_avant_rotation); \ /* Rotation (eventuelle) du point courant... */ \ Eblock \ /* Initialisation du point hyper-complexe courant sur un maillage {X,Y}. */ #define TEST_D_UNDERFLOW_D_UNE_SUITE_HYPER_COMPLEXE(suite_hyper_complexe,epsilon) \ Bblock \ EGAL(HReelle(suite_hyper_complexe),TROP_PETIT(HReelle(suite_hyper_complexe),epsilon)); \ EGAL(HImaginaire(suite_hyper_complexe),TROP_PETIT(HImaginaire(suite_hyper_complexe),epsilon)); \ EGAL(HJmaginaire(suite_hyper_complexe),TROP_PETIT(HJmaginaire(suite_hyper_complexe),epsilon)); \ EGAL(HKmaginaire(suite_hyper_complexe),TROP_PETIT(HKmaginaire(suite_hyper_complexe),epsilon)); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter des underflows */ \ /* flottants... */ \ Eblock \ /* Test des underflows d'une suite hyper-complexe... */ #define TEST_D_OVERFLOW_D_UNE_SUITE_HYPER_COMPLEXE(suite_hyper_complexe,anti_epsilon) \ Bblock \ EGAL(HReelle(suite_hyper_complexe),TROP_GRAND(HReelle(suite_hyper_complexe),anti_epsilon)); \ EGAL(HImaginaire(suite_hyper_complexe),TROP_GRAND(HImaginaire(suite_hyper_complexe),anti_epsilon)); \ EGAL(HJmaginaire(suite_hyper_complexe),TROP_GRAND(HJmaginaire(suite_hyper_complexe),anti_epsilon)); \ EGAL(HKmaginaire(suite_hyper_complexe),TROP_GRAND(HKmaginaire(suite_hyper_complexe),anti_epsilon)); \ /* Lorsqu'une composante devient trop grande, on la plafonne afin d'eviter des underflows */ \ /* flottants... */ \ Eblock \ /* Test des overflows d'une suite hyper-complexe... */ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point,FAUX))); /* Introduit le 20100513131115 afin de permettre, par exemple, la generation d'objet de */ /* type "MandelBox". On notera que cela n'est pas fait pour les nombres complexes car, en */ /* effet, il suffit d'utiliser les nombres hyper-complexes avec des composantes {J,K} nulles */ /* pour etre dans le plan complexe... */ DEFV(Common,DEFV(Positive,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__nombre_repetitions,UN))); /* Introduit le 20100520113838 afin de permettre d'iterer ces transformations... */ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement,VRAI))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_S__R,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_lineaire__R,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_polynomial__R,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_sinusoidal__R,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xn__R,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yn__R,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xp__R,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yp__R,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_E__R,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_S__I,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_lineaire__I,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_polynomial__I,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_sinusoidal__I,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xn__I,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yn__I,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xp__I,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yp__I,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_E__I,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_S__J,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_lineaire__J,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_polynomial__J,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_sinusoidal__J,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xn__J,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yn__J,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xp__J,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yp__J,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_E__J,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_S__K,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_lineaire__K,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_polynomial__K,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_sinusoidal__K,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xn__K,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yn__K,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xp__K,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yp__K,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_E__K,UN))); #define REPLIEMENT_AFFINE_PAR_MORCEAUX_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ /* Procedure introduite le 20100602085411... */ \ CON02(IFLT(valeur_de_la_composante \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xn`nom_de_la_composante \ ) \ ,AXPB(NEGA(DIVZ(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yn`nom_de_la_composante \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xn`nom_de_la_composante \ ) \ ) \ ,valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yn`nom_de_la_composante) \ ) \ ,IFGT(valeur_de_la_composante \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xp`nom_de_la_composante \ ) \ ,AXPB(NEGA(DIVZ(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yp`nom_de_la_composante \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xp`nom_de_la_composante \ ) \ ) \ ,valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_yp`nom_de_la_composante) \ ) \ ,NEUT(valeur_de_la_composante) \ ) \ /* Repliement d'une composante {R,I,J,K} suivant (avec un "Signe" positif) : */ \ /* */ \ /* ^ */ \ /* | */ \ /* \ | */ \ /* \ | */ \ /* \ yp*. . .* */ \ /* \ | /.\ */ \ /* \ | / . \ */ \ /* \ | / . \ */ \ /* \ | / . \ */ \ /* \ xn |/ . \ 2.xp */ \ /* --------*-----*-----O-----*-----*--------------------> */ \ /* 2.xn \ . /| xp \ */ \ /* \ . / | \ */ \ /* \ . / | \ */ \ /* \ . / | \ */ \ /* \./ | \ */ \ /* *. . .*yn \ */ \ /* | \ */ \ /* | \ */ \ /* */ \ /* (avec "n" pour "Negatif" et "p" pour "Positif"), le "Signe" negatif permettant de faire */ \ /* une symetrie par rapport a l'axe des abscisses... */ #define REPLIEMENT_POLYNOMIAL_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ /* Procedure introduite le 20100602085411... */ \ MUL2(NEGA(valeur_de_la_composante) \ ,EXPn(MUL2(SOUS(valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xn`nom_de_la_composante) \ ) \ ,SOUS(valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xp`nom_de_la_composante) \ ) \ ) \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_E`nom_de_la_composante \ ) \ ) \ /* Repliement d'une composante {R,I,J,K} a l'aide d'un polynome (de degre impair de */ \ /* preference si l'on souhaite "simuler" le "zig-zag" affine par morceaux...) dont les */ \ /* intersections avec les axes sont donnees par les racines {2.xn,0,2.xp}. */ #define REPLIEMENT_SINUSOIDAL_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ /* Procedure introduite le 20100604142838... */ \ SINX(SCAL(valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_xp`nom_de_la_composante) \ ,PI \ ) \ ) \ /* Repliement d'une composante {R,I,J,K} a l'aide d'une sinusoide dont les intersections */ \ /* avec les axes sont donnees par les racines {2.xp+k.pi}. */ #define REPLIEMENT_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ MUL2(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_S`nom_de_la_composante \ ,CON03(IL_FAUT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_lineaire`nom_de_la_composante) \ ,REPLIEMENT_AFFINE_PAR_MORCEAUX_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ ,IL_FAUT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_polynomial`nom_de_la_composante) \ ,REPLIEMENT_POLYNOMIAL_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ ,IL_FAUT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement_sinusoidal`nom_de_la_composante) \ ,REPLIEMENT_SINUSOIDAL_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ ,valeur_de_la_composante \ ) \ ) \ /* Repliement d'une composante {R,I,J,K}, le "Signe" negatif permettant de faire */ \ /* une symetrie par rapport a l'axe des abscisses... */ \ /* */ \ /* Introduit le 20100513131115 afin de permettre, par exemple, la generation d'objet de */ \ /* type "MandelBox"... */ \ /* */ \ /* Le 20100519110626 fut introduite la possibilite de remplacer ce "zig-zag" par une courbe */ \ /* du troisieme degre (par defaut) de meme allure et dont les intersections avec les axes */ \ /* sont donnees par les racines {2.xn,0,2.xp}. */ \ /* */ \ /* Le 20100604142838 fut introduite la possibilite de remplacer ce "zig-zag" par une */ \ /* sinusoide dont les intersections avec les axes sont donnees par les racines {2.xp+k.pi}. */ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion,VRAI))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Ri2__R,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Rs2__R,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Ri2__I,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Rs2__I,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Ri2__J,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Rs2__J,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Ri2__K,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Rs2__K,PARAMETRE_D_INVERSION_Rs2))); #define INVERSION_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante,carre_du_module) \ CON02(IFLE(carre_du_module \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Ri2`nom_de_la_composante \ ) \ ,DIVZ(valeur_de_la_composante \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Ri2`nom_de_la_composante \ ) \ ,IFINof(carre_du_module \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Ri2`nom_de_la_composante \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__inversion_Rs2`nom_de_la_composante \ ) \ ,DIVZ(valeur_de_la_composante \ ,carre_du_module \ ) \ ,valeur_de_la_composante \ ) \ /* Inversion d'une composante {R,I,J,K} a l'aide d'un rayon "Inferieur" et d'un rayon */ \ /* "Superieur". Au dessus du rayon "Superieur", la valeur de la composante est conservee. */ \ /* Entre le rayon "Inferieur" et le rayon "Superieur", la composante subit une inversion */ \ /* par rapport a l'hyper-sphere unite. Enfin, en dessous du rayon "Inferieur", la composante */ \ /* subit une inversion "etrange"... */ \ /* */ \ /* Introduit le 20100513131115 afin de permettre, par exemple, la generation d'objet de */ \ /* type "MandelBox"... */ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire,VRAI))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_A__R,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_B__R,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_A__I,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_B__I,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_A__J,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_B__J,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_A__K,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_B__K,FZERO))); #define TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ AXPB(gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_A`nom_de_la_composante \ ,valeur_de_la_composante \ ,gF_ITERATION_DANS_HC_____transformer__suite_point__transformation_lineaire_B`nom_de_la_composante \ ) \ /* Transformation lineaire d'une composante {R,I,J,K}. */ \ /* */ \ /* Introduit le 20100513131115 afin de permettre, par exemple, la generation d'objet de */ \ /* type "MandelBox"... */ #define gF_ITERATION_DANS_HC__INITIALISATIONS_DIVERSES \ Bblock \ BLOC(VIDE;); \ Eblock \ /* Introduit le 20210206174951... */ #define gF_ITERATION_DANS_HC(test_d_arret,initialisation_point_courant,init_iteration,calculs_communs,fonc_iteration,fin_iteration) \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ /* */ \ /* L'argument 'initialisation_point_courant' a ete introduit le 20091012111043, par exemple */ \ /* pour permettre de definir le "point_courant" autrement que comme etant le point courant */ \ /* {X,Y} sur le maillage de l'image (par exemple via deux matrices d'indirection, une pour */ \ /* chaque coordonnee 'X' et 'Y'). */ \ /* */ \ /* L'argument 'fin_iteration' a ete introduit le 20150225152454... */ \ Bblock \ INITIALISATION_TRANSFORMATION; \ /* Au cas ou une rotation tridimensionnelle serait demandee... */ \ \ BLOC(initialisation_point_courant); \ /* Le "point_courant" 'C' est a priori le point courant {X,Y} sur le maillage de l'image. */ \ \ BLOC(init_iteration); \ /* Initialisation de la suite des nombres hyper-complexes sur le "point_courant", soit : */ \ /* */ \ /* Q = 0 */ \ /* 0 */ \ /* */ \ /* ou : */ \ /* */ \ /* Q = C */ \ /* 0 */ \ /* */ \ /* et, initialisation du compteur des iterations. */ \ \ Tant(IFET(test_d_arret \ ,PAS_ASSEZ_D_ITERATIONS \ ) \ ) \ Bblock \ Test(IL_FAUT(gF_ITERATION_DANS_HC_____transformer__suite_point)) \ Bblock \ /* Introduit le 20100513131115 afin de permettre, par exemple, la generation d'objet de */ \ /* type "MandelBox"... */ \ Repe(gF_ITERATION_DANS_HC_____transformer__suite_point__nombre_repetitions) \ Bblock \ /* Introduit le 20100520113838... */ \ Test(IL_FAUT(gF_ITERATION_DANS_HC_____transformer__suite_point__repliement)) \ Bblock \ DEFV(hyper_complexe,suite_point_manoeuvre); \ \ HCinitialisation(suite_point_manoeuvre \ ,REPLIEMENT_D_UNE_COMPOSANTE(_R,HReelle(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_I,HImaginaire(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_J,HJmaginaire(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_K,HKmaginaire(suite_point)) \ ); \ /* On notera que les composantes s'appellent {_R,_I,_J,_K}, alors qu'il aurait ete */ \ /* evidemment plus logique de les appeler {R,I,J,K}. Le probleme vient du fait que */ \ /* le symbole 'I' est defini ('v $xil/defi_K1$vv$DEF .define...I.') et ne peut donc */ \ /* etre utilise ici... */ \ HCegal(suite_point,suite_point_manoeuvre); \ /* Repliement de 'suite_point'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion)) \ Bblock \ DEFV(Float,INIT(module2__suite_point,HCmodule2(suite_point))); \ DEFV(hyper_complexe,suite_point_manoeuvre); \ \ HCinitialisation(suite_point_manoeuvre \ ,INVERSION_D_UNE_COMPOSANTE(_R,HReelle(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_I,HImaginaire(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_J,HJmaginaire(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_K,HKmaginaire(suite_point),module2__suite_point) \ ); \ HCegal(suite_point,suite_point_manoeuvre); \ /* Inversion de 'suite_point'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(gF_ITERATION_DANS_HC_____transformer__suite_point__inversion)) \ Bblock \ DEFV(hyper_complexe,suite_point_manoeuvre); \ \ HCinitialisation(suite_point_manoeuvre \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_R,HReelle(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_I,HImaginaire(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_J,HJmaginaire(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_K,HKmaginaire(suite_point)) \ ); \ HCegal(suite_point,suite_point_manoeuvre); \ /* Transformation lineaire de 'suite_point'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ERep \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ BLOC(calculs_communs); \ \ INCR(nombre_courant_d_iterations,I); \ \ BLOC(fonc_iteration); \ /* Puis : */ \ /* */ \ /* 2 */ \ /* Q + C */ \ /* n */ \ /* */ \ /* ou : */ \ /* */ \ /* 2 */ \ /* Q + A */ \ /* n */ \ /* */ \ \ Test(IL_FAUT(gF_ITERATION_DANS_HC_____replier_l_espace)) \ Bblock \ DEFV(hyper_complexe,suite_point_manoeuvre); \ \ aHCmodulo(suite_point_manoeuvre \ ,suite_point \ ,gF_ITERATION_DANS_HC_____Rorigine__ \ ,gF_ITERATION_DANS_HC_____Rextremite \ ,gF_ITERATION_DANS_HC_____Iorigine__ \ ,gF_ITERATION_DANS_HC_____Iextremite \ ,gF_ITERATION_DANS_HC_____Jorigine__ \ ,gF_ITERATION_DANS_HC_____Jextremite \ ,gF_ITERATION_DANS_HC_____Korigine__ \ ,gF_ITERATION_DANS_HC_____Kextremite \ ); \ /* Repliement eventuel de l'espace introduit le 20121103101108... */ \ \ HCegal(suite_point,suite_point_manoeuvre); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ TEST_D_UNDERFLOW_D_UNE_SUITE_HYPER_COMPLEXE(suite_point,iterations_dans_C_HC_HHC_____epsilon); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter */ \ /* des underflows flottants... */ \ Eblock \ ETan \ \ Test(IL_FAUT(visualisation_arguments_de_sortie)) \ Bblock \ Test(IL_NE_FAUT_PAS(iterations_dans_C_HC_HHC_____memoriser_le_module_plutot_que_les_arguments)) \ Bblock \ EGAL(niveau_courant_precis \ ,LRZ3(ponderation_argumentT,HCargumentT_2PI(suite_point) \ ,ponderation_argumentP,HCargumentP_2PI(suite_point) \ ,ponderation_argumentA,HCargumentA_2PI(suite_point) \ ) \ ); \ EGAL(niveau_courant \ ,GENP(SCAL(niveau_courant_precis \ ,CERCLE_TRIGONOMETRIQUE \ ,BLANC \ ) \ ) \ ); \ Eblock \ ATes \ Bblock \ EGAL(niveau_courant_precis \ ,HCmodule(suite_point) \ ); \ EGAL(niveau_courant \ ,GENP(SCAL(TRON(niveau_courant_precis \ ,iterations_dans_C_HC_HHC_____minimum_du_module_a_memoriser_plutot_que_les_arguments \ ,iterations_dans_C_HC_HHC_____maximum_du_module_a_memoriser_plutot_que_les_arguments \ ) \ ,SOUS(iterations_dans_C_HC_HHC_____maximum_du_module_a_memoriser_plutot_que_les_arguments \ ,iterations_dans_C_HC_HHC_____minimum_du_module_a_memoriser_plutot_que_les_arguments \ ) \ ,BLANC \ ) \ ) \ ); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Test(IL_NE_FAUT_PAS(iterations_dans_C_HC_HHC_____visualiser_l_appartenance_plutot_que_le_nombre_d_iterations)) \ /* Test introduit le 20091119165650... */ \ Bblock \ EGAL(niveau_courant_precis \ ,CASP_Float(nombre_courant_d_iterations) \ ); \ /* La procedure 'CASP_Float(...)' a remplace un 'CASP(genere_Float,...)' le 20090331103211. */ \ EGAL(niveau_courant \ ,GENP(COND(IL_FAUT(iterations_dans_C_HC_HHC_____renormaliser_le_nombre_d_iterations) \ ,SCAL(nombre_courant_d_iterations \ ,nombre_maximal_d_iterations \ ,BLANC \ ) \ ,nombre_courant_d_iterations \ ) \ ) \ ); \ /* Visualisation du nombre d'iterations... */ \ Eblock \ ATes \ Bblock \ EGAL(niveau_courant_precis \ ,COND(PAS_ASSEZ_D_ITERATIONS \ ,fNON_APPARTENANCE_A_L_ENSEMBLE \ ,fAPPARTENANCE_A_L_ENSEMBLE \ ) \ ); \ EGAL(niveau_courant \ ,COND(PAS_ASSEZ_D_ITERATIONS \ ,NON_APPARTENANCE_A_L_ENSEMBLE \ ,APPARTENANCE_A_L_ENSEMBLE \ ) \ ); \ /* Visualisation de la non appartenance ('NOIR') et de l'appartenance ('BLANC'). Cette */ \ /* possibilite a ete introduite le 20091119165650 afin de faciliter les choses... */ \ Eblock \ ETes \ Eblock \ ETes \ /* Calcul du niveau du point, ou l'on notera que 'visualisation_arguments_de_sortie' n'a */ \ /* plus de sens dans les quaternions... */ \ \ RANGEMENT_DU_NIVEAU_COURANT_ET_EVENTUELLEMENT_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; \ /* Et enfin, marquage du point courant. */ \ \ BLOC(fin_iteration); \ /* Cette possibilite a ete introduite le 20150225152454... */ \ Eblock DEFV(Common,DEFV(Logical,ZINT(F_ITERATION_DANS_HC_____compatibilite_20110825,FAUX))); /* Introduit le 20110825111448 car, en effet pour le calcul du carre, les methodes */ /* 'HCproduit(...)' et 'HCpuissance(...)' ne donnent evidemment le meme resultat que */ /* si le produit theorique est utilise. Dans le cas contraire, on a : */ /* */ /* 2 */ /* q # 1.q.q */ /* */ /* ce que j'avais neglige dans un premier temps... */ #define F_ITERATION_DANS_HC(test_d_arret,init_iteration,fonc_iteration,exposant,fin_iteration) \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ /* */ \ /* L'argument 'fin_iteration' a ete introduit le 20150225152454... */ \ Bblock \ Test(IFET(IL_FAUT(F_ITERATION_DANS_HC_____compatibilite_20110825),IFNE(exposant,FDEUX))) \ Bblock \ PRINT_ATTENTION("la compatibilite 20110825 des iterations hyper-complexes impose le second degre"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ gF_ITERATION_DANS_HC(test_d_arret \ ,BLOC(Bblock \ INITIALISATION_DU_POINT_COURANT_DANS_HC; \ Eblock \ ) \ /* Introduit le 20091012111043... */ \ ,BLOC(init_iteration); \ ,BLOC(Bblock \ Test(IL_NE_FAUT_PAS(F_ITERATION_DANS_HC_____compatibilite_20110825)) \ Bblock \ aHCpuissance(point_manoeuvre,suite_point,exposant); \ /* Calculons : */ \ /* */ \ /* 2 */ \ /* Q */ \ /* n */ \ /* */ \ /* a priori (mais cela peut etre inutile dans certains cas...). */ \ /* */ \ /* ATTENTION, rappelons que le produit de deux quaternions n'est pas commutatif, ce qui */ \ /* heureusement ici n'a pas d'importance... */ \ /* */ \ /* Le 20091118113333 : */ \ /* */ \ /* HCproduit(point_manoeuvre,suite_point,suite_point); */ \ /* */ \ /* a ete remplace par : */ \ /* */ \ /* HCpuissance(point_manoeuvre,suite_point,exposant) */ \ /* */ \ /* ou 'exposant' sera assez souvent egal a 'ZERO'. Mais afin de garantir la compatibilite */ \ /* anterieure, meme la ou il est evident que 'ZERO' serait correct (et optimiserait les */ \ /* calculs), en fait 'DEUX' sera utilise... */ \ /* */ \ /* Le 20110826090921, on notera un point important. Soient les deux quaternions suivants : */ \ /* */ \ /* Qa = A + i.B + j.C + k.0 = A + i.B + j.C */ \ /* - - - */ \ /* Qb = A + i.B + j.0 + k.C = A + i.B + k.C */ \ /* - - - */ \ /* */ \ /* ou donc il n'y a que trois composantes non nulles et ou ils different par le fait que */ \ /* 'C' pondere 'j' et 'k' respectivement. Leurs carres valent respectivement : */ \ /* */ \ /* 2 2 2 2 */ \ /* Qa = (A -B -C ) + i.2.A.B + j.2.A.C */ \ /* - */ \ /* */ \ /* 2 2 2 2 */ \ /* Qb = (A -B -C ) + i.2.A.B + k.2.A.C */ \ /* - */ \ /* */ \ /* et on a donc : */ \ /* */ \ /* 2 2 */ \ /* |Qa | = |Qb | */ \ /* */ \ /* La moralite de cela est que calculer les deux fractales {J=valeur,K=0} et {J=0,K=valeur} */ \ /* donnera en fait le meme resultat, puisque c'est le module des carres qui est utilise lors */ \ /* des tests d'appartenance aux ensembles calcules... */ \ Eblock \ ATes \ Bblock \ aHCproduit(point_manoeuvre,suite_point,suite_point); \ /* Possibilite introduite le 20110825111448... */ \ Eblock \ ETes \ Eblock \ ) \ ,BLOC(fonc_iteration); \ ,BLOC(fin_iteration); \ /* Cette possibilite a ete introduite le 20150225152454... */ \ ); \ Eblock /*===================================================================================================================================*/ /* :Debut_listMN_MANDELBROT_QUATERNION_11: */ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E M A N D E L B R O T D A N S U N E F E N E T R E */ /* D A N S L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Q = 0 */ /* 0 */ /* */ /* 2 */ /* Q = Q + C */ /* n+1 n */ /* */ /* (ou 'C' designe le point courant). */ /* */ /* Si |Q | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Mandelbrot. */ /* */ /* */ /* Forme generale d'une section tridimensionnelle : */ /* */ /* */ /* : */ /* ++--:: */ /* +++----:::.. */ /* +++++--::... */ /* oooo+o+----::.. */ /* * ooooo++++--::.. */ /* ----:***oooooo++------. --: */ /* ++++++-o*****ooo++++++----+---: */ /* ++o+++o*****ooo+++++++++o+++-::: */ /* ooooo+o********oooooo++o+o++-::::. */ /* +-- -- ooooooo**#***#**oooooooooooo+-----. */ /* ++++--++---- ooooooo######***ooooooooooo++++--:. */ /* o+++++++++++++-o**ooo***####*****o**oooo*oo+++---:: */ /* - o+++++o++++++o*****o**#####********oo*o*oooo+---:: */ /* +ooo+++oo++++++o*******########************ooo+---:: */ /* - +-oooooo+ooooo+++********#########***********ooo----:: */ /* +ooooooooooooo++*******#########************ooo+---: */ /* oooooooooooo+++*******#########************ooo+---: */ /* oooo++oo++++++*******#########************ooo++--: */ /* o+++++o++++- o******#########************ooo+--- */ /* o+++ + o*******########************o++++-: */ /* *******#########*****oo*o**o+---- */ /* ***ooo*########******oooo*oo++--- */ /* oooooo*#*###***ooooooo+o*ooo++ */ /* o+o++*#####****oo++o++. o++ */ /* *#####****o++-- */ /* ####*##oooo++- */ /* #****oo+--- */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_MANDELBROT_QUATERNION_11: */ BFonctionP DEFV(Common,DEFV(Float,SINT(Imandelbrot_dans_HC_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_HC))); /* Seuil de divergence du carre du module d'un nombre hyper-complexe de la suite dans ce cas */ /* particulier (introduit le 20091118181636)... */ DEFV(Common,DEFV(Float,SINT(Imandelbrot_dans_HC_____exposant,FDEUX))); /* Introduit le 20091118113333... */ /* */ /* Le 20100608130024, le 'Int' est devenu un 'Float' pour plus de generalite... */ DEFV(Common,DEFV(Logical,SINT(Imandelbrot_dans_HC_____charger_____l_etat_initial,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageHJ,Imandelbrot_dans_HC_____etat_initial),ADRESSE_NON_ENCORE_DEFINIE))); DEFV(Common,DEFV(Logical,SINT(Imandelbrot_dans_HC_____sauvegarder_l_etat_final__,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageHJ,Imandelbrot_dans_HC_____etat_final__),ADRESSE_NON_ENCORE_DEFINIE))); /* La possibilite de charger et sauvegarder les etats initiaux et finaux a ete */ /* introduit le 20150227205446... */ DEFV(Common,DEFV(FonctionP,POINTERp(Imandelbrot_dans_HC(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ,ponderation_argumentT,ponderation_argumentP,ponderation_argumentA ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-complexe' dans lequel seront definies les composantes */ /* 'HReelle' et 'HImaginaire'. Les Arguments 'composante_J' et 'composante_K' definissent */ /* les composantes 'HJmaginaire' et 'HKmaginaire'... */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentT)); DEFV(Argument,DEFV(Float,ponderation_argumentP)); DEFV(Argument,DEFV(Float,ponderation_argumentA)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : une combinaison lineaire des arguments {T,P,A} de */ /* de Q lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ /* n */ /* les trois valeurs flottantes etant les ponderations des arguments {T,P,A}. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HC /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ begin_image Bblock F_ITERATION_DANS_HC(TEST_DU_CARRE_DU_MODULE_DANS_HC(Imandelbrot_dans_HC_____seuil_du_carre_du_module) ,BLOC(Bblock Test(IL_FAUT(Imandelbrot_dans_HC_____charger_____l_etat_initial)) Bblock HCegal(suite_point,loadHJ_point(Imandelbrot_dans_HC_____etat_initial,X,Y)); Eblock ATes Bblock HCegal(suite_point,HC_____quaternion__0__0__0__0); /* Initialisation de la suite des nombres hyper-complexes sur l'origine, soit : */ /* */ /* Q = 0 */ /* 0 */ /* */ /* On notera que l'on pourrait optimiser, en partant directement sur 'C', mais la difference */ /* entre Julia et Mandelbrot ne serait plus evidente... */ Eblock ETes CLIR(nombre_courant_d_iterations); /* Initialisation du compteur des iterations. */ Eblock ) ,BLOC(Bblock aHCsomme(suite_point,point_manoeuvre,point_courant); /* Puis : */ /* */ /* 2 */ /* Q + C */ /* n */ /* */ /* ou 'C' designe le point hyper-complexe Courant. */ Eblock ) ,Imandelbrot_dans_HC_____exposant ,BLOC(Bblock Test(IL_FAUT(Imandelbrot_dans_HC_____sauvegarder_l_etat_final__)) Bblock storeHJ_point(suite_point,Imandelbrot_dans_HC_____etat_final__,X,Y); Eblock ATes Bblock Eblock ETes Eblock ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /* :Debut_listMN_JULIA_QUATERNION_11: */ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E J U L I A D A N S U N E F E N E T R E */ /* D A N S L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Q = C */ /* 0 */ /* */ /* (ou 'C' designe le point courant), */ /* */ /* 2 */ /* Q = Q + A */ /* n+1 n */ /* */ /* (ou 'A' designe un nombre hyper-complexe */ /* Argument arbitraire). */ /* */ /* Si |Q | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Julia */ /* calcule pour le nombre hyper-complexe 'A'. */ /* */ /* */ /* Forme generale d'une section tridimensionnelle : */ /* */ /* */ /* . ..... */ /* .. .. ---:::: */ /* ......... ..++---- */ /* .......:... :-o++++++ */ /* :.....::---:.. +oooo++++ */ /* ::::::::-+++-::.:::oooooooo+ */ /* :::::::::++++------oooooooo.. */ /* +::::::..+ooo+++++o****oooo.. */ /* ++ ::...ooooo++++*********... */ /* +o +oooo***ooo********............ */ /* +oo +oooooo************............ */ /* +oooooooooooo*########*:::......::. */ /* oooooooooooo#########:::::::::::: */ /* +ooooooo+++#########:::::::::::-: */ /* oooooo++++#######-:::::::::---- */ /* ooo+++++--#####---::::-------- */ /* +++++++--#####--------------+++ */ /* ++++++---#####-------------+++- */ /* +++----####--::--------+++++- */ /* ------###:::::::-----++++++++ */ /* --:####:::::::----++++ooo++ */ /* ::####....:::-+++++ooooo++ */ /* ###### :-+++++ooooooo+ */ /* ####### --+ooo++ooooooo++.. */ /* ######## **oooooooooooooooo+..: */ /* #########oooooooooooo+ooooo+.:::::: */ /* #########**ooooooooooo+:::oo+:::::::: */ /* ***************oooooo+--:::::++::::::. */ /* *********+++-oooooo+++--:::::.+++--:.. */ /* *ooo****o+++--:.o+++++---:::...+---:.. */ /* ooooooooo++- --:.. */ /* +++oooo+. :. */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_JULIA_QUATERNION_11: */ BFonctionP DEFV(Common,DEFV(Logical,SINT(Ijulia_dans_HC_____faire_la_rotation_de__nombre_argument,VRAI))); /* Introduit le 20100303081954 car, en effet a cette date je me demande si cette rotation */ /* est justifiee, meme si c'est avec elle que les resultats sont les plus spectaculaires... */ DEFV(Common,DEFV(Float,SINT(Ijulia_dans_HC_____exposant,FDEUX))); /* Introduit le 20091118113333... */ /* */ /* Le 20100608130024, le 'Int' est devenu un 'Float' pour plus de generalite... */ DEFV(Common,DEFV(Float,SINT(Ijulia_dans_HC_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_HC))); /* Seuil de divergence du carre du module d'un nombre hyper-complexe de la suite dans ce cas */ /* particulier (introduit le 20091118181636)... */ DEFV(Common,DEFV(Float,SINT(Ijulia_dans_HC_____ponderation_point_argument_A,FU))); DEFV(Common,DEFV(Float,SINT(Ijulia_dans_HC_____ponderation__point_courant_C,FZERO))); /* Introduit le 20130825092858... */ DEFV(Common,DEFV(Logical,SINT(Ijulia_dans_HC_____charger_____l_etat_initial,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageHJ,Ijulia_dans_HC_____etat_initial),ADRESSE_NON_ENCORE_DEFINIE))); DEFV(Common,DEFV(Logical,SINT(Ijulia_dans_HC_____sauvegarder_l_etat_final__,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageHJ,Ijulia_dans_HC_____etat_final__),ADRESSE_NON_ENCORE_DEFINIE))); /* La possibilite de charger et sauvegarder les etats initiaux et finaux a ete */ /* introduit le 20150227205446... */ DEFV(Common,DEFV(FonctionP,POINTERp(Ijulia_dans_HC(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,ARGUMENT_POINTERs(nombre_argument) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ,ponderation_argumentT,ponderation_argumentP,ponderation_argumentA ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-complexe' dans lequel seront definies les composantes */ /* 'HReelle' et 'HImaginaire'. Les Arguments 'composante_J' et 'composante_K' definissent */ /* les composantes 'HJmaginaire' et 'HKmaginaire'... */ DEFV(Argument,DEFV(hyper_complexe,POINTERs(nombre_argument))); /* Nombre hyper-complexe "generateur" de l'ensemble de Julia que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentT)); DEFV(Argument,DEFV(Float,ponderation_argumentP)); DEFV(Argument,DEFV(Float,ponderation_argumentA)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : une combinaison lineaire des arguments {T,P,A} de */ /* de Q lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ /* n */ /* les trois valeurs flottantes etant les ponderations des arguments {T,P,A}. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HC DEFV(hyper_complexe,point_argument); /* Point hyper-complexe argument. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ Test(IL_FAUT(Ijulia_dans_HC_____faire_la_rotation_de__nombre_argument)) /* Test introduit le 20100303081954... */ Bblock ROTATION_TRIDIMENSIONNELLE_DANS_HC(point_argument,INDIRECT(nombre_argument)); /* Recuperation du nombre hyper-complexe "generateur", avec rotation eventuelle. Il y avait */ /* autrefois : */ /* */ /* HCegal(point_argument,INDIRECT(nombre_argument)); */ /* */ /* avant que les rotations ne soient introduites... */ Eblock ATes Bblock HCegal(point_argument,INDIRECT(nombre_argument)); /* Cas ou la rotation de 'nombre_argument' est inhibee... */ Eblock ETes begin_image Bblock F_ITERATION_DANS_HC(TEST_DU_CARRE_DU_MODULE_DANS_HC(Ijulia_dans_HC_____seuil_du_carre_du_module) ,BLOC(Bblock Test(IL_FAUT(Ijulia_dans_HC_____charger_____l_etat_initial)) Bblock HCegal(suite_point,loadHJ_point(Ijulia_dans_HC_____etat_initial,X,Y)); Eblock ATes Bblock HCegal(suite_point,point_courant); /* Initialisation de la suite des nombres hyper-complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* Q = C */ /* 0 */ /* */ Eblock ETes EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock DEFV(hyper_complexe,point_manoeuvre_1); aHCcombinaison_lineaire_2(point_manoeuvre_1 ,Ijulia_dans_HC_____ponderation_point_argument_A,point_argument ,Ijulia_dans_HC_____ponderation__point_courant_C,point_courant ); aHCsomme(suite_point,point_manoeuvre,point_manoeuvre_1); /* Puis : */ /* */ /* 2 */ /* Q + A */ /* n */ /* */ /* ou 'A' designe le point hyper-complexe Argument. */ /* */ /* Ou plus generalement (introduit le 20130825092858) : */ /* */ /* 2 */ /* Q + p .A + p .C */ /* n A C */ /* */ /* avec pA=1 et pC=0 par defaut... */ Eblock ) ,Ijulia_dans_HC_____exposant ,BLOC(Bblock Test(IL_FAUT(Ijulia_dans_HC_____sauvegarder_l_etat_final__)) Bblock storeHJ_point(suite_point,Ijulia_dans_HC_____etat_final__,X,Y); Eblock ATes Bblock Eblock ETes Eblock ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E V E R H U L S T D A N S U N E F E N E T R E */ /* D A N S L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Q = C */ /* 0 */ /* */ /* (ou 'C' designe le point courant), */ /* */ /* Q = R.Q .(1 - Q ) */ /* n+1 n n */ /* */ /* (ou 'R' designe un nombre reel Argument */ /* arbitraire appele "taux de croissance"). */ /* */ /* Si |Q | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Verhulst */ /* calcule pour le nombre reel 'R'. */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................#............................... */ /* ...............................###.............................. */ /* ................................#............................... */ /* .........................#.###########.#........................ */ /* ........................#################....................... */ /* ............####.......###################.......####........... */ /* .........##########...#####################...##########........ */ /* ....###..###########..#####################..###########..###... */ /* ################################################################ */ /* ....###..###########..#####################..###########..###... */ /* .........##########...#####################...##########........ */ /* ............####.......###################.......####........... */ /* ........................#################....................... */ /* .........................#.###########.#........................ */ /* ................................#............................... */ /* ...............................###.............................. */ /* ................................#............................... */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Logical,SINT(Iverhulst_dans_HC_____utiliser_la_forme_la_plus_simple,VRAI))); /* Faut-il utiliser la forme ('VRAI') : */ /* */ /* Q = R.Q .(1 - Q ) */ /* n+1 n n */ /* */ /* ou bien la forme ('FAUX') : */ /* */ /* 2 */ /* Q = (R+1).Q - R.Q */ /* n+1 n n */ /* */ /* Ceci a ete introduit le 20040921105449. */ DEFV(Common,DEFV(Float,SINT(Iverhulst_dans_HC_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_HC))); /* Seuil de divergence du carre du module d'un nombre hyper-complexe de la suite dans le cas */ /* particulier du calcul de l'ensemble de Verhulst. ATTENTION : j'ai utilise quelque temps */ /* la valeur suivante : */ /* */ /* EXP2(FLOT(MILLE)) */ /* */ /* mais, je prefere revenir a la valeur standard... */ DEFV(Common,DEFV(FonctionP,POINTERp(Iverhulst_dans_HC(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,ARGUMENT_POINTERs(taux_de_croissance) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ,ponderation_argumentT,ponderation_argumentP,ponderation_argumentA ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-complexe' dans lequel seront definies les composantes */ /* 'HReelle' et 'HImaginaire'. Les Arguments 'composante_J' et 'composante_K' definissent */ /* les composantes 'HJmaginaire' et 'HKmaginaire'... */ DEFV(Argument,DEFV(hyper_complexe,POINTERs(taux_de_croissance))); /* Taux de croissance hyper-complexe 'R' de l'ensemble de Verhulst que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentT)); DEFV(Argument,DEFV(Float,ponderation_argumentP)); DEFV(Argument,DEFV(Float,ponderation_argumentA)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : une combinaison lineaire des arguments {T,P,A} de */ /* de Q lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ /* n */ /* les trois valeurs flottantes etant les ponderations des arguments {T,P,A}. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HC /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ begin_image Bblock F_ITERATION_DANS_HC(TEST_DU_CARRE_DU_MODULE_DANS_HC(Iverhulst_dans_HC_____seuil_du_carre_du_module) ,BLOC(Bblock HCegal(suite_point,point_courant); /* Initialisation de la suite des nombres hyper-complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* Q = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock Test(IL_FAUT(Iverhulst_dans_HC_____utiliser_la_forme_la_plus_simple)) /* Ce test a ete introduit le 20040921105449... */ Bblock DEFV(hyper_complexe,point_manoeuvre_1); DEFV(hyper_complexe,point_manoeuvre_2); /* Points hyper-complexes de maneuvre lors de l'iteration. */ aHCforme_lineaire(point_manoeuvre_1,NEGA(FU),suite_point,FU); /* Calcul de : */ /* */ /* 1 - Q = -Q + 1 */ /* n n */ /* */ aHCproduit(point_manoeuvre_2,suite_point,point_manoeuvre_1); /* Calcul de : */ /* */ /* Q .(1 - Q ) */ /* n n */ /* */ /* ATTENTION, rappelons que le produit de deux quaternions n'est pas commutatif, ce qui */ /* signifie que : */ /* */ /* Q .(1 - Q ) # (1 - Q ).Q */ /* n n n n */ /* */ aHCproduit(suite_point,INDIRECT(taux_de_croissance),point_manoeuvre_2); /* Calcul de : */ /* */ /* Q = R.Q .(1 - Q ) */ /* n+1 n n */ /* */ /* ATTENTION, rappelons que le produit de deux quaternions n'est pas commutatif, ce qui */ /* signifie que : */ /* */ /* R.Q # Q.R */ /* */ Eblock ATes Bblock /* Cette formulation a ete introduite le 20040921105449... */ DEFV(hyper_complexe,point_manoeuvre_1); DEFV(hyper_complexe,point_manoeuvre_2); DEFV(hyper_complexe,point_manoeuvre_3); DEFV(hyper_complexe,point_manoeuvre_4); /* Points hyper-complexes de maneuvre lors de l'iteration. */ aHCproduit(point_manoeuvre_1,suite_point,suite_point); /* Calcul de : */ /* */ /* 2 */ /* Q */ /* n */ /* */ aHCproduit(point_manoeuvre_2,INDIRECT(taux_de_croissance),point_manoeuvre_1); /* Calcul de : */ /* */ /* 2 */ /* R.Q */ /* n */ /* */ aHCforme_lineaire(point_manoeuvre_3,FU,INDIRECT(taux_de_croissance),FU); /* Calcul de : */ /* */ /* R+1 */ /* */ aHCproduit(point_manoeuvre_4,point_manoeuvre_3,suite_point); /* Calcul de : */ /* */ /* (R+1).Q */ /* n */ /* */ aHCdifference(suite_point,point_manoeuvre_4,point_manoeuvre_2); /* Calcul de : */ /* */ /* 2 */ /* Q = (R+1).Q - R.Q */ /* n+1 n n */ /* */ Eblock ETes Eblock ) ,EXPOSANT_INUTILE /* Le 20111130114853, je note que cet argument ('DEUX') est inutile ici, de meme que */ /* calcul de 'point_manoeuvre' via 'HCpuissance(...)'. */ ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E S R A C I N E S N - I E M E S D E L ' U N I T E */ /* D A N S L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iracines_n_iemes_de_l_unite_dans_HC_____seuil_du_carre_du_module,F_INFINI))); /* Seuil de divergence du carre du module d'un nombre hyper-complexe de la suite dans le cas */ /* particulier de la recherche des racines n_iemes de l'unite... */ DEFV(Common,DEFV(FonctionP,POINTERp(Iracines_n_iemes_de_l_unite_dans_HC(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,exposant ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ,ponderation_argumentT ,ponderation_argumentP ,ponderation_argumentA ) ) ) ) /* Fonction introduite le 20061205143352... */ DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-complexe' dans lequel seront definies les composantes */ /* 'HReelle' et 'HImaginaire'. Les Arguments 'composante_J' et 'composante_K' definissent */ /* les composantes 'HJmaginaire' et 'HKmaginaire'... */ DEFV(Argument,DEFV(Positive,exposant)); /* Exposant 'N'. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentT)); DEFV(Argument,DEFV(Float,ponderation_argumentP)); DEFV(Argument,DEFV(Float,ponderation_argumentA)); /* Cet indicateur logique permet de choisir le type d'information que l'on va visualiser... */ /* */ /* On notera le 20061205170611 que c'est le fait que l'on visualise a priori l'argument */ /* de sortie qui permet de visualiser la racine (parmi les N) vers laquelle on converge, */ /* puisque qu'elles sont sur le cercle trigonometrique. Ainsi, les N arguments possibles */ /* sont tres differents les uns des autres et se distinguent par les couleurs. C'est la */ /* raison pour laquelle cet argument n'est pas un parametre des programmes appelant */ /* ('v $xrc/racN.41$K visualisation_arguments_de_sortie')... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HC DEFV(hyper_complexe,exposant_quaternionique_moins_1); /* Exposant complexe moins 1. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ begin_image Bblock F_ITERATION_DANS_HC(TEST_DU_CARRE_DU_MODULE_DANS_HC(Iracines_n_iemes_de_l_unite_dans_HC_____seuil_du_carre_du_module) ,BLOC(Bblock HCinitialisation(exposant_quaternionique_moins_1 ,FLOT(PRED(exposant)),I0_Quaternion,J0_Quaternion,K0_Quaternion ); /* Conversion complexe de l'exposant moins 1. */ HCegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* Q = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock Test(IZNE(HCmodule2(suite_point))) Bblock DEFV(hyper_complexe,point_manoeuvre_1); DEFV(hyper_complexe,point_manoeuvre_3); DEFV(hyper_complexe,point_manoeuvre_4); DEFV(hyper_complexe,point_manoeuvre_5); DEFV(hyper_complexe,point_manoeuvre_6); DEFV(hyper_complexe,point_manoeuvre_7); /* Points complexes de maneuvre lors de l'iteration. */ aHCexponentielle_quaternionique(point_manoeuvre_6,suite_point,exposant_quaternionique_moins_1); /* Calcul de : */ /* */ /* N-1 */ /* Q */ /* n */ /* */ aHCproduit(point_manoeuvre_7,suite_point,point_manoeuvre_6); /* Calcul de : */ /* */ /* N */ /* Q */ /* n */ /* */ aHCforme_lineaire(point_manoeuvre_1,FLOT(exposant),point_manoeuvre_6,FZERO) /* Calcul de : */ /* */ /* N-1 */ /* N.Q */ /* n */ /* */ aHCdifference(point_manoeuvre_3,point_manoeuvre_7,HC_____quaternion_p1__0__0__0); /* Puis de : */ /* */ /* N */ /* Q - 1 */ /* n */ /* */ aHCquotient(point_manoeuvre_4,point_manoeuvre_3,point_manoeuvre_1); /* Puis de : */ /* */ /* N */ /* Q - 1 */ /* n */ /* --------- */ /* N-1 */ /* N.Q */ /* n */ /* */ aHCdifference(point_manoeuvre_5,suite_point,point_manoeuvre_4); HCegal(suite_point,point_manoeuvre_5); /* Puis de : */ /* */ /* N */ /* Q - 1 */ /* n */ /* Q = Q - -------- */ /* n+1 n N-1 */ /* N.Q */ /* n */ /* */ Eblock ATes Bblock /* L'origine (0,0) est un point particulier... */ Eblock ETes Eblock ) ,EXPOSANT_INUTILE /* Le 20111130114853, je note que cet argument ('DEUX') est inutile ici, de meme que */ /* calcul de 'point_manoeuvre' via 'HCpuissance(...)'. */ /* */ /* Le 20111130125631, 'DEUX' fut d'ailleurs remplace par 'EXPOSANT_INUTILE'... */ ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D ' U N P O L Y N O M E V A R I A B L E Q U E L C O N Q U E */ /* D A N S L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* Q = C */ /* 0 */ /* */ /* Q = polynome(Q ) */ /* n+1 n */ /* */ /* (ou 'C' designe le point Courant). */ /* */ /* La fonction 'polynome(...)' est definie */ /* par (la translation 't' de l'exposant pouvant */ /* etre negative a compter du 20100316172716) : */ /* */ /* 0+t 1+t p+t */ /* polynome(Q) = A .Q + A .Q + ... + A .Q + alpha.A + beta.C */ /* 0 1 p */ /* */ /* (ou 'A' et 'C' designent respectivement un */ /* nombre complexe arbitraire Argument et le */ /* point Courant). Quant a la suite de coefficients */ /* {A0,A1,...,Ap} elle est definie a partir d'un album */ /* d'images (indexe par 'Z' -majuscule-). */ /* */ /* Mais ATTENTION, si cela permet de faire varier */ /* localement le polynome au point {X,Y} on notera */ /* bien que : */ /* */ /* C # X + i.Y + ... */ /* */ /* a priori (les coordonnees {X,Y} sont relatives */ /* a une image, alors que 'C' est dans l'espace */ /* hyper-complexe. Cela signifie que lors d'un changement */ /* de la fenetre de calcul {coin_bas_gauche,coin_haut_droite} */ /* (par zoom et/ou translation), les coefficients {A0,A1,...,Ap} */ /* du polynome, eux, resteront les memes... */ /* */ /* Enfin, on notera deux choix importants possibles : */ /* */ /* {alpha=1,beta=0} : ensemble de type "Julia", */ /* {alpha=0,beta=1} : ensemble de type "Mandelbrot", */ /* */ /* toutes les autres combinaisons etant evidemment */ /* possibles... */ /* */ /* Le 20100210133645 a ete introduite la possibilite de */ /* parametrer localement en {X,Y} et partiellement le produit */ /* non theorique (s'il est active) par {exposa1_Rho,ponder1_Theta,ponder1_Phi,ponder1_Alpha}. */ /* */ /* */ /* Nota important : */ /* */ /* La definition du polynome, comme la definition */ /* du parametrage du produit non theorique, n'ont */ /* reellement de sens que lorsqu'un seule 'imageR' */ /* est calculee puisque dans le cas contraire, ce */ /* sont les memes definitions qui seront utilisees */ /* pour d'autres images. Pour bien faire, il conviendrait */ /* de les rendre "multidimensionnelles"... */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HC_____faire_la_rotation_de__nombre_argument_A,VRAI))); /* Introduit le 20100303081954 car, en effet a cette date je me demande si cette rotation */ /* est justifiee, meme si c'est avec elle que les resultats sont les plus spectaculaires... */ DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HC_____prendre_la_partie_entiere_de_ponder1_Theta_,VRAI))); DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HC_____prendre_la_partie_entiere_de_ponder1_Phi__,VRAI))); DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HC_____prendre_la_partie_entiere_de_ponder1_Alpha,VRAI))); /* Introduit le 20100221090225 a cause de 'v $ximcd/operator$FON 20100210182653'... */ DEFV(Common,DEFV(Int,SINT(Iiteration_polynome_variable_quelconque_dans_HC_____premier_exposant_du_polynome,ZERO))); /* Introduit le 20100316172716 afin de pouvoir des polynomes contenant des puissances */ /* negatives de 'Z'... */ DEFV(Common,DEFV(FonctionP,POINTERp(Iiteration_polynome_variable_quelconque_dans_HC(imageR ,definition_du_polynome ,definition_de_exposa1_Rho__ ,definition_de_ponder1_Theta_ ,definition_de_ponder1_Phi__ ,definition_de_ponder1_Alpha ,ponderation_du_nombre_argument_A ,ARGUMENT_POINTERs(nombre_argument_A) ,ponderation_du_nombre_courant_C ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,nombre_maximal_d_iterations ,seuil_du_carre_du_module ,visualisation_arguments_de_sortie ,ponderation_argumentT ,ponderation_argumentP ,ponderation_argumentA ) ) ) ) /* Fonction introduite le 20040510140001... */ DEFV(Argument,DEFV(image,imageR)); /* Image Resultat a generer. */ DEFV(Argument,DEFV(albumF,definition_du_polynome)); /* Definition du polynome variable (en {X,Y}) a l'aide d'un album. */ DEFV(Argument,DEFV(imageF,definition_de_exposa1_Rho__)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_Theta_)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_Phi__)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_Alpha)); /* Definition du parametrage partiel eventuel du "faux" produit (introduit le */ /* 20100210133645). */ DEFV(Argument,DEFV(Float,ponderation_du_nombre_argument_A)); /* Ponderation du nombre complexe argument 'A' (dit 'alpha' dans 'alpha.A + beta.C'). */ DEFV(Argument,DEFV(hyper_complexe,POINTERs(nombre_argument_A))); /* Nombre hyper-complexe argument 'A'. */ DEFV(Argument,DEFV(Float,ponderation_du_nombre_courant_C)); /* Ponderation du nombre hyper-complexe courant 'C' (dit 'beta' dans 'alpha.A + beta.C'). */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-complexe' dans lequel seront definies les composantes */ /* 'HReelle' et 'HImaginaire'. Les Arguments 'composante_J' et 'composante_K' definissent */ /* les composantes 'HJmaginaire' et 'HKmaginaire'... */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Float,seuil_du_carre_du_module)); /* Seuil du carre du module definissant l'arret des iterations. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentT)); DEFV(Argument,DEFV(Float,ponderation_argumentP)); DEFV(Argument,DEFV(Float,ponderation_argumentA)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : une combinaison lineaire des arguments {T,P,A} de */ /* de Q lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ /* n */ /* les trois valeurs flottantes etant les ponderations des arguments {T,P,A}. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HC DEFV(hyper_complexe,nombre_argument_A_apres_transformation_eventuelle); /* Point hyper-complexe argument apres transformation eventuelle... */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision (introduit le */ /* 20061219090342). */ Test(IL_FAUT(Iiteration_polynome_variable_quelconque_dans_HC_____faire_la_rotation_de__nombre_argument_A)) /* Test introduit le 20100303081954... */ Bblock ROTATION_TRIDIMENSIONNELLE_DANS_HC(nombre_argument_A_apres_transformation_eventuelle,INDIRECT(nombre_argument_A)); /* Recuperation du nombre hyper-complexe "generateur", avec rotation eventuelle. Ceci fut */ /* introduit le 20100227094911 car cela manquait dramatiquement... */ Eblock ATes Bblock HCegal(nombre_argument_A_apres_transformation_eventuelle,INDIRECT(nombre_argument_A)); /* Cas ou la rotation de 'nombre_argument' est inhibee... */ Eblock ETes begin_image Bblock #define prendre_la_partie_entiere_de_ponder1_Theta_ \ Iiteration_polynome_variable_quelconque_dans_HC_____prendre_la_partie_entiere_de_ponder1_Theta_ #define prendre_la_partie_entiere_de_ponder1_Phi__ \ Iiteration_polynome_variable_quelconque_dans_HC_____prendre_la_partie_entiere_de_ponder1_Phi__ #define prendre_la_partie_entiere_de_ponder1_Alpha \ Iiteration_polynome_variable_quelconque_dans_HC_____prendre_la_partie_entiere_de_ponder1_Alpha /* Afin de raccourcir des lignes qui suivent... */ gF_ITERATION_DANS_HC(TEST_DU_CARRE_DU_MODULE_DANS_HC(seuil_du_carre_du_module) ,BLOC(Bblock INITIALISATION_DU_POINT_COURANT_DANS_HC; Eblock ) /* Introduit le 20091012111043... */ ,BLOC(Bblock HCegal(suite_point,point_courant); /* Initialisation de la suite des nombres hyper-complexes avec : */ /* */ /* Q = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(VIDE; ) ,BLOC(Bblock DEFV(hyper_complexe,puissance_courante); DEFV(hyper_complexe,polynome_courant); BSaveModifyVariable(Float ,FHCproduit_____avec_le_produit_non_theorique__exposa1_Rho__ ,loadF_point(definition_de_exposa1_Rho__,X,Y) ); BSaveModifyVariable(Float ,FHCproduit_____avec_le_produit_non_theorique__ponder1_Theta_ ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_Theta_) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_Theta_,X,Y) ) ); BSaveModifyVariable(Float ,FHCproduit_____avec_le_produit_non_theorique__ponder1_Phi__ ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_Phi__) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_Phi__,X,Y) ) ); BSaveModifyVariable(Float ,FHCproduit_____avec_le_produit_non_theorique__ponder1_Alpha ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_Alpha) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_Alpha,X,Y) ) ); /* Parametrage partiel eventuel du "faux" produit (introduit le 20100210133645). On notera */ /* que cela n'a d'utilite que si le produit non theorique est active et alors il n'est */ /* utilise que pour l'unique 'HCproduit(...)' qui suit... */ aHCpuissance(puissance_courante ,point_courant ,Iiteration_polynome_variable_quelconque_dans_HC_____premier_exposant_du_polynome ); /* Avant le 20100316172716, il y avait ici : */ /* */ /* HCinitialisation(puissance_courante, */ /* ,R1_Quaternion */ /* ,I0_Quaternion */ /* ,J0_Quaternion */ /* ,K0_Quaternion */ /* ); */ /* */ /* ce qui revient au meme lorsque l'exposant est nul : */ /* */ /* 0 */ /* puissance(Q) = Q = {1,0,0,0} */ /* */ /* ce qui est le cas par defaut... */ aHCcombinaison_lineaire_2(polynome_courant ,ponderation_du_nombre_argument_A ,nombre_argument_A_apres_transformation_eventuelle ,ponderation_du_nombre_courant_C ,point_courant ); /* Definition du polynome et initialisation avec : */ /* */ /* polynome(Q) = alpha.A + beta.C */ /* */ /* */ begin_fuite Bblock DEFV(Float,INIT(coefficient_polynomial,AloadF_point(definition_du_polynome,X,Y,Z))); DEFV(hyper_complexe,monome_courant); aHCforme_lineaire(monome_courant,coefficient_polynomial,puissance_courante,FZERO); aHCsomme(polynome_courant,polynome_courant,monome_courant); /* Calcul iteratif du polynome courant : */ /* */ /* 0 1 p */ /* polynome(Q) = A .Q + A .Q + ... + A .Q + alpha.A + beta.C */ /* 0 1 p */ /* */ /* ou 'A(i)' designe la i-ieme page de l'album 'definition_du_polynome'... */ aHCproduit(puissance_courante,puissance_courante,suite_point); /* Calcul de la puissance courante suivante (Z+1) : */ /* */ /* Z+1 */ /* puissance(Q) = Q */ /* */ Eblock end_fuite HCegal(suite_point,polynome_courant); /* Et iteration de la fonction : */ /* */ /* Q = polynome(Q ) */ /* n+1 n */ /* */ ESaveModifyVariable(Float ,FHCproduit_____avec_le_produit_non_theorique__ponder1_Alpha ); ESaveModifyVariable(Float ,FHCproduit_____avec_le_produit_non_theorique__ponder1_Phi__ ); ESaveModifyVariable(Float ,FHCproduit_____avec_le_produit_non_theorique__ponder1_Theta_ ); ESaveModifyVariable(Float ,FHCproduit_____avec_le_produit_non_theorique__exposa1_Rho__ ); /* Parametrage partiel eventuel du "faux" produit (introduit le 20100210133645). */ Eblock ) ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); #undef prendre_la_partie_entiere_de_ponder1_Alpha #undef prendre_la_partie_entiere_de_ponder1_Phi__ #undef prendre_la_partie_entiere_de_ponder1_Theta_ Eblock end_image RETI(imageR); Eblock EFonctionP #undef SEUIL_MODULE_DANS_HC /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E S U I T E Q U E L C O N Q U E */ /* D A N S L ' E S P A C E H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #define BVARIABLES_F_ITERATION_QUELCONQUE_DANS_HC \ /* Definition des variables communes a toutes les fonctions calculant une suite quelconque */ \ /* dans l'espace Hyper-Complexe. */ \ BVARIABLES_D_HOMOTHETIE_C_HC_HHC \ /* "Taille" reelle et imaginaire de la fenetre rapportee a la taille des images. */ \ DEFV(hyper_complexe,point_courant); \ /* Point hyper-complexe courant 'C' dans la fenetre. */ #define F_ITERATION_QUELCONQUE_DANS_HC(premiere_iteration_absolue,premiere_iteration_effective,initialisation,iteration,test_defaut) \ Bblock \ DEFV(Int,INIT(numero_de_l_iteration,UNDEF)); \ /* Indice 'n' de la suite 'X'... */ \ DEFV(hyper_complexe,element_courant_de_la_suite_Pn); \ /* Element courant Z de la suite. */ \ /* n */ \ BLOC(initialisation); \ /* Initialisation de la suite definissant le systeme dynamique... */ \ \ DoIn(numero_de_l_iteration \ ,premiere_iteration_effective \ ,LSTX(premiere_iteration_absolue,nombre_d_iterations) \ ,I \ ) \ Bblock \ BLOC(iteration); \ /* Calcul du systeme dynamique par iteration du calcul de la suite... */ \ \ Test(IL_FAUT(test_defaut)) \ Bblock \ TEST_D_UNDERFLOW_D_UNE_SUITE_HYPER_COMPLEXE(element_courant_de_la_suite_Pn \ ,iterations_dans_C_HC_HHC_____epsilon \ ); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter */ \ /* des underflows flottants... */ \ TEST_D_OVERFLOW_D_UNE_SUITE_HYPER_COMPLEXE(element_courant_de_la_suite_Pn,RACX(F_INFINI)); \ /* Lorsqu'une composante devient trop grande, on la plafonne afin d'eviter des underflows */ \ /* flottants. On notera l'utilisation de 'RACX(...)' pour prendre en compte l'elevation au */ \ /* carre lors de l'eventuelle iteration suivante... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Eblock \ EDoI \ \ storeHJ_point(element_courant_de_la_suite_Pn \ ,imageR \ ,X,Y \ ); \ /* Generation de l'image "hyper_complexe"... */ \ Eblock \ /* Calcul general d'une suite quelconque dans l'espace hyper-complexe... */ \ /* */ \ /* On notera le 20050316114436 (un peu tard...) que 'F_ITERATION_QUELCONQUE_DANS_HC' */ \ /* n'est pas utilise et fut introduit par symetrie avec 'F_ITERATION_QUELCONQUE_DANS_C' */ \ /* et donc pour prevoir des extensions futures... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T E U R D E F O N C T I O N S C A L C U L A N T */ /* U N E F O N C T I O N H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #pragma xcg__gen_ext_Z__gen_Fonction_SE__GENERE__Fonction GENERE__FonctionHJ_I_FONCTION_HC POINTERHJ #define GENERE__FonctionHJ_I_FONCTION_HC(nom_et_arguments_de_la_fonction,Nfonction,Vfonction,alpha,beta_,gamma,delta,nom) \ DEFV(FonctionHJ,POINTERHJ(nom_et_arguments_de_la_fonction)) \ /* ATTENTION, il ne faut pas ecrire : */ \ /* */ \ /* DEFV(Common,DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction))) */ \ /* */ \ /* puisqu'en effet la directive 'Common' est utilisee lors de l'appel par : */ \ /* */ \ /* DEFV(Common,GENERE__FonctionHJ_I_FONCTION_HC(...)) */ \ /* */ \ /* Actuellement cette redondance ne serait pas genante, mais plus tard... */ \ DEFV(Argument,DEFV(imageHJ,imageR)); \ /* Image Resultat a generer. */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); \ /* Definition du point situe en bas et a gauche de la fenetre, */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); \ /* Definition du point situe en haut et a droite de la fenetre. */ \ DEFV(Argument,DEFV(Float,composante_J)); \ DEFV(Argument,DEFV(Float,composante_K)); \ /* Composantes complementaires definissant l'espace hyper-complexe... */ \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ BVARIABLES_F_ITERATION_QUELCONQUE_DANS_HC \ /*..............................................................................................................................*/ \ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; \ \ begin_image \ Bblock \ DEFV(hyper_complexe,point_courant_transforme); \ \ INITIALISATION_DU_POINT_COURANT_DANS_HC; \ /* Initialisation du "point Courant" 'C'. */ \ \ HCforme_homographique(point_courant_transforme,alpha,point_courant,beta_,gamma,point_courant,delta); \ /* Transformation homographique du "point Courant" 'C'. */ \ \ CALS(Nfonction(point_courant_transforme)); \ /* Application de la transformation... */ \ \ storeHJ_point(Vfonction \ ,imageR \ ,X,Y \ ); \ /* Generation de l'image "hyper_complexe"... */ \ Eblock \ end_image \ \ RETIHJ(imageR); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' cos ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHJ DEFV(Common,GENERE__FonctionHJ_I_FONCTION_HC(IHJfonction_cosinus_circulaire_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_circulaire_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_circulaire_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_circulaire_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_circulaire_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"cos" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' sin ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHJ DEFV(Common,GENERE__FonctionHJ_I_FONCTION_HC(IHJfonction_sinus_circulaire_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_circulaire_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_circulaire_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_circulaire_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_circulaire_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"sin" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' tg ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHJ DEFV(Common,GENERE__FonctionHJ_I_FONCTION_HC(IHJfonction_tangente_circulaire_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_circulaire_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_circulaire_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_circulaire_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_circulaire_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"tg" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' ch ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHJ DEFV(Common,GENERE__FonctionHJ_I_FONCTION_HC(IHJfonction_cosinus_hyperbolique_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_hyperbolique_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_hyperbolique_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_hyperbolique_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_hyperbolique_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"ch" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' sh ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHJ DEFV(Common,GENERE__FonctionHJ_I_FONCTION_HC(IHJfonction_sinus_hyperbolique_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_hyperbolique_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_hyperbolique_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_hyperbolique_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_hyperbolique_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"sh" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' th ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHJ DEFV(Common,GENERE__FonctionHJ_I_FONCTION_HC(IHJfonction_tangente_hyperbolique_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_hyperbolique_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_hyperbolique_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_hyperbolique_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_hyperbolique_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"th" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' exp ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHJ DEFV(Common,GENERE__FonctionHJ_I_FONCTION_HC(IHJfonction_exponentielle_neperienne_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCexponentielle_neperienne /* Common,DEFV(Fonction,) : \ */ ,fFHCexponentielle_neperienne_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHCexponentielle_neperienne_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHCexponentielle_neperienne_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHCexponentielle_neperienne_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHCexponentielle_neperienne_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"exp" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' log ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHJ DEFV(Common,GENERE__FonctionHJ_I_FONCTION_HC(IHJfonction_logarithme_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHClogarithme /* Common,DEFV(Fonction,) : \ */ ,fFHClogarithme_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHClogarithme_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHClogarithme_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHClogarithme_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHClogarithme_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"log" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHJ #undef GENERE__FonctionHJ_I_FONCTION_HC /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T E U R D E F O N C T I O N S I T E R A N T */ /* U N E F O N C T I O N H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #pragma xcg__gen_ext_Z__gen_Fonction_SE__GENERE__Fonction GENERE__FonctionP_I_ITERAT_F_HC POINTERp #define GENERE__FonctionP_I_ITERAT_F_HC(nom_et_arguments_de_la_fonction,Nfonction,Vfonction,seuil_du_carre_du_module) \ /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees */ \ /* a la recuperation automatique des fichiers d'arguments ; on trouvera donc : */ \ /* */ \ /* GENERE__FonctionP_FONCTION_C(nom_et_arguments_de_la_fonction,Nfonction,Vfonction) */ \ /* */ \ /* D'autre part, la fonction 'Nfonction' devra etre de nom '__...' afin que son nombre */ \ /* d'arguments ne soit pas verifie ('v $xcg/gen.arg$D/debut$I __f'). */ \ DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction)) \ /* ATTENTION, il ne faut pas ecrire : */ \ /* */ \ /* DEFV(Common,DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction))) */ \ /* */ \ /* mais : */ \ /* */ \ /* DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction)) */ \ /* */ \ /* puisqu'en effet la directive 'Common' est utilisee lors de l'appel par : */ \ /* */ \ /* DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HC(...)) */ \ /* */ \ /* Actuellement cette redondance ne serait pas genante, mais plus tard... */ \ DEFV(Argument,DEFV(image,imageR)); \ /* Image Resultat a generer. */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); \ /* Definition du point situe en bas et a gauche de la fenetre, */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); \ /* Definition du point situe en haut et a droite de la fenetre. */ \ DEFV(Argument,DEFV(Float,composante_J)); \ DEFV(Argument,DEFV(Float,composante_K)); \ /* Composantes complementaires definissant l'espace hyper-complexe... */ \ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); \ /* Nombre maximal d'iterations demande. */ \ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); \ /* Cet indicateur logique permet de choisir le type d'information que */ \ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ \ /* de Q lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ \ /* n */ \ DEFV(Argument,DEFV(Float,ponderation_argumentT)); \ DEFV(Argument,DEFV(Float,ponderation_argumentP)); \ DEFV(Argument,DEFV(Float,ponderation_argumentA)); \ /* Cet indicateur logique permet de choisir le type d'information que */ \ /* l'on va visualiser : une combinaison lineaire des arguments {T,P,A} de */ \ /* de Q lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ \ /* n */ \ /* les trois valeurs flottantes etant les ponderations des arguments {T,P,A}. */ \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ BVARIABLES_F_ITERATION_DANS_HC \ /*..............................................................................................................................*/ \ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; \ \ INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; \ \ gF_ITERATION_DANS_HC__INITIALISATIONS_DIVERSES; \ \ begin_image \ Bblock \ gF_ITERATION_DANS_HC(TEST_DU_CARRE_DU_MODULE_DANS_HC(seuil_du_carre_du_module) \ ,BLOC(Bblock \ INITIALISATION_DU_POINT_COURANT_DANS_HC; \ Eblock \ ) \ ,BLOC(Bblock \ HCegal(suite_point,point_courant); \ /* Initialisation de la suite des nombres hyper_complexes sur le "point Courant" 'C', */ \ /* soit : */ \ /* */ \ /* Z = C */ \ /* 0 */ \ /* */ \ EGAL(nombre_courant_d_iterations,UN); \ /* Initialisation du compteur des iterations ; ce compteur est initialise */ \ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ \ /* valeur non nulle soit rangee... */ \ Eblock \ ) \ ,BLOC(VIDE; \ ) \ ,BLOC(Bblock \ CALS(Nfonction(suite_point)); \ HCegal(suite_point,Vfonction); \ /* Et iteration de la fonction : */ \ /* */ \ /* Z = Nfonction(Z ) */ \ /* n n */ \ /* */ \ /* en notant qu'il est preferable de ne pas ecrire : */ \ /* */ \ /* HCegal(suite_point,Nfonction(suite_point)); */ \ /* */ \ /* car cette derniere ecriture, de par la programmation de 'v $ximcd/operator$FON HCegal', */ \ /* provoquerait deux fois le calcul de la fonction 'Nfonction(suite_point)'... */ \ Eblock \ ) \ ,BLOC(VIDE; \ ) \ ); \ Eblock \ end_image \ \ RETI(imageR); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' cos ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_cosinus_circulaire_dans_HC_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HC(Iiteration_cosinus_circulaire_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentT /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentP /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_cosinus_circulaire_dans_HC_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' sin ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_sinus_circulaire_dans_HC_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HC(Iiteration_sinus_circulaire_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentT /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentP /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_sinus_circulaire_dans_HC_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' tg ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_tangente_circulaire_dans_HC_____seuil,FDEUX))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HC(Iiteration_tangente_circulaire_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentT /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentP /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_tangente_circulaire_dans_HC_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' ch ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_cosinus_hyperbolique_dans_HC_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HC(Iiteration_cosinus_hyperbolique_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentT /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentP /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHCcosinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_cosinus_hyperbolique_dans_HC_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' sh ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_sinus_hyperbolique_dans_HC_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HC(Iiteration_sinus_hyperbolique_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentT /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentP /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHCsinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_sinus_hyperbolique_dans_HC_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' th ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_tangente_hyperbolique_dans_HC_____seuil,FDEUX))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HC(Iiteration_tangente_hyperbolique_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentT /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentP /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHCtangente_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_tangente_hyperbolique_dans_HC_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' exp ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_exponentielle_neperienne_dans_HC_____seuil,FLOT(MILLIARD)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HC(Iiteration_exponentielle_neperienne_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentT /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentP /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHCexponentielle_neperienne /* Common,DEFV(Fonction,) : \ */ ,fFHCexponentielle_neperienne_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_exponentielle_neperienne_dans_HC_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' log ' H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_logarithme_dans_HC_____seuil,FDEUX))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HC(Iiteration_logarithme_dans_HC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentT /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentP /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHClogarithme /* Common,DEFV(Fonction,) : \ */ ,fFHClogarithme_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_logarithme_dans_HC_____seuil /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP #undef GENERE__FonctionP_I_ITERAT_F_HC #undef TEST_DU_CARRE_DU_MODULE_DANS_HC #undef F_ITERATION_DANS_HC #undef gF_ITERATION_DANS_HC #undef TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE #undef INVERSION_D_UNE_COMPOSANTE #undef REPLIEMENT_D_UNE_COMPOSANTE #undef REPLIEMENT_SINUSOIDAL_D_UNE_COMPOSANTE #undef REPLIEMENT_POLYNOMIAL_D_UNE_COMPOSANTE #undef REPLIEMENT_AFFINE_PAR_MORCEAUX_D_UNE_COMPOSANTE #undef F_ITERATION_QUELCONQUE_DANS_HC #undef BVARIABLES_F_ITERATION_QUELCONQUE_DANS_HC #undef TEST_D_OVERFLOW_D_UNE_SUITE_HYPER_COMPLEXE #undef TEST_D_UNDERFLOW_D_UNE_SUITE_HYPER_COMPLEXE #undef INITIALISATION_DU_POINT_COURANT_DANS_HC #undef BVARIABLES_F_ITERATION_DANS_HC #undef ROTATION_TRIDIMENSIONNELLE_DANS_HC /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N T R O L E D E L ' A R I T H M E T I Q U E E T E N D U E */ /* L O R S D E C A L C U L S S U R L E S N O M B R E S H Y P E R - H Y P E R - C O M P L E X E S : */ /* */ /* */ /* Nota : */ /* */ /* Tout cela fut introduit le 20110802111915 */ /* au cas ou l'utilite s'en manifesterait... */ /* */ /*************************************************************************************************************************************/ #ifdef FAIRE_EVENTUELLEMENT_DE_L_ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_HYPER_HYPER_COMPLEXES DEFV(Common,DEFV(Logical,_______VERSION__ximcf_iterations_____ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_HYPER_HYPER_COMPLEXES)); #Aifdef FAIRE_EVENTUELLEMENT_DE_L_ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_HYPER_HYPER_COMPLEXES DEFV(Common,DEFV(Logical,_______VERSION__ximcf_iterations_____ARITHMETIQUE_DE_BASE_DANS_LES_NOMBRES_HYPER_HYPER_COMPLEXES)); #Eifdef FAIRE_EVENTUELLEMENT_DE_L_ARITHMETIQUE_ETENDUE_DANS_LES_NOMBRES_HYPER_HYPER_COMPLEXES /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S E U I L D U M O D U L E : */ /* D A N S L ' E S P A C E H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /* */ /* Nota : */ /* */ /* Tout cela fut introduit le 20110802111915 */ /* au cas ou l'utilite s'en manifesterait... */ /* */ /*************************************************************************************************************************************/ #define TEST_DU_CARRE_DU_MODULE_DANS_HHC(seuil) \ IFLT(HHCmodule2(suite_point),seuil) \ /* Test quelconque de continuation des iterations dans 'F_ITERATION_DANS_HHC(...)'. */ #define SEUIL_MODULE_DANS_HHC \ EXP2(DOUB(UNITE)) DEFV(Common,DEFV(Float,ZINT(iterations_diverses_dans_HHC_____seuil_du_carre_du_module ,SEUIL_MODULE_DANS_HHC ) ) ); /* Seuil de divergence du carre du module d'un nombre hyper-hyper-complexe de la suite. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E P L I E M E N T E V E N T U E L D E L ' E S P A C E H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____replier_l_espace,ITERATIONS_DIVERSES_____REPLIER_L_ESPACE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Rorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Rextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Iorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Iextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Jorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Jextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Korigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Kextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Sorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Sextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Torigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Textremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Uorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Uextremite,ITERATIONS_DIVERSES_____EXTREMITE))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Vorigine__,ITERATIONS_DIVERSES_____ORIGINE__))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____Vextremite,ITERATIONS_DIVERSES_____EXTREMITE))); /* Possibilite introduite le 20121103095740... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S N E C E S S A I R E S A U C A L C U L E N " F L O T T A N T " */ /* D A N S L ' E S P A C E H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /* */ /* Nota : */ /* */ /* Tout cela fut introduit le 20110802111915 */ /* au cas ou l'utilite s'en manifesterait... */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(iterations_diverses_dans_HHC_____centrer_la_rotation_3D_dans_la_fenetre,FAUX))); /* Introduit le 20121227110206 afin de faciliter le changement de centre de rotation... */ DEFV(Common,DEFV(Float,ZINT(iterations_diverses_dans_HHC_____X_centre_de_rotation_3D,FZERO))); DEFV(Common,DEFV(Float,ZINT(iterations_diverses_dans_HHC_____Y_centre_de_rotation_3D,FZERO))); DEFV(Common,DEFV(Float,ZINT(iterations_diverses_dans_HHC_____Z_centre_de_rotation_3D,FZERO))); #define ROTATION_TRIDIMENSIONNELLE_DANS_HHC(point_apres_rotation,point_avant_rotation) \ Bblock \ DEFV(Float,INIT(X_centre_de_rotation_3D,iterations_diverses_dans_HHC_____X_centre_de_rotation_3D)); \ DEFV(Float,INIT(Y_centre_de_rotation_3D,iterations_diverses_dans_HHC_____Y_centre_de_rotation_3D)); \ DEFV(Float,INIT(Z_centre_de_rotation_3D,iterations_diverses_dans_HHC_____Z_centre_de_rotation_3D)); \ /* Definition du centre de rotation tridimensionnel par defaut... */ \ \ Test(IL_FAUT(iterations_diverses_dans_HHC_____centrer_la_rotation_3D_dans_la_fenetre)) \ Bblock \ EGAL(X_centre_de_rotation_3D \ ,MOYE(Reelle(INDIRECT(coin_bas_gauche)),Reelle(INDIRECT(coin_haut_droite))) \ ); \ EGAL(Y_centre_de_rotation_3D \ ,MOYE(Imaginaire(INDIRECT(coin_bas_gauche)),Imaginaire(INDIRECT(coin_haut_droite))) \ ); \ EGAL(Z_centre_de_rotation_3D \ ,composante_J \ ); \ /* Positionnement du centre de rotation tridimensionnelle au centre de la fenetre... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ HHCinitialisation(point_apres_rotation \ ,ADD2(TRANSFORMATION_GEOMETRIQUE_3D_Fx \ (SOUS(HHReelle(point_avant_rotation) \ ,X_centre_de_rotation_3D \ ) \ ,SOUS(HHImaginaire(point_avant_rotation) \ ,Y_centre_de_rotation_3D \ ) \ ,SOUS(HHJmaginaire(point_avant_rotation) \ ,Z_centre_de_rotation_3D \ ) \ ,NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz \ ) \ ,X_centre_de_rotation_3D \ ) \ ,ADD2(TRANSFORMATION_GEOMETRIQUE_3D_Fy \ (SOUS(HHReelle(point_avant_rotation) \ ,X_centre_de_rotation_3D \ ) \ ,SOUS(HHImaginaire(point_avant_rotation) \ ,Y_centre_de_rotation_3D \ ) \ ,SOUS(HHJmaginaire(point_avant_rotation) \ ,Z_centre_de_rotation_3D \ ) \ ,NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz \ ) \ ,Y_centre_de_rotation_3D \ ) \ ,ADD2(TRANSFORMATION_GEOMETRIQUE_3D_Fz \ (SOUS(HHReelle(point_avant_rotation) \ ,X_centre_de_rotation_3D \ ) \ ,SOUS(HHImaginaire(point_avant_rotation) \ ,Y_centre_de_rotation_3D \ ) \ ,SOUS(HHJmaginaire(point_avant_rotation) \ ,Z_centre_de_rotation_3D \ ) \ ,NE_PAS_TRANSLATER_LORS_DE_TRANSFORMATION_GEOMETRIQUE_3D_Fxyz \ ) \ ,Z_centre_de_rotation_3D \ ) \ ,NEUT(HHKmaginaire(point_avant_rotation)) \ ,NEUT(HHSmaginaire(point_avant_rotation)) \ ,NEUT(HHTmaginaire(point_avant_rotation)) \ ,NEUT(HHUmaginaire(point_avant_rotation)) \ ,NEUT(HHVmaginaire(point_avant_rotation)) \ ); \ /* Rotation du point Argument par rapport aux trois premiers axes... */ \ Eblock \ /* Rotation d'un point hyper-hyper-complexe par rapport aux trois premiers axes... */ #define BVARIABLES_F_ITERATION_DANS_HHC \ /* Definition des variables communes a 'Julia' et 'Mandelbrot'. */ \ BVARIABLES_D_HOMOTHETIE_C_HC_HHC \ /* "Taille" reelle et imaginaire de la fenetre rapportee a la taille des images. */ \ DEFV(hyper_hyper_complexe,point_courant); \ /* Point hyper-hyper-complexe courant 'C' dans la fenetre. */ \ DEFV(hyper_hyper_complexe,suite_point); \ /* Suite des points hyper-hyper-complexes O lors de l'iteration. */ \ /* n */ \ DEFV(hyper_hyper_complexe,point_manoeuvre); \ /* Point hyper-hyper-complexe de maneuvre lors de l'iteration. */ \ VARIABLES_COMMUNES_DES_ITERATIONS_DANS_C_HC_HHC; #define INITIALISATION_DU_POINT_COURANT_DANS_HHC \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ Bblock \ DEFV(hyper_hyper_complexe,point_courant_avant_rotation); \ /* Point de manoeuvre... */ \ \ HHCinitialisation(point_courant_avant_rotation \ ,X_IMAGE_PLAN(X),Y_IMAGE_PLAN(Y) \ ,composante_J,composante_K \ ,composante_S,composante_T,composante_U,composante_V \ ); \ /* Le "point_courant" 'C' est le point courant {X,Y} sur le maillage de l'image auquel */ \ /* on "adjoint" les 'composante_J', 'composante_K', 'composante_S', 'composante_T', */ \ /* 'composante_U' et 'composante_V' pour passer dans l'hyper-hyper-espace. */ \ ROTATION_TRIDIMENSIONNELLE_DANS_HHC(point_courant,point_courant_avant_rotation); \ /* Rotation (eventuelle) du point courant... */ \ Eblock \ /* Initialisation du point hyper-hyper-complexe courant sur un maillage {X,Y}. */ #define TEST_D_UNDERFLOW_D_UNE_SUITE_HYPER_HYPER_COMPLEXE(suite_hyper_hyper_complexe,epsilon) \ Bblock \ EGAL(HHReelle(suite_hyper_hyper_complexe),TROP_PETIT(HHReelle(suite_hyper_hyper_complexe),epsilon)); \ EGAL(HHImaginaire(suite_hyper_hyper_complexe),TROP_PETIT(HHImaginaire(suite_hyper_hyper_complexe),epsilon)); \ EGAL(HHJmaginaire(suite_hyper_hyper_complexe),TROP_PETIT(HHJmaginaire(suite_hyper_hyper_complexe),epsilon)); \ EGAL(HHKmaginaire(suite_hyper_hyper_complexe),TROP_PETIT(HHKmaginaire(suite_hyper_hyper_complexe),epsilon)); \ EGAL(HHSmaginaire(suite_hyper_hyper_complexe),TROP_PETIT(HHSmaginaire(suite_hyper_hyper_complexe),epsilon)); \ EGAL(HHTmaginaire(suite_hyper_hyper_complexe),TROP_PETIT(HHTmaginaire(suite_hyper_hyper_complexe),epsilon)); \ EGAL(HHUmaginaire(suite_hyper_hyper_complexe),TROP_PETIT(HHUmaginaire(suite_hyper_hyper_complexe),epsilon)); \ EGAL(HHVmaginaire(suite_hyper_hyper_complexe),TROP_PETIT(HHVmaginaire(suite_hyper_hyper_complexe),epsilon)); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter des underflows */ \ /* flottants... */ \ Eblock \ /* Test des underflows d'une suite hyper-hyper-complexe... */ #define TEST_D_OVERFLOW_D_UNE_SUITE_HYPER_HYPER_COMPLEXE(suite_hyper_hyper_complexe,anti_epsilon) \ Bblock \ EGAL(HHReelle(suite_hyper_hyper_complexe),TROP_GRAND(HHReelle(suite_hyper_hyper_complexe),anti_epsilon)); \ EGAL(HHImaginaire(suite_hyper_hyper_complexe),TROP_GRAND(HHImaginaire(suite_hyper_hyper_complexe),anti_epsilon)); \ EGAL(HHJmaginaire(suite_hyper_hyper_complexe),TROP_GRAND(HHJmaginaire(suite_hyper_hyper_complexe),anti_epsilon)); \ EGAL(HHKmaginaire(suite_hyper_hyper_complexe),TROP_GRAND(HHKmaginaire(suite_hyper_hyper_complexe),anti_epsilon)); \ EGAL(HHSmaginaire(suite_hyper_hyper_complexe),TROP_GRAND(HHSmaginaire(suite_hyper_hyper_complexe),anti_epsilon)); \ EGAL(HHTmaginaire(suite_hyper_hyper_complexe),TROP_GRAND(HHTmaginaire(suite_hyper_hyper_complexe),anti_epsilon)); \ EGAL(HHUmaginaire(suite_hyper_hyper_complexe),TROP_GRAND(HHUmaginaire(suite_hyper_hyper_complexe),anti_epsilon)); \ EGAL(HHVmaginaire(suite_hyper_hyper_complexe),TROP_GRAND(HHVmaginaire(suite_hyper_hyper_complexe),anti_epsilon)); \ /* Lorsqu'une composante devient trop grande, on la plafonne afin d'eviter des underflows */ \ /* flottants... */ \ Eblock \ /* Test des overflows d'une suite hyper-hyper-complexe... */ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point,FAUX))); DEFV(Common,DEFV(Positive,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__nombre_repetitions,UN))); /* Afin de permettre, par exemple, la generation d'objet de type "MandelBox". */ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement,VRAI))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_S__R,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_lineaire__R,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_polynomial__R,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_sinusoidal__R,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn__R,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn__R,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp__R,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp__R,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_E__R,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_S__I,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_lineaire__I,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_polynomial__I,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_sinusoidal__I,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn__I,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn__I,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp__I,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp__I,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_E__I,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_S__J,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_lineaire__J,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_polynomial__J,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_sinusoidal__J,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn__J,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn__J,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp__J,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp__J,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_E__J,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_S__K,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_lineaire__K,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_polynomial__K,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_sinusoidal__K,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn__K,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn__K,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp__K,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp__K,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_E__K,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_S__S,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_lineaire__S,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_polynomial__S,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_sinusoidal__S,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn__S,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn__S,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp__S,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp__S,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_E__S,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_S__T,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_lineaire__T,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_polynomial__T,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_sinusoidal__T,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn__T,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn__T,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp__T,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp__T,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_E__T,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_S__U,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_lineaire__U,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_polynomial__U,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_sinusoidal__U,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn__U,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn__U,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp__U,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp__U,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_E__U,UN))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_S__V,FU))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_lineaire__V,VRAI))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_polynomial__V,FAUX))); DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_sinusoidal__V,FAUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn__V,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn__V,NEGA(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp__V,NEUT(FU)))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp__V,NEUT(FU)))); DEFV(Common,DEFV(Int,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_E__V,UN))); #define REPLIEMENT_AFFINE_PAR_MORCEAUX_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ CON02(IFLT(valeur_de_la_composante \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn`nom_de_la_composante \ ) \ ,AXPB(NEGA(DIVZ(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn`nom_de_la_composante \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn`nom_de_la_composante \ ) \ ) \ ,valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yn`nom_de_la_composante) \ ) \ ,IFGT(valeur_de_la_composante \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp`nom_de_la_composante \ ) \ ,AXPB(NEGA(DIVZ(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp`nom_de_la_composante \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp`nom_de_la_composante \ ) \ ) \ ,valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_yp`nom_de_la_composante) \ ) \ ,NEUT(valeur_de_la_composante) \ ) \ /* Repliement d'une composante {R,I,J,K,S,T,U,V} suivant (avec un "Signe" positif) : */ \ /* */ \ /* ^ */ \ /* | */ \ /* \ | */ \ /* \ | */ \ /* \ yp*. . .* */ \ /* \ | /.\ */ \ /* \ | / . \ */ \ /* \ | / . \ */ \ /* \ | / . \ */ \ /* \ xn |/ . \ 2.xp */ \ /* --------*-----*-----O-----*-----*--------------------> */ \ /* 2.xn \ . /| xp \ */ \ /* \ . / | \ */ \ /* \ . / | \ */ \ /* \ . / | \ */ \ /* \./ | \ */ \ /* *. . .*yn \ */ \ /* | \ */ \ /* | \ */ \ /* */ \ /* (avec "n" pour "Negatif" et "p" pour "Positif"), le "Signe" negatif permettant de faire */ \ /* une symetrie par rapport a l'axe des abscisses... */ #define REPLIEMENT_POLYNOMIAL_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ MUL2(NEGA(valeur_de_la_composante) \ ,EXPn(MUL2(SOUS(valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xn`nom_de_la_composante) \ ) \ ,SOUS(valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp`nom_de_la_composante) \ ) \ ) \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_E`nom_de_la_composante \ ) \ ) \ /* Repliement d'une composante {R,I,J,K,S,T,U,V} a l'aide d'un polynome (de degre impair de */ \ /* preference si l'on souhaite "simuler" le "zig-zag" affine par morceaux...) dont les */ \ /* intersections avec les axes sont donnees par les racines {2.xn,0,2.xp}. */ #define REPLIEMENT_SINUSOIDAL_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ SINX(SCAL(valeur_de_la_composante \ ,DOUB(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_xp`nom_de_la_composante) \ ,PI \ ) \ ) \ /* Repliement d'une composante {R,I,J,K,S,T,U,V} a l'aide d'une sinusoide dont les */ \ /* intersections avec les axes sont donnees par les racines {2.xp+k.pi}. */ #define REPLIEMENT_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ MUL2(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_S`nom_de_la_composante \ ,CON03(IL_FAUT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_lineaire`nom_de_la_composante) \ ,REPLIEMENT_AFFINE_PAR_MORCEAUX_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ ,IL_FAUT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_polynomial`nom_de_la_composante) \ ,REPLIEMENT_POLYNOMIAL_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ ,IL_FAUT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement_sinusoidal`nom_de_la_composante) \ ,REPLIEMENT_SINUSOIDAL_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ ,valeur_de_la_composante \ ) \ ) \ /* Repliement d'une composante {R,I,J,K,S,T,U,V}. */ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion,VRAI))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2__R,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Rs2__R,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2__I,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Rs2__I,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2__J,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Rs2__J,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2__K,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Rs2__K,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2__S,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Rs2__S,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2__T,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Rs2__T,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2__U,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Rs2__U,PARAMETRE_D_INVERSION_Rs2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2__V,PARAMETRE_D_INVERSION_Ri2))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Rs2__V,PARAMETRE_D_INVERSION_Rs2))); #define INVERSION_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante,carre_du_module) \ CON02(IFLE(carre_du_module \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2`nom_de_la_composante \ ) \ ,DIVZ(valeur_de_la_composante \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2`nom_de_la_composante \ ) \ ,IFINof(carre_du_module \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Ri2`nom_de_la_composante \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion_Rs2`nom_de_la_composante \ ) \ ,DIVZ(valeur_de_la_composante \ ,carre_du_module \ ) \ ,valeur_de_la_composante \ ) \ /* Inversion d'une composante {R,I,J,K,S,T,U,V} grace a un rayon "Inferieur" et a un rayon */ \ /* "Superieur". Au dessus du rayon "Superieur", la valeur de la composante est conservee. */ \ /* Entre le rayon "Inferieur" et le rayon "Superieur", la composante subit une inversion */ \ /* par rapport a l'hyper-hyper-sphere unite. Enfin, en dessous du rayon "Inferieur", la */ \ /* composante subit une inversion "etrange"... */ DEFV(Common,DEFV(Logical,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire,VRAI))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_A__R,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_B__R,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_A__I,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_B__I,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_A__J,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_B__J,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_A__K,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_B__K,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_A__S,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_B__S,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_A__T,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_B__T,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_A__U,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_B__U,FZERO))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_A__V,FDEUX))); DEFV(Common,DEFV(Float,ZINT(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_B__V,FZERO))); #define TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(nom_de_la_composante,valeur_de_la_composante) \ AXPB(gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_A`nom_de_la_composante \ ,valeur_de_la_composante \ ,gF_ITERATION_DANS_HHC_____transformer__suite_point__transformation_lineaire_B`nom_de_la_composante \ ) \ /* Transformation lineaire d'une composante {R,I,J,K,S,T,U,V}. */ #define gF_ITERATION_DANS_HHC__INITIALISATIONS_DIVERSES \ Bblock \ BLOC(VIDE;); \ Eblock \ /* Introduit le 20210206174951... */ #define gF_ITERATION_DANS_HHC(test_d_arret,initialisation_point_courant,init_iteration,calculs_communs,fonc_iteration,fin_iteration) \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ /* */ \ /* L'argument 'fin_iteration' a ete introduit le 20150225152454... */ \ Bblock \ INITIALISATION_TRANSFORMATION; \ /* Au cas ou une rotation tridimensionnelle serait demandee... */ \ \ BLOC(initialisation_point_courant); \ /* Le "point_courant" 'C' est a priori le point courant {X,Y} sur le maillage de l'image. */ \ \ BLOC(init_iteration); \ /* Initialisation de la suite des nombres hyper-hyper-complexes sur le "point_courant", */ \ /* soit : */ \ /* */ \ /* O = 0 */ \ /* 0 */ \ /* */ \ /* ou : */ \ /* */ \ /* O = C */ \ /* 0 */ \ /* */ \ /* et, initialisation du compteur des iterations. */ \ \ Tant(IFET(test_d_arret \ ,PAS_ASSEZ_D_ITERATIONS \ ) \ ) \ Bblock \ Test(IL_FAUT(gF_ITERATION_DANS_HHC_____transformer__suite_point)) \ Bblock \ Repe(gF_ITERATION_DANS_HHC_____transformer__suite_point__nombre_repetitions) \ Bblock \ Test(IL_FAUT(gF_ITERATION_DANS_HHC_____transformer__suite_point__repliement)) \ Bblock \ DEFV(hyper_hyper_complexe,suite_point_manoeuvre); \ \ HHCinitialisation(suite_point_manoeuvre \ ,REPLIEMENT_D_UNE_COMPOSANTE(_R,HHReelle(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_I,HHImaginaire(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_J,HHJmaginaire(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_K,HHKmaginaire(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_S,HHSmaginaire(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_T,HHTmaginaire(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_U,HHUmaginaire(suite_point)) \ ,REPLIEMENT_D_UNE_COMPOSANTE(_V,HHVmaginaire(suite_point)) \ ); \ /* On notera que les composantes s'appellent {_R,_I,_J,_K,_S,_T,_U,_V}, alors qu'il aurait */ \ /* ete evidemment plus logique de les appeler {R,I,J,K,S,T,U,V}. Le probleme vient du fait */ \ /* que le symbole 'I' est defini ('v $xil/defi_K1$vv$DEF .define...I.') et ne peut donc */ \ /* etre utilise ici... */ \ HHCegal(suite_point,suite_point_manoeuvre); \ /* Repliement de 'suite_point'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion)) \ Bblock \ DEFV(Float,INIT(module2__suite_point,HHCmodule2(suite_point))); \ DEFV(hyper_hyper_complexe,suite_point_manoeuvre); \ \ HHCinitialisation(suite_point_manoeuvre \ ,INVERSION_D_UNE_COMPOSANTE(_R,HHReelle(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_I,HHImaginaire(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_J,HHJmaginaire(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_K,HHKmaginaire(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_S,HHSmaginaire(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_T,HHTmaginaire(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_U,HHUmaginaire(suite_point),module2__suite_point) \ ,INVERSION_D_UNE_COMPOSANTE(_V,HHVmaginaire(suite_point),module2__suite_point) \ ); \ HHCegal(suite_point,suite_point_manoeuvre); \ /* Inversion de 'suite_point'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(gF_ITERATION_DANS_HHC_____transformer__suite_point__inversion)) \ Bblock \ DEFV(hyper_hyper_complexe,suite_point_manoeuvre); \ \ HHCinitialisation(suite_point_manoeuvre \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_R,HHReelle(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_I,HHImaginaire(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_J,HHJmaginaire(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_K,HHKmaginaire(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_S,HHSmaginaire(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_T,HHTmaginaire(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_U,HHUmaginaire(suite_point)) \ ,TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE(_V,HHVmaginaire(suite_point)) \ ); \ HHCegal(suite_point,suite_point_manoeuvre); \ /* Transformation lineaire de 'suite_point'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ERep \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ BLOC(calculs_communs); \ \ INCR(nombre_courant_d_iterations,I); \ \ BLOC(fonc_iteration); \ /* Puis : */ \ /* */ \ /* 2 */ \ /* O + C */ \ /* n */ \ /* */ \ /* ou : */ \ /* */ \ /* 2 */ \ /* O + A */ \ /* n */ \ /* */ \ \ Test(IL_FAUT(gF_ITERATION_DANS_HHC_____replier_l_espace)) \ Bblock \ DEFV(hyper_hyper_complexe,suite_point_manoeuvre); \ \ aHHCmodulo(suite_point_manoeuvre \ ,suite_point \ ,gF_ITERATION_DANS_HHC_____Rorigine__ \ ,gF_ITERATION_DANS_HHC_____Rextremite \ ,gF_ITERATION_DANS_HHC_____Iorigine__ \ ,gF_ITERATION_DANS_HHC_____Iextremite \ ,gF_ITERATION_DANS_HHC_____Jorigine__ \ ,gF_ITERATION_DANS_HHC_____Jextremite \ ,gF_ITERATION_DANS_HHC_____Korigine__ \ ,gF_ITERATION_DANS_HHC_____Kextremite \ ,gF_ITERATION_DANS_HHC_____Sorigine__ \ ,gF_ITERATION_DANS_HHC_____Sextremite \ ,gF_ITERATION_DANS_HHC_____Torigine__ \ ,gF_ITERATION_DANS_HHC_____Textremite \ ,gF_ITERATION_DANS_HHC_____Uorigine__ \ ,gF_ITERATION_DANS_HHC_____Uextremite \ ,gF_ITERATION_DANS_HHC_____Vorigine__ \ ,gF_ITERATION_DANS_HHC_____Vextremite \ ); \ /* Repliement eventuel de l'espace introduit le 20121103101108... */ \ \ HHCegal(suite_point,suite_point_manoeuvre); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ TEST_D_UNDERFLOW_D_UNE_SUITE_HYPER_HYPER_COMPLEXE(suite_point,iterations_dans_C_HC_HHC_____epsilon); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter */ \ /* des underflows flottants... */ \ Eblock \ ETan \ \ Test(IL_FAUT(visualisation_arguments_de_sortie)) \ /* Sequence introduite le 20111001084001... */ \ Bblock \ Test(IL_NE_FAUT_PAS(iterations_dans_C_HC_HHC_____memoriser_le_module_plutot_que_les_arguments)) \ Bblock \ EGAL(niveau_courant_precis \ ,LRZ7(ponderation_argumentA1,HHCargumentA1_2PI(suite_point) \ ,ponderation_argumentA2,HHCargumentA2_2PI(suite_point) \ ,ponderation_argumentA3,HHCargumentA3_2PI(suite_point) \ ,ponderation_argumentA4,HHCargumentA4_2PI(suite_point) \ ,ponderation_argumentA5,HHCargumentA5_2PI(suite_point) \ ,ponderation_argumentA6,HHCargumentA6_2PI(suite_point) \ ,ponderation_argumentA7,HHCargumentA7_2PI(suite_point) \ ) \ ); \ EGAL(niveau_courant \ ,GENP(SCAL(niveau_courant_precis \ ,CERCLE_TRIGONOMETRIQUE \ ,BLANC \ ) \ ) \ ); \ Eblock \ ATes \ Bblock \ EGAL(niveau_courant_precis \ ,HHCmodule(suite_point) \ ); \ EGAL(niveau_courant \ ,GENP(SCAL(TRON(niveau_courant_precis \ ,iterations_dans_C_HC_HHC_____minimum_du_module_a_memoriser_plutot_que_les_arguments \ ,iterations_dans_C_HC_HHC_____maximum_du_module_a_memoriser_plutot_que_les_arguments \ ) \ ,SOUS(iterations_dans_C_HC_HHC_____maximum_du_module_a_memoriser_plutot_que_les_arguments \ ,iterations_dans_C_HC_HHC_____minimum_du_module_a_memoriser_plutot_que_les_arguments \ ) \ ,BLANC \ ) \ ) \ ); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Test(IL_NE_FAUT_PAS(iterations_dans_C_HC_HHC_____visualiser_l_appartenance_plutot_que_le_nombre_d_iterations)) \ Bblock \ EGAL(niveau_courant_precis \ ,CASP_Float(nombre_courant_d_iterations) \ ); \ EGAL(niveau_courant \ ,GENP(COND(IL_FAUT(iterations_dans_C_HC_HHC_____renormaliser_le_nombre_d_iterations) \ ,SCAL(nombre_courant_d_iterations \ ,nombre_maximal_d_iterations \ ,BLANC \ ) \ ,nombre_courant_d_iterations \ ) \ ) \ ); \ /* Visualisation du nombre d'iterations... */ \ Eblock \ ATes \ Bblock \ EGAL(niveau_courant_precis \ ,COND(PAS_ASSEZ_D_ITERATIONS \ ,fNON_APPARTENANCE_A_L_ENSEMBLE \ ,fAPPARTENANCE_A_L_ENSEMBLE \ ) \ ); \ EGAL(niveau_courant \ ,COND(PAS_ASSEZ_D_ITERATIONS \ ,NON_APPARTENANCE_A_L_ENSEMBLE \ ,APPARTENANCE_A_L_ENSEMBLE \ ) \ ); \ /* Visualisation de la non appartenance ('NOIR') et de l'appartenance ('BLANC'). */ \ Eblock \ ETes \ Eblock \ ETes \ /* Calcul du niveau du point. */ \ \ RANGEMENT_DU_NIVEAU_COURANT_ET_EVENTUELLEMENT_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; \ /* Et enfin, marquage du point courant. */ \ \ BLOC(fin_iteration); \ /* Cette possibilite a ete introduite le 20150225152454... */ \ Eblock DEFV(Common,DEFV(Logical,ZINT(F_ITERATION_DANS_HHC_____compatibilite_20110825,FAUX))); /* Introduit le 20110825111448 car, en effet pour le calcul du carre, les methodes */ /* 'HHCproduit(...)' et 'HHCpuissance(...)' ne donnent evidemment le meme resultat que */ /* si le produit theorique est utilise. Dans le cas contraire, on a : */ /* */ /* 2 */ /* o # 1.o.o */ /* */ /* ce que j'avais neglige dans un premier temps. Voici un petit exemple obtenu lors du */ /* calcul du deuxieme point de 'v $xiirc/MANE.D1.2' avec '$xrc/mandel.81$x' et les */ /* parametres suivants : */ /* */ /* J=0.8 */ /* K=0 */ /* xbg=-0.04403889 xhd=-0.03475372 */ /* ybg=-0.36672577 yhd=-0.35744060 */ /* */ /* Soit donc l'octonion 'o1' dont on veut calculer le carre ('o') : */ /* */ /* o1 = (-0.045705,-0.366726,+0.800000,0,0,0,0,0) */ /* */ /* Dans le cas "produit_theorique=VRAI", on a : */ /* */ /* avec 'HHCproduit(...)' : */ /* */ /* o = (-0.772399,+0.033522,-0.073128,0,0,0,0,0) ==== */ /* | */ /* avec 'HHCpuissance(...)' : | */ /* | */ /* o_cumul_multiplicatif = (+1.000000, 0.000000, 0.000000,0,0,0,0,0) | */ /* o_cumul_multiplicatif = (-0.045705,-0.366726,+0.800000,0,0,0,0,0) | */ /* o_cumul_multiplicatif = (-0.772399,+0.033522,-0.073128,0,0,0,0,0) | */ /* o = (-0.772399,+0.033522,-0.073128,0,0,0,0,0) ==== */ /* */ /* ce qui donne bien le meme resultat ("=") 'o' pour le carre... */ /* */ /* Dans le cas "produit_non_theorique=VRAI", on a : */ /* */ /* avec 'HHCproduit(...)' : */ /* */ /* o = (-0.042562,-0.097115,-0.079080,0,0,0,0,0) #### */ /* | */ /* avec 'HHCpuissance(...)' : | */ /* | */ /* o_cumul_multiplicatif = (+1.000000, 0.000000, 0.000000,0,0,0,0,0) | */ /* o_cumul_multiplicatif = (-0.188844,+0.288948,+0.114547,0,0,0,0,0) | */ /* o_cumul_multiplicatif = (-0.000061,-0.000033,-0.000087,0,0,0,0,0) | */ /* o = (-0.000061,-0.000033,-0.000087,0,0,0,0,0) #### */ /* */ /* ce qui donne deux valeurs differentes ("#") 'o' pour le carre... */ #define F_ITERATION_DANS_HHC(test_d_arret,init_iteration,fonc_iteration,exposant,fin_iteration) \ /* Sequence de calcul de la valeur a donner au point courant {X,Y}. */ \ /* */ \ /* Le parametre 'exposant' a ete introduit le 20110824071959... */ \ /* */ \ /* L'argument 'fin_iteration' a ete introduit le 20150225152454... */ \ Bblock \ Test(IFET(IL_FAUT(F_ITERATION_DANS_HHC_____compatibilite_20110825),IFNE(exposant,FDEUX))) \ /* Le parametre 'exposant' est passe de 'Int' a 'Float' le 20110829152111... */ \ Bblock \ PRINT_ATTENTION("la compatibilite 20110825 des iterations hyper-hyper-complexes impose le second degre"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ gF_ITERATION_DANS_HHC(test_d_arret \ ,BLOC(Bblock \ INITIALISATION_DU_POINT_COURANT_DANS_HHC; \ Eblock \ ) \ ,BLOC(init_iteration); \ ,BLOC(Bblock \ Test(IL_NE_FAUT_PAS(F_ITERATION_DANS_HHC_____compatibilite_20110825)) \ Bblock \ aHHCpuissance(point_manoeuvre,suite_point,exposant); \ /* Calculons : */ \ /* */ \ /* 2 */ \ /* O */ \ /* n */ \ /* */ \ /* a priori (mais cela peut etre inutile dans certains cas...). */ \ /* */ \ /* ATTENTION, rappelons que le produit de deux octonions n'est pas commutatif, ce qui */ \ /* heureusement ici n'a pas d'importance puisque le produit ici calcule est un carre... */ \ /* */ \ /* Le 20110824071959 : */ \ /* */ \ /* HHCproduit(point_manoeuvre,suite_point,suite_point); */ \ /* */ \ /* a ete remplace par : */ \ /* */ \ /* HHCpuissance(point_manoeuvre,suite_point,exposant); */ \ /* */ \ /* ou 'exposant' sera assez souvent egal a 'ZERO'. Mais afin de garantir la compatibilite */ \ /* anterieure, meme la ou il est evident que 'ZERO' serait correct (et optimiserait les */ \ /* calculs), en fait 'DEUX' sera utilise... */ \ /* */ \ /* On lira avec interet le commentaire 'v $ximcf/iterations$FON 20110826090921' qui porte */ \ /* sur les quaternions et s'applique evidemment aux octonions. Il dit en substance que */ \ /* generer une fractale pour laquelle les composantes {J,K,S,T,U,V} sont nulles sauf l'une */ \ /* d'entre-elles (par exemple 'J') donnera le meme resultat si l'on donne la valeur de 'J' */ \ /* a une autre composante (par exemple 'T') en annulant 'J' evidemment... */ \ Eblock \ ATes \ Bblock \ aHHCproduit(point_manoeuvre,suite_point,suite_point); \ /* Possibilite introduite le 20110825111448... */ \ Eblock \ ETes \ Eblock \ ) \ ,BLOC(fonc_iteration); \ ,BLOC(fin_iteration); \ /* Cette possibilite a ete introduite le 20150225152454... */ \ ); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E S U I T E Q U E L C O N Q U E */ /* D A N S L ' E S P A C E H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #define BVARIABLES_F_ITERATION_QUELCONQUE_DANS_HHC \ /* Definition des variables communes a toutes les fonctions calculant une suite quelconque */ \ /* dans l'espace Hyper-Complexe. */ \ BVARIABLES_D_HOMOTHETIE_C_HC_HHC \ /* "Taille" reelle et imaginaire de la fenetre rapportee a la taille des images. */ \ DEFV(hyper_hyper_complexe,point_courant); \ /* Point hyper-complexe courant 'C' dans la fenetre. */ #define F_ITERATION_QUELCONQUE_DANS_HHC(premiere_iteration_absolue,premiere_iteration_effective,initialisation,iteration,test_defaut) \ Bblock \ DEFV(Int,INIT(numero_de_l_iteration,UNDEF)); \ /* Indice 'n' de la suite 'X'... */ \ DEFV(hyper_hyper_complexe,element_courant_de_la_suite_Pn); \ /* Element courant Z de la suite. */ \ /* n */ \ BLOC(initialisation); \ /* Initialisation de la suite definissant le systeme dynamique... */ \ \ DoIn(numero_de_l_iteration \ ,premiere_iteration_effective \ ,LSTX(premiere_iteration_absolue,nombre_d_iterations) \ ,I \ ) \ Bblock \ BLOC(iteration); \ /* Calcul du systeme dynamique par iteration du calcul de la suite... */ \ \ Test(IL_FAUT(test_defaut)) \ Bblock \ TEST_D_UNDERFLOW_D_UNE_SUITE_HYPER_HYPER_COMPLEXE(element_courant_de_la_suite_Pn \ ,iterations_dans_C_HC_HHC_____epsilon \ ); \ /* Lorsqu'une composante devient trop petite, on l'annule afin d'eviter */ \ /* des underflows flottants... */ \ TEST_D_OVERFLOW_D_UNE_SUITE_HYPER_HYPER_COMPLEXE(element_courant_de_la_suite_Pn,RACX(F_INFINI)); \ /* Lorsqu'une composante devient trop grande, on la plafonne afin d'eviter des underflows */ \ /* flottants. On notera l'utilisation de 'RACX(...)' pour prendre en compte l'elevation au */ \ /* carre lors de l'eventuelle iteration suivante... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Eblock \ EDoI \ \ storeHJ_point(element_courant_de_la_suite_Pn \ ,imageR \ ,X,Y \ ); \ /* Generation de l'image "hyper_hyper_complexe"... */ \ Eblock \ /* Calcul general d'une suite quelconque dans l'espace hyper-complexe... */ /*===================================================================================================================================*/ /* :Debut_listMN_MANDELBROT_OCTONION_11: */ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E M A N D E L B R O T D A N S U N E F E N E T R E */ /* D A N S L ' E S P A C E H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* O = 0 */ /* 0 */ /* */ /* 2 */ /* O = O + C */ /* n+1 n */ /* */ /* (ou 'C' designe le point courant). */ /* */ /* Si |O | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Mandelbrot. */ /* */ /* */ /* Forme generale d'une section tridimensionnelle : */ /* */ /* */ /* : */ /* ++--:: */ /* +++----:::.. */ /* +++++--::... */ /* oooo+o+----::.. */ /* * ooooo++++--::.. */ /* ----:***oooooo++------. --: */ /* ++++++-o*****ooo++++++----+---: */ /* ++o+++o*****ooo+++++++++o+++-::: */ /* ooooo+o********oooooo++o+o++-::::. */ /* +-- -- ooooooo**#***#**oooooooooooo+-----. */ /* ++++--++---- ooooooo######***ooooooooooo++++--:. */ /* o+++++++++++++-o**ooo***####*****o**oooo*oo+++---:: */ /* - o+++++o++++++o*****o**#####********oo*o*oooo+---:: */ /* +ooo+++oo++++++o*******########************ooo+---:: */ /* - +-oooooo+ooooo+++********#########***********ooo----:: */ /* +ooooooooooooo++*******#########************ooo+---: */ /* oooooooooooo+++*******#########************ooo+---: */ /* oooo++oo++++++*******#########************ooo++--: */ /* o+++++o++++- o******#########************ooo+--- */ /* o+++ + o*******########************o++++-: */ /* *******#########*****oo*o**o+---- */ /* ***ooo*########******oooo*oo++--- */ /* oooooo*#*###***ooooooo+o*ooo++ */ /* o+o++*#####****oo++o++. o++ */ /* *#####****o++-- */ /* ####*##oooo++- */ /* #****oo+--- */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_MANDELBROT_OCTONION_11: */ BFonctionP DEFV(Common,DEFV(Float,SINT(Imandelbrot_dans_HHC_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_HHC))); /* Seuil de divergence du carre du module d'un nombre hyper-hyper-complexe de la suite */ /* dans ce cas particulier... */ DEFV(Common,DEFV(Float,SINT(Imandelbrot_dans_HHC_____exposant,FDEUX))); /* Introduit le 20110824071959... */ /* */ /* Le 20110829143849 l'exposant est passe de 'Int' a 'Float'... */ DEFV(Common,DEFV(Logical,SINT(Imandelbrot_dans_HHC_____charger_____l_etat_initial,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageHHJ,Imandelbrot_dans_HHC_____etat_initial),ADRESSE_NON_ENCORE_DEFINIE))); DEFV(Common,DEFV(Logical,SINT(Imandelbrot_dans_HHC_____sauvegarder_l_etat_final__,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageHHJ,Imandelbrot_dans_HHC_____etat_final__),ADRESSE_NON_ENCORE_DEFINIE))); /* La possibilite de charger et sauvegarder les etats initiaux et finaux a ete */ /* introduit le 20150227205446... */ DEFV(Common,DEFV(FonctionP,POINTERp(Imandelbrot_dans_HHC(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,composante_S ,composante_T ,composante_U ,composante_V ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ,ponderation_argumentA1 ,ponderation_argumentA2 ,ponderation_argumentA3 ,ponderation_argumentA4 ,ponderation_argumentA5 ,ponderation_argumentA6 ,ponderation_argumentA7 ) ) ) ) /* Fonction introduite le 20110802111915... */ DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); DEFV(Argument,DEFV(Float,composante_S)); DEFV(Argument,DEFV(Float,composante_T)); DEFV(Argument,DEFV(Float,composante_U)); DEFV(Argument,DEFV(Float,composante_V)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-hyper-complexe' dans lequel seront definies les */ /* composantes 'HHReelle' et 'HHImaginaire'. Les Arguments 'composante_?' definissent */ /* 'HH?maginaire' (ou '?' represente {J,K,S,T,U,V}). */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentA1)); DEFV(Argument,DEFV(Float,ponderation_argumentA2)); DEFV(Argument,DEFV(Float,ponderation_argumentA3)); DEFV(Argument,DEFV(Float,ponderation_argumentA4)); DEFV(Argument,DEFV(Float,ponderation_argumentA5)); DEFV(Argument,DEFV(Float,ponderation_argumentA6)); DEFV(Argument,DEFV(Float,ponderation_argumentA7)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : une combinaison lineaire des arguments {A1,A2,A3,A4,A5,A6,A7} de */ /* de O lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ /* n */ /* les sept valeurs flottantes etant les ponderations des arguments {A1,A2,A3,A4,A5,A6,A7}. */ /* Cette possibilite fut introduite le 20111001084001... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HHC /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision. */ begin_image Bblock F_ITERATION_DANS_HHC(TEST_DU_CARRE_DU_MODULE_DANS_HHC(Imandelbrot_dans_HHC_____seuil_du_carre_du_module) ,BLOC(Bblock Test(IL_FAUT(Imandelbrot_dans_HHC_____charger_____l_etat_initial)) Bblock HHCegal(suite_point,loadHHJ_point(Imandelbrot_dans_HHC_____etat_initial,X,Y)); Eblock ATes Bblock HHCegal(suite_point,HHC_____octonion__0__0__0__0__0__0__0__0); /* Initialisation de la suite des nombres hyper-hyper-complexes sur l'origine, soit : */ /* */ /* O = 0 */ /* 0 */ /* */ /* On notera que l'on pourrait optimiser, en partant directement sur 'C', mais la difference */ /* entre Julia et Mandelbrot ne serait plus evidente... */ Eblock ETes CLIR(nombre_courant_d_iterations); /* Initialisation du compteur des iterations. */ Eblock ) ,BLOC(Bblock aHHCsomme(suite_point,point_manoeuvre,point_courant); /* Puis : */ /* */ /* 2 */ /* O + C */ /* n */ /* */ /* ou 'C' designe le point hyper-hyper-complexe Courant. */ Eblock ) ,Imandelbrot_dans_HHC_____exposant ,BLOC(Bblock Test(IL_FAUT(Imandelbrot_dans_HHC_____sauvegarder_l_etat_final__)) Bblock storeHHJ_point(suite_point,Imandelbrot_dans_HHC_____etat_final__,X,Y); Eblock ATes Bblock Eblock ETes Eblock ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /* :Debut_listMN_JULIA_OCTONION_11: */ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E J U L I A D A N S U N E F E N E T R E */ /* D A N S L ' E S P A C E H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* O = C */ /* 0 */ /* */ /* (ou 'C' designe le point courant), */ /* */ /* 2 */ /* O = O + A */ /* n+1 n */ /* */ /* (ou 'A' designe un nombre hyper-hyper-complexe */ /* Argument arbitraire). */ /* */ /* Si |O | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Julia */ /* calcule pour le nombre hyper-hyper-complexe 'A'. */ /* */ /* */ /* Forme generale d'une section tridimensionnelle : */ /* */ /* */ /* . ..... */ /* .. .. ---:::: */ /* ......... ..++---- */ /* .......:... :-o++++++ */ /* :.....::---:.. +oooo++++ */ /* ::::::::-+++-::.:::oooooooo+ */ /* :::::::::++++------oooooooo.. */ /* +::::::..+ooo+++++o****oooo.. */ /* ++ ::...ooooo++++*********... */ /* +o +oooo***ooo********............ */ /* +oo +oooooo************............ */ /* +oooooooooooo*########*:::......::. */ /* oooooooooooo#########:::::::::::: */ /* +ooooooo+++#########:::::::::::-: */ /* oooooo++++#######-:::::::::---- */ /* ooo+++++--#####---::::-------- */ /* +++++++--#####--------------+++ */ /* ++++++---#####-------------+++- */ /* +++----####--::--------+++++- */ /* ------###:::::::-----++++++++ */ /* --:####:::::::----++++ooo++ */ /* ::####....:::-+++++ooooo++ */ /* ###### :-+++++ooooooo+ */ /* ####### --+ooo++ooooooo++.. */ /* ######## **oooooooooooooooo+..: */ /* #########oooooooooooo+ooooo+.:::::: */ /* #########**ooooooooooo+:::oo+:::::::: */ /* ***************oooooo+--:::::++::::::. */ /* *********+++-oooooo+++--:::::.+++--:.. */ /* *ooo****o+++--:.o+++++---:::...+---:.. */ /* ooooooooo++- --:.. */ /* +++oooo+. :. */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_JULIA_OCTONION_11: */ BFonctionP DEFV(Common,DEFV(Logical,SINT(Ijulia_dans_HHC_____faire_la_rotation_de__nombre_argument,VRAI))); DEFV(Common,DEFV(Float,SINT(Ijulia_dans_HHC_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_HHC))); /* Seuil de divergence du carre du module d'un nombre hyper-hyper-complexe de la suite */ /* dans ce cas particulier... */ DEFV(Common,DEFV(Float,SINT(Ijulia_dans_HHC_____exposant,FDEUX))); /* Introduit le 20110824071959... */ /* */ /* Le 20110829143849 l'exposant est passe de 'Int' a 'Float'... */ DEFV(Common,DEFV(Float,SINT(Ijulia_dans_HHC_____ponderation_point_argument_A,FU))); DEFV(Common,DEFV(Float,SINT(Ijulia_dans_HHC_____ponderation__point_courant_C,FZERO))); /* Introduit le 20130825092858... */ DEFV(Common,DEFV(Logical,SINT(Ijulia_dans_HHC_____charger_____l_etat_initial,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageHHJ,Ijulia_dans_HHC_____etat_initial),ADRESSE_NON_ENCORE_DEFINIE))); DEFV(Common,DEFV(Logical,SINT(Ijulia_dans_HHC_____sauvegarder_l_etat_final__,FAUX))); DEFV(Common,DEFV(NoMalloc,INIS(DEFV(imageHHJ,Ijulia_dans_HHC_____etat_final__),ADRESSE_NON_ENCORE_DEFINIE))); /* La possibilite de charger et sauvegarder les etats initiaux et finaux a ete */ /* introduit le 20150227205446... */ DEFV(Common,DEFV(FonctionP,POINTERp(Ijulia_dans_HHC(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,composante_S ,composante_T ,composante_U ,composante_V ,ARGUMENT_POINTERs(nombre_argument) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ,ponderation_argumentA1 ,ponderation_argumentA2 ,ponderation_argumentA3 ,ponderation_argumentA4 ,ponderation_argumentA5 ,ponderation_argumentA6 ,ponderation_argumentA7 ) ) ) ) /* Fonction introduite le 20110802111915... */ DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); DEFV(Argument,DEFV(Float,composante_S)); DEFV(Argument,DEFV(Float,composante_T)); DEFV(Argument,DEFV(Float,composante_U)); DEFV(Argument,DEFV(Float,composante_V)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-hyper-complexe' dans lequel seront definies les */ /* composantes 'HHReelle' et 'HHImaginaire'. Les Arguments 'composante_?' definissent */ /* 'HH?maginaire' (ou '?' represente {J,K,S,T,U,V}). */ DEFV(Argument,DEFV(hyper_hyper_complexe,POINTERs(nombre_argument))); /* Nombre hyper-hyper-complexe "generateur" de l'ensemble de Julia que l'on veut calculer. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentA1)); DEFV(Argument,DEFV(Float,ponderation_argumentA2)); DEFV(Argument,DEFV(Float,ponderation_argumentA3)); DEFV(Argument,DEFV(Float,ponderation_argumentA4)); DEFV(Argument,DEFV(Float,ponderation_argumentA5)); DEFV(Argument,DEFV(Float,ponderation_argumentA6)); DEFV(Argument,DEFV(Float,ponderation_argumentA7)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : une combinaison lineaire des arguments {A1,A2,A3,A4,A5,A6,A7} de */ /* de O lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ /* n */ /* les sept valeurs flottantes etant les ponderations des arguments {A1,A2,A3,A4,A5,A6,A7}. */ /* Cette possibilite fut introduite le 20111001084001... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HHC DEFV(hyper_hyper_complexe,point_argument); /* Point hyper-hyper-complexe argument. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision. */ Test(IL_FAUT(Ijulia_dans_HHC_____faire_la_rotation_de__nombre_argument)) Bblock ROTATION_TRIDIMENSIONNELLE_DANS_HHC(point_argument,INDIRECT(nombre_argument)); /* Recuperation du nombre hyper-hyper-complexe "generateur", avec rotation eventuelle. */ Eblock ATes Bblock HHCegal(point_argument,INDIRECT(nombre_argument)); /* Cas ou la rotation de 'nombre_argument' est inhibee... */ Eblock ETes begin_image Bblock F_ITERATION_DANS_HHC(TEST_DU_CARRE_DU_MODULE_DANS_HHC(Ijulia_dans_HHC_____seuil_du_carre_du_module) ,BLOC(Bblock Test(IL_FAUT(Ijulia_dans_HHC_____charger_____l_etat_initial)) Bblock HHCegal(suite_point,loadHHJ_point(Ijulia_dans_HHC_____etat_initial,X,Y)); Eblock ATes Bblock HHCegal(suite_point,point_courant); /* Initialisation de la suite des nombres hyper-hyper-complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* O = C */ /* 0 */ /* */ Eblock ETes EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock DEFV(hyper_hyper_complexe,point_manoeuvre_1); aHHCcombinaison_lineaire_2(point_manoeuvre_1 ,Ijulia_dans_HHC_____ponderation_point_argument_A,point_argument ,Ijulia_dans_HHC_____ponderation__point_courant_C,point_courant ); aHHCsomme(suite_point,point_manoeuvre,point_manoeuvre_1); /* Puis : */ /* */ /* 2 */ /* O + A */ /* n */ /* */ /* ou 'A' designe le point hyper-hyper-complexe Argument. */ /* */ /* Ou plus generalement (introduit le 20130825092858) : */ /* */ /* 2 */ /* O + p .A + p .C */ /* n A C */ /* */ /* avec pA=1 et pC=0 par defaut... */ Eblock ) ,Ijulia_dans_HHC_____exposant ,BLOC(Bblock Test(IL_FAUT(Ijulia_dans_HHC_____sauvegarder_l_etat_final__)) Bblock storeHHJ_point(suite_point,Ijulia_dans_HHC_____etat_final__,X,Y); Eblock ATes Bblock Eblock ETes Eblock ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E V E R H U L S T D A N S U N E F E N E T R E */ /* D A N S L ' E S P A C E H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* O = C */ /* 0 */ /* */ /* (ou 'C' designe le point courant), */ /* */ /* O = R.O .(1 - O ) */ /* n+1 n n */ /* */ /* (ou 'R' designe un nombre reel Argument */ /* arbitraire appele "taux de croissance"). */ /* */ /* Si |O | tend vers l'infini, 'C' */ /* n */ /* n'appartient pas a l'ensemble de Verhulst */ /* calcule pour le nombre reel 'R'. */ /* */ /* */ /* Forme generale : */ /* */ /* */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................#............................... */ /* ...............................###.............................. */ /* ................................#............................... */ /* .........................#.###########.#........................ */ /* ........................#################....................... */ /* ............####.......###################.......####........... */ /* .........##########...#####################...##########........ */ /* ....###..###########..#####################..###########..###... */ /* ################################################################ */ /* ....###..###########..#####################..###########..###... */ /* .........##########...#####################...##########........ */ /* ............####.......###################.......####........... */ /* ........................#################....................... */ /* .........................#.###########.#........................ */ /* ................................#............................... */ /* ...............................###.............................. */ /* ................................#............................... */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* ................................................................ */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Logical,SINT(Iverhulst_dans_HHC_____utiliser_la_forme_la_plus_simple,VRAI))); /* Faut-il utiliser la forme ('VRAI') : */ /* */ /* O = R.O .(1 - O ) */ /* n+1 n n */ /* */ /* ou bien la forme ('FAUX') : */ /* */ /* 2 */ /* O = (R+1).O - R.O */ /* n+1 n n */ /* */ DEFV(Common,DEFV(Float,SINT(Iverhulst_dans_HHC_____seuil_du_carre_du_module,SEUIL_MODULE_DANS_HHC))); /* Seuil de divergence du carre du module d'un nombre hyper-hyper-complexe de la suite */ /* dans le cas particulier du calcul de l'ensemble de Verhulst. */ DEFV(Common,DEFV(FonctionP,POINTERp(Iverhulst_dans_HHC(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,composante_S ,composante_T ,composante_U ,composante_V ,ARGUMENT_POINTERs(taux_de_croissance) ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ,ponderation_argumentA1 ,ponderation_argumentA2 ,ponderation_argumentA3 ,ponderation_argumentA4 ,ponderation_argumentA5 ,ponderation_argumentA6 ,ponderation_argumentA7 ) ) ) ) /* Fonction introduite le 20111129105411... */ DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); DEFV(Argument,DEFV(Float,composante_S)); DEFV(Argument,DEFV(Float,composante_T)); DEFV(Argument,DEFV(Float,composante_U)); DEFV(Argument,DEFV(Float,composante_V)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-hyper-complexe'. */ DEFV(Argument,DEFV(hyper_hyper_complexe,POINTERs(taux_de_croissance))); /* Taux de croissance hyper-hyper-complexe 'R' de l'ensemble de Verhulst que l'on veut */ /* calculer. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentA1)); DEFV(Argument,DEFV(Float,ponderation_argumentA2)); DEFV(Argument,DEFV(Float,ponderation_argumentA3)); DEFV(Argument,DEFV(Float,ponderation_argumentA4)); DEFV(Argument,DEFV(Float,ponderation_argumentA5)); DEFV(Argument,DEFV(Float,ponderation_argumentA6)); DEFV(Argument,DEFV(Float,ponderation_argumentA7)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : une combinaison lineaire des arguments {A1,A2,A3,A4,A5,A6,A7} */ /* de O lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ /* n */ /* les sept valeurs flottantes etant les ponderations des arguments {A1,A2,A3,A4,A5,A6,A7}. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HHC /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision. */ begin_image Bblock F_ITERATION_DANS_HHC(TEST_DU_CARRE_DU_MODULE_DANS_HHC(Iverhulst_dans_HHC_____seuil_du_carre_du_module) ,BLOC(Bblock HHCegal(suite_point,point_courant); /* Initialisation de la suite des nombres hyper-hyper-complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* O = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock Test(IL_FAUT(Iverhulst_dans_HHC_____utiliser_la_forme_la_plus_simple)) Bblock DEFV(hyper_hyper_complexe,point_manoeuvre_1); DEFV(hyper_hyper_complexe,point_manoeuvre_2); /* Points hyper-hyper-complexes de maneuvre lors de l'iteration. */ aHHCforme_lineaire(point_manoeuvre_1,NEGA(FU),suite_point,FU); /* Calcul de : */ /* */ /* 1 - O = -O + 1 */ /* n n */ /* */ aHHCproduit(point_manoeuvre_2,suite_point,point_manoeuvre_1); /* Calcul de : */ /* */ /* O .(1 - O ) */ /* n n */ /* */ /* ATTENTION, rappelons que le produit de deux octonions n'est pas commutatif, ce qui */ /* signifie que : */ /* */ /* O .(1 - O ) # (1 - O ).O */ /* n n n n */ /* */ aHHCproduit(suite_point,INDIRECT(taux_de_croissance),point_manoeuvre_2); /* Calcul de : */ /* */ /* O = R.O .(1 - O ) */ /* n+1 n n */ /* */ /* ATTENTION, rappelons que le produit de deux octonions n'est pas commutatif, ce qui */ /* signifie que : */ /* */ /* R.O # O.R */ /* */ Eblock ATes Bblock DEFV(hyper_hyper_complexe,point_manoeuvre_1); DEFV(hyper_hyper_complexe,point_manoeuvre_2); DEFV(hyper_hyper_complexe,point_manoeuvre_3); DEFV(hyper_hyper_complexe,point_manoeuvre_4); /* Points hyper-hyper-complexes de maneuvre lors de l'iteration. */ aHHCproduit(point_manoeuvre_1,suite_point,suite_point); /* Calcul de : */ /* */ /* 2 */ /* O */ /* n */ /* */ aHHCproduit(point_manoeuvre_2,INDIRECT(taux_de_croissance),point_manoeuvre_1); /* Calcul de : */ /* */ /* 2 */ /* R.O */ /* n */ /* */ aHHCforme_lineaire(point_manoeuvre_3,FU,INDIRECT(taux_de_croissance),FU); /* Calcul de : */ /* */ /* R+1 */ /* */ aHHCproduit(point_manoeuvre_4,point_manoeuvre_3,suite_point); /* Calcul de : */ /* */ /* (R+1).O */ /* n */ /* */ aHHCdifference(suite_point,point_manoeuvre_4,point_manoeuvre_2); /* Calcul de : */ /* */ /* 2 */ /* O = (R+1).O - R.O */ /* n+1 n n */ /* */ Eblock ETes Eblock ) ,EXPOSANT_INUTILE /* Le 20111130114853, je note que cet argument ('DEUX') est inutile ici, de meme que */ /* calcul de 'point_manoeuvre' via 'HHCpuissance(...)'. */ /* */ /* Le 20111130125631, 'DEUX' fut d'ailleurs remplace par 'EXPOSANT_INUTILE'... */ ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E S R A C I N E S N - I E M E S D E L ' U N I T E */ /* D A N S L ' E S P A C E H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iracines_n_iemes_de_l_unite_dans_HHC_____seuil_du_carre_du_module,F_INFINI))); /* Seuil de divergence du carre du module d'un nombre hyper-hyper-complexe de la suite */ /* dans le cas particulier de la recherche des racines n_iemes de l'unite... */ DEFV(Common,DEFV(FonctionP,POINTERp(Iracines_n_iemes_de_l_unite_dans_HHC(imageR ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,composante_S ,composante_T ,composante_U ,composante_V ,exposant ,nombre_maximal_d_iterations ,visualisation_arguments_de_sortie ,ponderation_argumentA1 ,ponderation_argumentA2 ,ponderation_argumentA3 ,ponderation_argumentA4 ,ponderation_argumentA5 ,ponderation_argumentA6 ,ponderation_argumentA7 ) ) ) ) /* Fonction introduite le 20111129105411... */ DEFV(Argument,DEFV(image,imageR)); /* Image resultat a generer. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); DEFV(Argument,DEFV(Float,composante_S)); DEFV(Argument,DEFV(Float,composante_T)); DEFV(Argument,DEFV(Float,composante_U)); DEFV(Argument,DEFV(Float,composante_V)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-hyper-complexe'. */ DEFV(Argument,DEFV(Positive,exposant)); /* Exposant 'N'. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentA1)); DEFV(Argument,DEFV(Float,ponderation_argumentA2)); DEFV(Argument,DEFV(Float,ponderation_argumentA3)); DEFV(Argument,DEFV(Float,ponderation_argumentA4)); DEFV(Argument,DEFV(Float,ponderation_argumentA5)); DEFV(Argument,DEFV(Float,ponderation_argumentA6)); DEFV(Argument,DEFV(Float,ponderation_argumentA7)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : une combinaison lineaire des arguments {A1,A2,A3,A4,A5,A6,A7} */ /* de O lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ /* n */ /* les sept valeurs flottantes etant les ponderations des arguments {A1,A2,A3,A4,A5,A6,A7}. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HHC DEFV(hyper_hyper_complexe,exposant_octonionique_moins_1); /* Exposant complexe moins 1. */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision. */ begin_image Bblock F_ITERATION_DANS_HHC(TEST_DU_CARRE_DU_MODULE_DANS_HHC(Iracines_n_iemes_de_l_unite_dans_HHC_____seuil_du_carre_du_module) ,BLOC(Bblock HHCinitialisation(exposant_octonionique_moins_1 ,FLOT(PRED(exposant)),I0_Octonion,J0_Octonion,K0_Octonion ,S0_Octonion,T0_Octonion,U0_Octonion,V0_Octonion ); /* Conversion complexe de l'exposant moins 1. */ HHCegal(suite_point,point_courant); /* Initialisation de la suite des nombres complexes sur le "point Courant" 'C', */ /* soit : */ /* */ /* O = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(Bblock Test(IZNE(HHCmodule2(suite_point))) Bblock DEFV(hyper_hyper_complexe,point_manoeuvre_1); DEFV(hyper_hyper_complexe,point_manoeuvre_3); DEFV(hyper_hyper_complexe,point_manoeuvre_4); DEFV(hyper_hyper_complexe,point_manoeuvre_5); DEFV(hyper_hyper_complexe,point_manoeuvre_6); DEFV(hyper_hyper_complexe,point_manoeuvre_7); /* Points complexes de maneuvre lors de l'iteration. */ aHHCexponentielle_octonionique(point_manoeuvre_6,suite_point,exposant_octonionique_moins_1); /* Calcul de : */ /* */ /* N-1 */ /* O */ /* n */ /* */ aHHCproduit(point_manoeuvre_7,suite_point,point_manoeuvre_6); /* Calcul de : */ /* */ /* N */ /* O */ /* n */ /* */ aHHCforme_lineaire(point_manoeuvre_1,FLOT(exposant),point_manoeuvre_6,FZERO) /* Calcul de : */ /* */ /* N-1 */ /* N.O */ /* n */ /* */ aHHCdifference(point_manoeuvre_3,point_manoeuvre_7,HHC_____octonion_p1__0__0__0__0__0__0__0); /* Puis de : */ /* */ /* N */ /* O - 1 */ /* n */ /* */ aHHCquotient(point_manoeuvre_4,point_manoeuvre_3,point_manoeuvre_1); /* Puis de : */ /* */ /* N */ /* O - 1 */ /* n */ /* --------- */ /* N-1 */ /* N.O */ /* n */ /* */ aHHCdifference(point_manoeuvre_5,suite_point,point_manoeuvre_4); HHCegal(suite_point,point_manoeuvre_5); /* Puis de : */ /* */ /* N */ /* O - 1 */ /* n */ /* O = O - -------- */ /* n+1 n N-1 */ /* N.O */ /* n */ /* */ Eblock ATes Bblock /* L'origine (0,0) est un point particulier... */ Eblock ETes Eblock ) ,EXPOSANT_INUTILE /* Le 20111130114853, je note que cet argument ('DEUX') est inutile ici, de meme que */ /* calcul de 'point_manoeuvre' via 'HHCpuissance(...)'. */ /* */ /* Le 20111130125631, 'DEUX' fut d'ailleurs remplace par 'EXPOSANT_INUTILE'... */ ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D ' U N P O L Y N O M E V A R I A B L E Q U E L C O N Q U E */ /* D A N S L ' E S P A C E H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la suite : */ /* */ /* O = C */ /* 0 */ /* */ /* O = polynome(O ) */ /* n+1 n */ /* */ /* (ou 'C' designe le point Courant). */ /* */ /* La fonction 'polynome(...)' est definie */ /* par (la translation 't' de l'exposant pouvant */ /* etre negative a compter du 20100316172716) : */ /* */ /* 0+t 1+t p+t */ /* polynome(O) = A .O + A .O + ... + A .O + alpha.A + beta.C */ /* 0 1 p */ /* */ /* (ou 'A' et 'C' designent respectivement un */ /* nombre complexe arbitraire Argument et le */ /* point Courant). Quant a la suite de coefficients */ /* {A0,A1,...,Ap} elle est definie a partir d'un album */ /* d'images (indexe par 'Z' -majuscule-). */ /* */ /* Mais ATTENTION, si cela permet de faire varier */ /* localement le polynome au point {X,Y} on notera */ /* bien que : */ /* */ /* C # X + i.Y + ... */ /* */ /* a priori (les coordonnees {X,Y} sont relatives */ /* a une image, alors que 'C' est dans l'espace */ /* hyper-complexe. Cela signifie que lors d'un changement */ /* de la fenetre de calcul {coin_bas_gauche,coin_haut_droite} */ /* (par zoom et/ou translation), les coefficients {A0,A1,...,Ap} */ /* du polynome, eux, resteront les memes... */ /* */ /* Enfin, on notera deux choix importants possibles : */ /* */ /* {alpha=1,beta=0} : ensemble de type "Julia", */ /* {alpha=0,beta=1} : ensemble de type "Mandelbrot", */ /* */ /* toutes les autres combinaisons etant evidemment */ /* possibles... */ /* */ /* Le 20100210133645 a ete introduite la possibilite de */ /* parametrer localement en {X,Y} et partiellement le produit */ /* non theorique (s'il est active) par {exposa1_Rho,ponder1_A1_,ponder1_A2_,...,ponder1_A7_}. */ /* */ /* */ /* Nota important : */ /* */ /* La definition du polynome, comme la definition */ /* du parametrage du produit non theorique, n'ont */ /* reellement de sens que lorsqu'un seule 'imageR' */ /* est calculee puisque dans le cas contraire, ce */ /* sont les memes definitions qui seront utilisees */ /* pour d'autres images. Pour bien faire, il conviendrait */ /* de les rendre "multidimensionnelles"... */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HHC_____faire_la_rotation_de__nombre_argument_A,VRAI))); /* Introduit le 20100303081954 car, en effet a cette date je me demande si cette rotation */ /* est justifiee, meme si c'est avec elle que les resultats sont les plus spectaculaires... */ DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A1_,VRAI))); DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A2_,VRAI))); DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A3_,VRAI))); DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A4_,VRAI))); DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A5_,VRAI))); DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A6_,VRAI))); DEFV(Common,DEFV(Logical,SINT(Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A7_,VRAI))); /* Introduit le 20100221090225 a cause de 'v $ximcd/operator$FON 20100210182653'... */ DEFV(Common,DEFV(Int,SINT(Iiteration_polynome_variable_quelconque_dans_HHC_____premier_exposant_du_polynome,ZERO))); /* Introduit le 20100316172716 afin de pouvoir des polynomes contenant des puissances */ /* negatives de 'Z'... */ DEFV(Common,DEFV(FonctionP,POINTERp(Iiteration_polynome_variable_quelconque_dans_HHC(imageR ,definition_du_polynome ,definition_de_exposa1_Rho ,definition_de_ponder1_A1_ ,definition_de_ponder1_A2_ ,definition_de_ponder1_A3_ ,definition_de_ponder1_A4_ ,definition_de_ponder1_A5_ ,definition_de_ponder1_A6_ ,definition_de_ponder1_A7_ ,ponderation_du_nombre_argument_A ,ARGUMENT_POINTERs(nombre_argument_A) ,ponderation_du_nombre_courant_C ,ARGUMENT_POINTERs(coin_bas_gauche) ,ARGUMENT_POINTERs(coin_haut_droite) ,composante_J ,composante_K ,composante_S ,composante_T ,composante_U ,composante_V ,nombre_maximal_d_iterations ,seuil_du_carre_du_module ,visualisation_arguments_de_sortie ,ponderation_argumentA1 ,ponderation_argumentA2 ,ponderation_argumentA3 ,ponderation_argumentA4 ,ponderation_argumentA5 ,ponderation_argumentA6 ,ponderation_argumentA7 ) ) ) ) /* Fonction introduite le 20111118211805... */ DEFV(Argument,DEFV(image,imageR)); /* Image Resultat a generer. */ DEFV(Argument,DEFV(albumF,definition_du_polynome)); /* Definition du polynome variable (en {X,Y}) a l'aide d'un album. */ DEFV(Argument,DEFV(imageF,definition_de_exposa1_Rho)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_A1_)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_A2_)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_A3_)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_A4_)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_A5_)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_A6_)); DEFV(Argument,DEFV(imageF,definition_de_ponder1_A7_)); /* Definition du parametrage partiel eventuel du "faux" produit. */ DEFV(Argument,DEFV(Float,ponderation_du_nombre_argument_A)); /* Ponderation du nombre complexe argument 'A'. */ DEFV(Argument,DEFV(hyper_hyper_complexe,POINTERs(nombre_argument_A))); /* Nombre hyper-complexe argument 'A'. */ DEFV(Argument,DEFV(Float,ponderation_du_nombre_courant_C)); /* Ponderation du nombre hyper-complexe courant 'C'. */ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); /* Definition du point situe en bas et a gauche de la fenetre, */ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); /* Definition du point situe en haut et a droite de la fenetre. */ DEFV(Argument,DEFV(Float,composante_J)); DEFV(Argument,DEFV(Float,composante_K)); DEFV(Argument,DEFV(Float,composante_S)); DEFV(Argument,DEFV(Float,composante_T)); DEFV(Argument,DEFV(Float,composante_U)); DEFV(Argument,DEFV(Float,composante_V)); /* Les arguments 'coin_bas_gauche' et 'coin_haut_droite' definissent un sous-espace */ /* bidimensionnel de l'espace hyper-hyper-complexe'. */ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); /* Nombre maximal d'iterations demande. */ DEFV(Argument,DEFV(Float,seuil_du_carre_du_module)); /* Seuil du carre du module definissant l'arret des iterations. */ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); DEFV(Argument,DEFV(Float,ponderation_argumentA1)); DEFV(Argument,DEFV(Float,ponderation_argumentA2)); DEFV(Argument,DEFV(Float,ponderation_argumentA3)); DEFV(Argument,DEFV(Float,ponderation_argumentA4)); DEFV(Argument,DEFV(Float,ponderation_argumentA5)); DEFV(Argument,DEFV(Float,ponderation_argumentA6)); DEFV(Argument,DEFV(Float,ponderation_argumentA7)); /* Cet indicateur logique permet de choisir le type d'information que */ /* l'on va visualiser : une combinaison lineaire des arguments {A1,A2,A3,A4,A5,A6,A7} */ /* de O lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'), */ /* n */ /* les sept valeurs flottantes etant les ponderations des arguments {A1,A2,A3,A4,A5,A6,A7}. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock BVARIABLES_F_ITERATION_DANS_HHC DEFV(hyper_hyper_complexe,nombre_argument_A_apres_transformation_eventuelle); /* Point hyper-complexe argument apres transformation eventuelle... */ /*..............................................................................................................................*/ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; /* Initialisation eventuelle du processus d'extension de la precision. */ Test(IL_FAUT(Iiteration_polynome_variable_quelconque_dans_HHC_____faire_la_rotation_de__nombre_argument_A)) Bblock ROTATION_TRIDIMENSIONNELLE_DANS_HHC(nombre_argument_A_apres_transformation_eventuelle,INDIRECT(nombre_argument_A)); /* Recuperation du nombre hyper-complexe "generateur", avec rotation eventuelle. */ Eblock ATes Bblock HHCegal(nombre_argument_A_apres_transformation_eventuelle,INDIRECT(nombre_argument_A)); /* Cas ou la rotation de 'nombre_argument' est inhibee... */ Eblock ETes begin_image Bblock #define prendre_la_partie_entiere_de_ponder1_A1_ \ Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A1_ #define prendre_la_partie_entiere_de_ponder1_A2_ \ Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A2_ #define prendre_la_partie_entiere_de_ponder1_A3_ \ Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A3_ #define prendre_la_partie_entiere_de_ponder1_A4_ \ Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A4_ #define prendre_la_partie_entiere_de_ponder1_A5_ \ Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A5_ #define prendre_la_partie_entiere_de_ponder1_A6_ \ Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A6_ #define prendre_la_partie_entiere_de_ponder1_A7_ \ Iiteration_polynome_variable_quelconque_dans_HHC_____prendre_la_partie_entiere_de_ponder1_A7_ /* Afin de raccourcir des lignes qui suivent... */ gF_ITERATION_DANS_HHC(TEST_DU_CARRE_DU_MODULE_DANS_HHC(seuil_du_carre_du_module) ,BLOC(Bblock INITIALISATION_DU_POINT_COURANT_DANS_HHC; Eblock ) /* Introduit le 20091012111043... */ ,BLOC(Bblock HHCegal(suite_point,point_courant); /* Initialisation de la suite des nombres hyper-complexes avec : */ /* */ /* O = C */ /* 0 */ /* */ EGAL(nombre_courant_d_iterations,UN); /* Initialisation du compteur des iterations ; ce compteur est initialise */ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ /* valeur non nulle soit rangee... */ Eblock ) ,BLOC(VIDE; ) ,BLOC(Bblock DEFV(hyper_hyper_complexe,puissance_courante); DEFV(hyper_hyper_complexe,polynome_courant); BSaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__exposa1_Rho ,loadF_point(definition_de_exposa1_Rho,X,Y) ); BSaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle1 ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_A1_) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_A1_,X,Y) ) ); BSaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle2 ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_A2_) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_A2_,X,Y) ) ); BSaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle3 ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_A3_) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_A3_,X,Y) ) ); BSaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle4 ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_A4_) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_A4_,X,Y) ) ); BSaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle5 ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_A5_) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_A5_,X,Y) ) ); BSaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle6 ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_A6_) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_A6_,X,Y) ) ); BSaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle7 ,OPC1(IL_FAUT(prendre_la_partie_entiere_de_ponder1_A7_) ,AINT ,NEUT ,loadF_point(definition_de_ponder1_A7_,X,Y) ) ); /* Parametrage partiel eventuel du "faux" produit. On notera que cela n'a d'utilite que */ /* si le produit non theorique est active et alors il n'est utilise que pour l'unique */ /* 'HHCproduit(...)' qui suit... */ aHHCpuissance(puissance_courante ,point_courant ,Iiteration_polynome_variable_quelconque_dans_HHC_____premier_exposant_du_polynome ); aHHCcombinaison_lineaire_2(polynome_courant ,ponderation_du_nombre_argument_A ,nombre_argument_A_apres_transformation_eventuelle ,ponderation_du_nombre_courant_C ,point_courant ); /* Definition du polynome et initialisation avec : */ /* */ /* polynome(O) = alpha.A + beta.C */ /* */ /* */ begin_fuite Bblock DEFV(Float,INIT(coefficient_polynomial,AloadF_point(definition_du_polynome,X,Y,Z))); DEFV(hyper_hyper_complexe,monome_courant); aHHCforme_lineaire(monome_courant,coefficient_polynomial,puissance_courante,FZERO); aHHCsomme(polynome_courant,polynome_courant,monome_courant); /* Calcul iteratif du polynome courant : */ /* */ /* 0 1 p */ /* polynome(O) = A .O + A .O + ... + A .O + alpha.A + beta.C */ /* 0 1 p */ /* */ /* ou 'A(i)' designe la i-ieme page de l'album 'definition_du_polynome'... */ aHHCproduit(puissance_courante,puissance_courante,suite_point); /* Calcul de la puissance courante suivante (Z+1) : */ /* */ /* Z+1 */ /* puissance(O) = O */ /* */ Eblock end_fuite HHCegal(suite_point,polynome_courant); /* Et iteration de la fonction : */ /* */ /* O = polynome(O ) */ /* n+1 n */ /* */ ESaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle7 ); ESaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle6 ); ESaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle5 ); ESaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle4 ); ESaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle3 ); ESaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle2 ); ESaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__ponder1_Angle1 ); ESaveModifyVariable(Float ,FHHCproduit_____avec_le_produit_non_theorique__exposa1_Rho ); /* Parametrage partiel eventuel du "faux" produit. */ Eblock ) ,BLOC(VIDE; ) /* Introduit le 20150225152454... */ ); #undef prendre_la_partie_entiere_de_ponder1_A7_ #undef prendre_la_partie_entiere_de_ponder1_A6_ #undef prendre_la_partie_entiere_de_ponder1_A5_ #undef prendre_la_partie_entiere_de_ponder1_A4_ #undef prendre_la_partie_entiere_de_ponder1_A3_ #undef prendre_la_partie_entiere_de_ponder1_A2_ #undef prendre_la_partie_entiere_de_ponder1_A1_ Eblock end_image RETI(imageR); Eblock EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T E U R D E F O N C T I O N S C A L C U L A N T */ /* U N E F O N C T I O N H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #pragma xcg__gen_ext_Z__gen_Fonction_SE__GENERE__Fonction GENERE__FonctionHHJ_I_FONCTION_HHC POINTERHHJ #define GENERE__FonctionHHJ_I_FONCTION_HHC(nom_et_arguments_de_la_fonction,Nfonction,Vfonction,alpha,beta_,gamma,delta,nom) \ DEFV(FonctionHHJ,POINTERHHJ(nom_et_arguments_de_la_fonction)) \ /* ATTENTION, il ne faut pas ecrire : */ \ /* */ \ /* DEFV(Common,DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction))) */ \ /* */ \ /* puisqu'en effet la directive 'Common' est utilisee lors de l'appel par : */ \ /* */ \ /* DEFV(Common,GENERE__FonctionHHJ_I_FONCTION_HHC(...)) */ \ /* */ \ /* Actuellement cette redondance ne serait pas genante, mais plus tard... */ \ DEFV(Argument,DEFV(imageHHJ,imageR)); \ /* Image Resultat a generer. */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); \ /* Definition du point situe en bas et a gauche de la fenetre, */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); \ /* Definition du point situe en haut et a droite de la fenetre. */ \ DEFV(Argument,DEFV(Float,composante_J)); \ DEFV(Argument,DEFV(Float,composante_K)); \ DEFV(Argument,DEFV(Float,composante_S)); \ DEFV(Argument,DEFV(Float,composante_T)); \ DEFV(Argument,DEFV(Float,composante_U)); \ DEFV(Argument,DEFV(Float,composante_V)); \ /* Composantes complementaires definissant l'espace hyper-hyper-complexe... */ \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ BVARIABLES_F_ITERATION_QUELCONQUE_DANS_HHC \ /*..............................................................................................................................*/ \ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; \ \ begin_image \ Bblock \ DEFV(hyper_hyper_complexe,point_courant_transforme); \ \ INITIALISATION_DU_POINT_COURANT_DANS_HHC; \ /* Initialisation du "point Courant" 'C'. */ \ \ HHCforme_homographique(point_courant_transforme,alpha,point_courant,beta_,gamma,point_courant,delta); \ /* Transformation homographique du "point Courant" 'C'. */ \ \ CALS(Nfonction(point_courant_transforme)); \ /* Application de la transformation... */ \ \ storeHHJ_point(Vfonction \ ,imageR \ ,X,Y \ ); \ /* Generation de l'image "hyper_hyper_complexe"... */ \ Eblock \ end_image \ \ RETIHHJ(imageR); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' cos ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHHJ DEFV(Common,GENERE__FonctionHHJ_I_FONCTION_HHC(IHHJfonction_cosinus_circulaire_dans_HHC( /* Common,DEFV(Fonction,) : \ */ imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_circulaire_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_circulaire_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_circulaire_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_circulaire_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"cos" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' sin ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHHJ DEFV(Common,GENERE__FonctionHHJ_I_FONCTION_HHC(IHHJfonction_sinus_circulaire_dans_HHC( /* Common,DEFV(Fonction,) : \ */ imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_circulaire_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_circulaire_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_circulaire_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_circulaire_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"sin" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' tg ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHHJ DEFV(Common,GENERE__FonctionHHJ_I_FONCTION_HHC(IHHJfonction_tangente_circulaire_dans_HHC( /* Common,DEFV(Fonction,) : \ */ imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_circulaire_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_circulaire_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_circulaire_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_circulaire_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"tg" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' ch ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHHJ DEFV(Common,GENERE__FonctionHHJ_I_FONCTION_HHC(IHHJfonction_cosinus_hyperbolique_dans_HHC( /* Common,DEFV(Fonction,) : \ */ imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_hyperbolique_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_hyperbolique_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_hyperbolique_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_hyperbolique_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"ch" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' sh ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHHJ DEFV(Common,GENERE__FonctionHHJ_I_FONCTION_HHC(IHHJfonction_sinus_hyperbolique_dans_HHC( /* Common,DEFV(Fonction,) : \ */ imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_hyperbolique_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_hyperbolique_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_hyperbolique_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_hyperbolique_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"sh" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' th ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHHJ DEFV(Common,GENERE__FonctionHHJ_I_FONCTION_HHC(IHHJfonction_tangente_hyperbolique_dans_HHC( /* Common,DEFV(Fonction,) : \ */ imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_hyperbolique_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_hyperbolique_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_hyperbolique_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_hyperbolique_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"th" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' exp ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHHJ DEFV(Common,GENERE__FonctionHHJ_I_FONCTION_HHC(IHHJfonction_exponentielle_neperienne_dans_HHC( /* Common,DEFV(Fonction,) : \ */ imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCexponentielle_neperienne /* Common,DEFV(Fonction,) : \ */ ,fFHHCexponentielle_neperienne_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHHCexponentielle_neperienne_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHHCexponentielle_neperienne_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHHCexponentielle_neperienne_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHHCexponentielle_neperienne_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"exp" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHHJ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L A F O N C T I O N ' log ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionHHJ DEFV(Common,GENERE__FonctionHHJ_I_FONCTION_HHC(IHHJfonction_logarithme_dans_HHC( /* Common,DEFV(Fonction,) : \ */ imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHClogarithme /* Common,DEFV(Fonction,) : \ */ ,fFHHClogarithme_____valeur /* Common,DEFV(Fonction,) : \ */ ,fFHHClogarithme_____Halpha /* Common,DEFV(Fonction,) : \ */ ,fFHHClogarithme_____Hbeta_ /* Common,DEFV(Fonction,) : \ */ ,fFHHClogarithme_____Hgamma /* Common,DEFV(Fonction,) : \ */ ,fFHHClogarithme_____Hdelta /* Common,DEFV(Fonction,) : \ */ ,"log" /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionHHJ #undef GENERE__FonctionHHJ_I_FONCTION_HHC /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T E U R D E F O N C T I O N S I T E R A N T */ /* U N E F O N C T I O N H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ #pragma xcg__gen_ext_Z__gen_Fonction_SE__GENERE__Fonction GENERE__FonctionP_I_ITERAT_F_HHC POINTERp #define GENERE__FonctionP_I_ITERAT_F_HHC(nom_et_arguments_de_la_fonction,Nfonction,Vfonction,seuil_du_carre_du_module,czero,vz,fz) \ /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees */ \ /* a la recuperation automatique des fichiers d'arguments ; on trouvera donc : */ \ /* */ \ /* GENERE__FonctionP_FONCTION_C(nom_et_arguments_de_la_fonction,Nfonction,Vfonction) */ \ /* */ \ /* D'autre part, la fonction 'Nfonction' devra etre de nom '__...' afin que son nombre */ \ /* d'arguments ne soit pas verifie ('v $xcg/gen.arg$D/debut$I __f'). */ \ /* */ \ /* Le 20210212153501, l'argument 'czero' qui permet de changer le zero, puis le */ \ /* 20210213103027 ce fut le cas de 'vz' et 'fz' qui definissent respectivement le "Vrai" */ \ /* zero (celui qui correpond au type 'hyper_hyper_complexe' et qui n'est pas modifiable) */ \ /* et le "Faux" zero (celui qui peut etre modifier pour, par exemple, faire "du Mandelbrot" */ \ /* -ou presque- ci-apres...). */ \ DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction)) \ /* ATTENTION, il ne faut pas ecrire : */ \ /* */ \ /* DEFV(Common,DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction))) */ \ /* */ \ /* mais : */ \ /* */ \ /* DEFV(FonctionP,POINTERp(nom_et_arguments_de_la_fonction)) */ \ /* */ \ /* puisqu'en effet la directive 'Common' est utilisee lors de l'appel par : */ \ /* */ \ /* DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HHC(...)) */ \ /* */ \ /* Actuellement cette redondance ne serait pas genante, mais plus tard... */ \ DEFV(Argument,DEFV(image,imageR)); \ /* Image Resultat a generer. */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_bas_gauche))); \ /* Definition du point situe en bas et a gauche de la fenetre, */ \ DEFV(Argument,DEFV(complexe,POINTERs(coin_haut_droite))); \ /* Definition du point situe en haut et a droite de la fenetre. */ \ DEFV(Argument,DEFV(Float,composante_J)); \ DEFV(Argument,DEFV(Float,composante_K)); \ DEFV(Argument,DEFV(Float,composante_S)); \ DEFV(Argument,DEFV(Float,composante_T)); \ DEFV(Argument,DEFV(Float,composante_U)); \ DEFV(Argument,DEFV(Float,composante_V)); \ /* Composantes complementaires definissant l'espace hyper-hyper-complexe... */ \ DEFV(Argument,DEFV(Positive,nombre_maximal_d_iterations)); \ /* Nombre maximal d'iterations demande. */ \ DEFV(Argument,DEFV(Logical,visualisation_arguments_de_sortie)); \ DEFV(Argument,DEFV(Float,ponderation_argumentA1)); \ DEFV(Argument,DEFV(Float,ponderation_argumentA2)); \ DEFV(Argument,DEFV(Float,ponderation_argumentA3)); \ DEFV(Argument,DEFV(Float,ponderation_argumentA4)); \ DEFV(Argument,DEFV(Float,ponderation_argumentA5)); \ DEFV(Argument,DEFV(Float,ponderation_argumentA6)); \ DEFV(Argument,DEFV(Float,ponderation_argumentA7)); \ /* Cet indicateur logique permet de choisir le type d'information que */ \ /* l'on va visualiser : l'argument (c'est-a-dire ATAN(Imaginaire/Reelle)) */ \ /* de O lors de la divergence ('VRAI') ou bien simplement le nombre d'iterations ('FAUX'). */ \ /* n */ \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ BVARIABLES_F_ITERATION_DANS_HHC \ /*..............................................................................................................................*/ \ VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE; \ \ INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC; \ \ gF_ITERATION_DANS_HHC__INITIALISATIONS_DIVERSES; \ \ begin_image \ Bblock \ gF_ITERATION_DANS_HHC(TEST_DU_CARRE_DU_MODULE_DANS_HHC(seuil_du_carre_du_module) \ ,BLOC(Bblock \ INITIALISATION_DU_POINT_COURANT_DANS_HHC; \ Eblock \ ) \ ,BLOC(Bblock \ Test(IL_FAUT(czero)) \ Bblock \ HHCegal(fz,point_courant); \ HHCegal(point_courant,vz); \ /* Introduit le 20210212153501 afin de pouvoir faire quelque chose qui ressemble au calcul */ \ /* de l'ensemble de Mandelbrot en faisant partir l'iteration du point courant au lieu de 0. */ \ /* */ \ /* C'est avec le cosinus hyperbolique 'ch(...)' que l'on s'approche le plus de l'ensemble */ \ /* de Mandelbrot en notant qu'alors c'est la fonction : */ \ /* */ \ /* 1 2 */ \ /* f(Z) = 1 + ---.Z */ \ /* 2 */ \ /* */ \ /* que l'on itere, au lieu de l'habituelle : */ \ /* */ \ /* 2 */ \ /* f(Z) = Z */ \ /* */ \ /* et ce en prenant 'v $ximcd/operator$FON INDICE_MAXIMAL_D_UNE_SERIE_TRIGONOMETRIQUE' */ \ /* egal a 2 evidemment... */ \ Eblock \ ATes \ Bblock \ HHCegal(fz,vz); \ /* A priori, on restaure le Faux zero a partir du Vrai... */ \ Eblock \ ETes \ \ HHCegal(suite_point,point_courant); \ /* Initialisation de la suite des nombres hyper_hyper_complexes sur le "point Courant" 'C', */ \ /* soit : */ \ /* */ \ /* Z = C */ \ /* 0 */ \ /* */ \ EGAL(nombre_courant_d_iterations,UN); \ /* Initialisation du compteur des iterations ; ce compteur est initialise */ \ /* sur 1 et non pas sur 0, afin que meme s'il n'y a pas d'iterations, une */ \ /* valeur non nulle soit rangee... */ \ Eblock \ ) \ ,BLOC(VIDE; \ ) \ ,BLOC(Bblock \ CALS(Nfonction(suite_point)); \ HHCegal(suite_point,Vfonction); \ /* Et iteration de la fonction : */ \ /* */ \ /* Z = Nfonction(Z ) */ \ /* n n */ \ /* */ \ /* en notant qu'il est preferable de ne pas ecrire : */ \ /* */ \ /* HHCegal(suite_point,Nfonction(suite_point)); */ \ /* */ \ /* car cette derniere ecriture, de par la programmation de 'v $ximcd/operator$FON HHCegal', */ \ /* provoquerait deux fois le calcul de la fonction 'Nfonction(suite_point)'... */ \ Eblock \ ) \ ,BLOC(VIDE; \ ) \ ); \ Eblock \ end_image \ \ RETI(imageR); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' cos ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_cosinus_circulaire_dans_HHC_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,DEFV(Logical,SINT(Iiteration_cosinus_circulaire_dans_HHC_____changer_le_zero,FAUX))); /* La possibilite de changer le 'zero' a ete introduit le 20210212153501... */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HHC(Iiteration_cosinus_circulaire_dans_HHC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA1 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA2 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA3 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA4 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA5 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA6 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA7 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_cosinus_circulaire_dans_HHC_____seuil /* Common,DEFV(Fonction,) : \ */ ,Iiteration_cosinus_circulaire_dans_HHC_____changer_le_zero /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ,FgHHCserie_cosinus_____HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' sin ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_sinus_circulaire_dans_HHC_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,DEFV(Logical,SINT(Iiteration_sinus_circulaire_dans_HHC_____changer_le_zero,FAUX))); /* La possibilite de changer le 'zero' a ete introduit le 20210212153501... */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HHC(Iiteration_sinus_circulaire_dans_HHC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA1 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA2 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA3 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA4 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA5 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA6 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA7 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_sinus_circulaire_dans_HHC_____seuil /* Common,DEFV(Fonction,) : \ */ ,Iiteration_sinus_circulaire_dans_HHC_____changer_le_zero /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ,FgHHCserie_sinus_____HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' tg ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_tangente_circulaire_dans_HHC_____seuil,FDEUX))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HHC(Iiteration_tangente_circulaire_dans_HHC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA1 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA2 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA3 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA4 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA5 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA6 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA7 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_circulaire /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_circulaire_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_tangente_circulaire_dans_HHC_____seuil /* Common,DEFV(Fonction,) : \ */ ,FAUX /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' ch ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_cosinus_hyperbolique_dans_HHC_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,DEFV(Logical,SINT(Iiteration_cosinus_hyperbolique_dans_HHC_____changer_le_zero,FAUX))); /* La possibilite de changer le 'zero' a ete introduit le 20210212153501... */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HHC(Iiteration_cosinus_hyperbolique_dans_HHC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA1 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA2 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA3 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA4 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA5 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA6 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA7 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHHCcosinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_cosinus_hyperbolique_dans_HHC_____seuil /* Common,DEFV(Fonction,) : \ */ ,Iiteration_cosinus_hyperbolique_dans_HHC_____changer_le_zero /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ,FgHHCserie_cosinus_hyperbolique_____HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' sh ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_sinus_hyperbolique_dans_HHC_____seuil,FLOT(MILLE)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,DEFV(Logical,SINT(Iiteration_sinus_hyperbolique_dans_HHC_____changer_le_zero,FAUX))); /* La possibilite de changer le 'zero' a ete introduit le 20210212153501... */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HHC(Iiteration_sinus_hyperbolique_dans_HHC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA1 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA2 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA3 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA4 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA5 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA6 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA7 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHHCsinus_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_sinus_hyperbolique_dans_HHC_____seuil /* Common,DEFV(Fonction,) : \ */ ,Iiteration_sinus_hyperbolique_dans_HHC_____changer_le_zero /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ,FgHHCserie_sinus_hyperbolique_____HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' th ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_tangente_hyperbolique_dans_HHC_____seuil,FDEUX))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HHC(Iiteration_tangente_hyperbolique_dans_HHC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA1 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA2 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA3 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA4 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA5 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA6 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA7 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_hyperbolique /* Common,DEFV(Fonction,) : \ */ ,fFHHCtangente_hyperbolique_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_tangente_hyperbolique_dans_HHC_____seuil /* Common,DEFV(Fonction,) : \ */ ,FAUX /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' exp ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_exponentielle_neperienne_dans_HHC_____seuil,FLOT(MILLIARD)))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HHC(Iiteration_exponentielle_neperienne_dans_HHC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA1 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA2 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA3 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA4 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA5 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA6 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA7 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHCexponentielle_neperienne /* Common,DEFV(Fonction,) : \ */ ,fFHHCexponentielle_neperienne_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_exponentielle_neperienne_dans_HHC_____seuil /* Common,DEFV(Fonction,) : \ */ ,FAUX /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N D E L A F O N C T I O N ' log ' H Y P E R - H Y P E R - C O M P L E X E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Iiteration_logarithme_dans_HHC_____seuil,FDEUX))); /* Seuil de divergence du carre du module lors des iterations. */ DEFV(Common,GENERE__FonctionP_I_ITERAT_F_HHC(Iiteration_logarithme_dans_HHC(imageR /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_bas_gauche) /* Common,DEFV(Fonction,) : \ */ ,ARGUMENT_POINTERs(coin_haut_droite) /* Common,DEFV(Fonction,) : \ */ ,composante_J /* Common,DEFV(Fonction,) : \ */ ,composante_K /* Common,DEFV(Fonction,) : \ */ ,composante_S /* Common,DEFV(Fonction,) : \ */ ,composante_T /* Common,DEFV(Fonction,) : \ */ ,composante_U /* Common,DEFV(Fonction,) : \ */ ,composante_V /* Common,DEFV(Fonction,) : \ */ ,nombre_maximal_d_iterations /* Common,DEFV(Fonction,) : \ */ ,visualisation_arguments_de_sortie /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA1 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA2 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA3 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA4 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA5 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA6 /* Common,DEFV(Fonction,) : \ */ ,ponderation_argumentA7 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ,fFHHClogarithme /* Common,DEFV(Fonction,) : \ */ ,fFHHClogarithme_____valeur /* Common,DEFV(Fonction,) : \ */ ,Iiteration_logarithme_dans_HHC_____seuil /* Common,DEFV(Fonction,) : \ */ ,FAUX /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ,HHC_____octonion__0__0__0__0__0__0__0__0 /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : \ */ ) /* Common,DEFV(Fonction,) : */ /* Fonction introduite le 20210206123600... */ EFonctionP #undef GENERE__FonctionP_I_ITERAT_F_HHC #undef TEST_D_OVERFLOW_D_UNE_SUITE_HYPER_HYPER_COMPLEXE #undef TEST_D_UNDERFLOW_D_UNE_SUITE_HYPER_HYPER_COMPLEXE #undef INITIALISATION_DU_POINT_COURANT_DANS_HHC #undef BVARIABLES_F_ITERATION_DANS_HHC #undef ROTATION_TRIDIMENSIONNELLE_DANS_HHC #undef VARIABLES_COMMUNES_DES_ITERATIONS_DANS_C_HC_HHC #undef SEUIL_MODULE_DANS_HHC #undef TEST_DU_CARRE_DU_MODULE_DANS_HHC #undef F_ITERATION_QUELCONQUE_DANS_HHC #undef BVARIABLES_F_ITERATION_QUELCONQUE_DANS_HHC #undef F_ITERATION_DANS_HHC #undef gF_ITERATION_DANS_HHC #undef gF_ITERATION_DANS_HHC__INITIALISATIONS_DIVERSES #undef TRANSFORMATION_LINEAIRE_D_UNE_COMPOSANTE #undef INVERSION_D_UNE_COMPOSANTE #undef PARAMETRE_D_INVERSION_Ri2 #undef PARAMETRE_D_INVERSION_Rs2 #undef REPLIEMENT_D_UNE_COMPOSANTE #undef REPLIEMENT_SINUSOIDAL_D_UNE_COMPOSANTE #undef REPLIEMENT_POLYNOMIAL_D_UNE_COMPOSANTE #undef REPLIEMENT_AFFINE_PAR_MORCEAUX_D_UNE_COMPOSANTE #undef NE_PAS_TESTER_L_UNDERFLOW_ET_L_OVERFLOW #undef TESTER_L_UNDERFLOW_ET_L_OVERFLOW #undef PAS_ASSEZ_D_ITERATIONS #undef ITERATIONS_DIVERSES_____EXTREMITE #undef ITERATIONS_DIVERSES_____ORIGINE__ #undef ITERATIONS_DIVERSES_____REPLIER_L_ESPACE #undef EXPOSANT_INUTILE #undef BVARIABLES_D_HOMOTHETIE_C_HC_HHC #undef VARIABLES_RELATIVES_A_LA_NECESSITE_D_HOMOTHETIE #undef Y_PLAN_IMAGE_MODULO #undef X_PLAN_IMAGE_MODULO #undef Y_PLAN_IMAGE #undef X_PLAN_IMAGE #undef Y_IMAGE_PLAN #undef X_IMAGE_PLAN #undef Y_COIN_HAUT_DROITE #undef X_COIN_HAUT_DROITE #undef Y_COIN_BAS_GAUCHE #undef X_COIN_BAS_GAUCHE #undef VALIDATION_DE_LA_FENETRE_DE_CALCUL_AVANT_HOMOTHETIE_ET_EDITION_EVENTUELLE #undef RANGEMENT_DU_NIVEAU_COURANT_ET_EVENTUELLEMENT_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC #undef INITIALISATION_EVENTUELLE_DE_L_EXTENSION_DE_LA_PRECISIONS_DES_ITERATIONS_DANS_C_HC_HHC #undef fNON_APPARTENANCE_A_L_ENSEMBLE #undef fAPPARTENANCE_A_L_ENSEMBLE #undef NON_APPARTENANCE_A_L_ENSEMBLE #undef APPARTENANCE_A_L_ENSEMBLE _______________________________________________________________________________________________________________________________________