/*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E J U L I A */ /* S U I V A N T U N E E Q U I P O T E N T I E L L E 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 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 : */ /* */ /* */ /* Author of '$xrc/julia.82$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20190321100430). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CL_____MODULE_NON_OPTIMISABLE #define GENERER_LES_GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE #include image_image_CONTOURS_EXT #include maths_compl_fonct_ITERATIONS_EXT #include image_image_QUAD_IMAGE_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E B A S E E T U N I V E R S E L L E S : */ /* */ /*************************************************************************************************************************************/ #define NOMBRE_DE_PERIODES_DE_LA_SIMULATION \ UN \ /* Definition du nombre de periodes pour '$xrq/nucleon.L3$I'. */ #include xrk/attractor.11.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define COMPATIBILITE_20190321 \ FAUX \ /* Permet de proceder a des generations compatibles a celles qui furent effectues */ \ /* anterieurement au 20190321131030. */ #define M_FENETRE_GAUCHE \ PARE(-2.0) #define M_FENETRE_DROITE \ PARE(0.5) #define vM_FENETRE_GAUCHE \ CHANGEMENT_HOMOTHETIQUE_D_ABSCISSE_GAUCHE(M_FENETRE_GAUCHE,M_FENETRE_DROITE) #define vM_FENETRE_DROITE \ CHANGEMENT_HOMOTHETIQUE_D_ABSCISSE_DROITE(M_FENETRE_GAUCHE,M_FENETRE_DROITE) #define M_FENETRE_GD \ SOUS(vM_FENETRE_DROITE,vM_FENETRE_GAUCHE) #define M_FENETRE_BAS \ PARE(-1.25) #define M_FENETRE_HAUT \ PARE(1.25) #define vM_FENETRE_BAS \ CHANGEMENT_HOMOTHETIQUE_D_ORDONNEE_BAS(M_FENETRE_BAS,M_FENETRE_HAUT) #define vM_FENETRE_HAUT \ CHANGEMENT_HOMOTHETIQUE_D_ORDONNEE_HAUT(M_FENETRE_BAS,M_FENETRE_HAUT) #define M_FENETRE_BH \ SOUS(vM_FENETRE_HAUT,vM_FENETRE_BAS) /* Definition de la fenetre de calcul de l'ensemble de Mandelbrot. */ #define M_COMPOSANTE_J \ FZERO #define M_COMPOSANTE_K \ FZERO #define M_COMPOSANTE_S \ FZERO #define M_COMPOSANTE_T \ FZERO #define M_COMPOSANTE_U \ FZERO #define M_COMPOSANTE_V \ FZERO /* Definition des composantes 'J', 'K', 'S', 'T', 'U' et 'V' des octonions pour */ /* l'ensemble de Mandelbrot. */ #define M_NOMBRE_D_ITERATIONS \ QUAR(COULEURS) \ /* Nombre d'iterations demandees pour le calcul de l'ensemble de Mandelbrot. */ #define SEUIL_D_EXTRACTION_DU_CONTOUR \ GENP(MUL2(FLOT(PRED(PRED(PRED(PRED(PRED(MOIT(GRIS_1))))))) \ ,DIVI(FLOT__BLANC,FLOT(M_NOMBRE_D_ITERATIONS)) \ ) \ ) \ /* Seuil d'extraction du contour, c'est-a-dire numero de l'equipotentielle. */ #define E_DEPART_X \ _____cNORMALISE_OX(COND(IL_FAUT(compatibilite_20190321),I_cHOMOTHETIE_Std_OX(Xmin),Xmin)) #define E_DEPART_Y \ _____cNORMALISE_OY(COND(IL_FAUT(compatibilite_20190321),I_cHOMOTHETIE_Std_OY(Ymin),Ymin)) /* Point de depart de l'extraction de l'equipotentielle. */ #define NOMBRE_DE_CONTOURS \ HUIT \ /* Nombre de contours interieurs a l'equipotentielle a extraire pour definir */ \ /* le vrai contour que l'on va suivre ; s'il est nul, on prend directement */ \ /* equipotentielle... */ #define C_DEPART_X \ _____cNORMALISE_OX(COND(IL_FAUT(compatibilite_20190321),I_cHOMOTHETIE_Std_OX(Xcentre),Xcentre)) #define C_DEPART_Y \ _____cNORMALISE_OY(COND(IL_FAUT(compatibilite_20190321),I_cHOMOTHETIE_Std_OY(Ycentre),Ycentre)) /* Point de depart de l'extraction de contour. */ #define CONTOUR \ BLANC \ /* Niveau de marquage du contour... */ #define CALCUL \ ZERO \ /* Lorsque 'sauts_des_calculs' vaut 'CALCUL', l'image courante est */ \ /* generee ; en fait, on ne calcule qu'une image sur 'pas_de_calcul'... */ #define PAS_DE_CALCUL \ PAR0(QUATORZE) \ /* Pour une image calculee, on en saute 'pas_de_calcul'-1 ; ce nombre doit */ \ /* etre pair afin de limiter au maximum les effets de saccades (en marches */ \ /* d'escalier) lors du suivi des obliques du contour. */ #define EDITER_LE_NOMBRE_ARGUMENT_DES_JULIAS \ VRAI \ /* Indique s'il faut editer pour chaque calcul d'un ensemble de Julia l'octonion */ \ /* argument ('VRAI') ou pas ('FAUX'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xrc/ITERATION.11.I" #define GENERATEUR_REEL \ AXPB(M_FENETRE_GD,ASD1(point_courant_extrait,x),vM_FENETRE_GAUCHE) #define GENERATEUR_IMAGINAIRE \ AXPB(M_FENETRE_BH,ASD1(point_courant_extrait,y),vM_FENETRE_BAS) /* Definition du generateur de l'ensemble de Julia. */ #define DEFINE_CONTOUR(logique1,logique2) \ Bblock \ BoIn(niveau,NOIR,SEUIL_D_EXTRACTION_DU_CONTOUR,I) \ Bblock \ EGAL(ITb1(exterieur,INDX(niveau,NOIR)),logique1); \ EGAL(ITb1(interieur,INDX(niveau,NOIR)),logique2); \ Eblock \ EBoI \ BoIn(niveau,SUCC(SEUIL_D_EXTRACTION_DU_CONTOUR),BLANC,I) \ Bblock \ EGAL(ITb1(exterieur,INDX(niveau,NOIR)),logique2); \ EGAL(ITb1(interieur,INDX(niveau,NOIR)),logique1); \ Eblock \ EBoI \ Eblock \ /* Definition de l'interieur et de l'exterieur d'un contour. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S R O T A T I O N S T R I D I M E N S I O N N E L L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E L ' I N T E R P O L A T I O N D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' E N S E M B L E D E J U L I A */ /* S U I V A N T U N E E Q U I P O T E N T I E L L E 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 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 : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Logical,INIT(compatibilite_20190321,COMPATIBILITE_20190321)); /* Permet de proceder a des generations compatibles a celles qui furent effectues */ /* anterieurement au 20190321131030. */ DEFV(CHAR,INIC(POINTERc(nom_imageRM),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageRC),NOM_PIPE)); /* Nom des images resultantes (introduites le 20190417103705). */ DEFV(complexe,M_coin_bas_gauche); DEFV(complexe,M_coin_haut_droite); /* Definition de la fenetre de calcul de l'ensemble de Mandelbrot. */ DEFV(Float,INIT(M_composante_J,M_COMPOSANTE_J)); DEFV(Float,INIT(M_composante_K,M_COMPOSANTE_K)); DEFV(Float,INIT(M_composante_S,M_COMPOSANTE_S)); DEFV(Float,INIT(M_composante_T,M_COMPOSANTE_T)); DEFV(Float,INIT(M_composante_U,M_COMPOSANTE_U)); DEFV(Float,INIT(M_composante_V,M_COMPOSANTE_V)); /* Definition des composantes 'J', 'K', 'S', 'T', 'U' et 'V' des octonions pour */ /* l'ensemble de Mandelbrot. */ DEFV(hyper_hyper_complexe,point_argument); /* Nombre hyper-hyper-complexe generateur des ensembles de Julia. */ DEFV(Positive,INIT(M_nombre_maximal_d_iterations,M_NOMBRE_D_ITERATIONS)); /* Nombre maximal d'iterations a effectuer pour le calcul de l'ensemble de Mandelbrot. */ DEFV(Int,INIT(saut_des_calculs,CALCUL)); /* Permet de ne calculer qu'un ensemble partiel de Mandelbrot sur 'pas_de_calcul'. */ DEFV(Int,INIT(pas_de_calcul,PAS_DE_CALCUL)); /* Pour une image calculee, on en saute 'pas_de_calcul'-1 ; ce nombre doit */ /* etre pair afin de limiter au maximum les effets de saccades (en marches */ /* d'escalier) lors du suivi des obliques du contour. */ DEFV(Logical,INIT(editer_le_nombre_argument_des_julias,EDITER_LE_NOMBRE_ARGUMENT_DES_JULIAS)); /* Indique s'il faut editer pour chaque calcul d'un ensemble de Julia l'octonion */ /* argument ('VRAI') ou pas ('FAUX'). */ DEFV(processus,Pextraction); /* Processus d'extraction du contour. */ DEFV(Logical,DTb1(exterieur,COULEURS)); /* Definition de l'exterieur, */ DEFV(Logical,DTb1(interieur,COULEURS)); /* Et de l'interieur. */ DEFV(pointF_2D,point_de_depart); /* Point de depart de l'extraction de contour. */ DEFV(Logical,INIT(fin_de_contour,FAUX)); /* Afin de connaitre le dernier point du contour, mais on n'y est pas encore... */ DEFV(pointF_2D,point_courant_extrait); /* Point courant extrait du contour dans [0,1]. */ DEFV(genere_p,INIT(niveau_de_marquage_du_contour,CONTOUR)); /* Niveau de marquage du contour extrait. */ DEFV(Logical,INIT(emission_des_points,VRAI)); /* Afin de transmettre les points du contour... */ DEFV(Int,INIT(numero_d_image,PREMIERE_IMAGE_ABSOLUE)); /* Numero de l'image courante (celle-ci n'est pas necessairement generee : voir */ /* le parametre 'PREMIERE_IMAGE'). */ /*..............................................................................................................................*/ Cinitialisation(M_coin_bas_gauche,M_FENETRE_GAUCHE,M_FENETRE_BAS); Cinitialisation(M_coin_haut_droite,M_FENETRE_DROITE,M_FENETRE_HAUT); /* Definition de la fenetre de calcul de l'ensemble de Mandelbrot. */ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20190321=",compatibilite_20190321); /* Argument introduit le 20190321131030... */ GET_ARGUMENT_C("imageRM=""RM=",nom_imageRM); GET_ARGUMENT_C("imageRC=""RC=",nom_imageRC); /* Arguments introduits le 20190417103705... */ GET_ARGUMENT_F("exposantM=",Imandelbrot_dans_HHC_____exposant); GET_ARGUMENT_F("seuilM=",Imandelbrot_dans_HHC_____seuil_du_carre_du_module); GET_ARGUMENT_F("MJ=",M_composante_J); GET_ARGUMENT_F("MK=",M_composante_K); GET_ARGUMENT_F("MS=",M_composante_S); GET_ARGUMENT_F("MT=",M_composante_T); GET_ARGUMENT_F("MU=",M_composante_U); GET_ARGUMENT_F("MV=",M_composante_V); GET_ARGUMENT_L("editer=",editer_le_nombre_argument_des_julias); GET_ARGUMENT_I("saut=",pas_de_calcul); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DES_ITERATIONS_1; GET_ARGUMENT_L("F_ITERATION_DANS_HHC_____compatibilite_20110825=""compatibilite_20110825=" ,F_ITERATION_DANS_HHC_____compatibilite_20110825 ); CONTROLE_DE_L_ARITHMETIQUE_FOLKLORIQUE_DES_NOMBRES_COMPLEXES; CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_HYPER_HYPER_COMPLEXES; ) ); SET_FILTRAGE(ACTIF); /* Afin d'acceder aux listes de substitutions... */ MODIFICATION_LISTE_DE_SUBSTITUTION(BLANC,PRED(PRED(BLANC))); MODIFICATION_LISTE_DE_SUBSTITUTION(PRED(BLANC),PRED(PRED(BLANC))); /* Afin de reserver le blanc pour le contour et les pointilles... */ SUBSTITUTION(L_SUBSTITUTION_VARIABLE); BSaveModifyVariable(Logical,FHHCproduit_____utiliser_la_definition_theorique_du_produit,VRAI); CALS(Imandelbrot_dans_HHC(ImageA1 ,ADRESSE(M_coin_bas_gauche),ADRESSE(M_coin_haut_droite) ,M_composante_J ,M_composante_K ,M_composante_S ,M_composante_T ,M_composante_U ,M_composante_V ,M_nombre_maximal_d_iterations ,FAUX ,FLOT__UNDEF,FLOT__UNDEF,FLOT__UNDEF,FLOT__UNDEF,FLOT__UNDEF,FLOT__UNDEF,FLOT__UNDEF ) ); /* A1 = ensemble de Mandelbrot dont on va extraire une equipotentielle. */ Test(IFEQ_chaine(nom_imageRM,NOM_PIPE)) Bblock Eblock ATes Bblock CALi(Iupdate_image(nom_imageRM,ImageA1)); /* Sauvegarde de l'ensemble de Mandelbrot dans le plan Complexe (introduite le */ /* 20190417103705). */ Eblock ETes ESaveModifyVariable(Logical,FHHCproduit_____utiliser_la_definition_theorique_du_produit); SET_FILTRAGE(INACTIF); DEFINE_CONTOUR(VRAI,FAUX); /* Definition de l'interieur et de l'exterieur du contour... */ Test(IFLE(niveau_de_marquage_du_contour,SUCC(SEUIL_D_EXTRACTION_DU_CONTOUR))) Bblock PRINT_ERREUR("les niveaux de gestion des contours sont incoherents"); Eblock ATes Bblock Test(IZNE(NOMBRE_DE_CONTOURS)) Bblock INITIALISATION_POINT_2D(point_de_depart,E_DEPART_X,E_DEPART_Y); /* Choix du point de depart de l'extraction de l'equipotentielle. */ CALi(Inoir(ImageA2)); /* Nettoyage de l'image ou mettre les contours interieurs. */ CALS(Iextraction_contour(ImageA2 ,ImageA1 ,ADRESSE(point_de_depart) ,exterieur,interieur ,niveau_de_marquage_du_contour ,FAUX,NoProcess ) ); /* A2 = equipotentielle choisie de l'ensemble de Mandelbrot. */ CALS(Imove(ImageA1,ImageA2)); /* A1 = equipotentielle choisie de l'ensemble de Mandelbrot. */ INITIALISATION_POINT_2D(point_de_depart,C_DEPART_X,C_DEPART_Y); /* Choix du point de depart de l'extraction de contour. */ Repe(NOMBRE_DE_CONTOURS) Bblock CALi(Inoir(ImageA2)); /* Nettoyage de l'image ou mettre les contours interieurs. */ CALS(Iextraction_contour(ImageA2 ,ImageA1 ,ADRESSE(point_de_depart) ,exterieur,interieur ,niveau_de_marquage_du_contour ,FAUX,NoProcess ) ); /* A2 = contour courant interieur a l'equipotentielle de l'ensemble de Mandelbrot. */ CALS(Imove(ImageA1,ImageA2)); /* A1 = contour courant interieur a l'equipotentielle de l'ensemble de Mandelbrot (de facon */ /* a extraire le contour interieur du contour courant...). */ Eblock ERep Eblock ATes Bblock Eblock ETes Eblock ETes CALi(Inoir(ImageA3)); /* Nettoyage du futur contour pour le processus 'Pextraction'. */ iPARALLELE(BLOC(INITIALISATION_POINT_2D(point_de_depart,E_DEPART_X,E_DEPART_Y); /* Choix du point de depart de l'extraction de contour. */ CALS(Iextraction_contour(ImageA3 ,ImageA1 ,ADRESSE(point_de_depart) ,exterieur,interieur ,niveau_de_marquage_du_contour ,emission_des_points ,ADRESSE(Pextraction) ) ); Test(IFEQ_chaine(nom_imageRC,NOM_PIPE)) Bblock Eblock ATes Bblock CALi(Iupdate_image(nom_imageRC,ImageA3)); /* Sauvegarde d'une "equipotentielle" de l'ensemble de Mandelbrot dans le plan Complexe */ /* (introduite le 20190417103705). */ Eblock ETes ) ,Pextraction ); /* Envoi en parallele de l'extraction du contour, c'est-a-dire de */ /* l'equipotentielle numero 'SEUIL_D_EXTRACTION_DU_CONTOUR'. */ Tant(EST_FAUX(fin_de_contour)) Bblock RECEIVE_F(Pextraction,ASD1(point_courant_extrait,x)); RECEIVE_F(Pextraction,ASD1(point_courant_extrait,y)); /* Recuperation du point courant du contour, */ RECEIVE_L(Pextraction,fin_de_contour); /* Et de l'indicateur de fin... */ Test(IFOU(IFEQ(saut_des_calculs,CALCUL) ,EST_VRAI(fin_de_contour) ) ) Bblock /* On ne fait les calculs que lorsque 'saut_des_calculs' est nul, ou */ /* bien pour le dernier point (afin de "refermer" le contour). */ gVARIABLES_RELATIVES_A_LA_NECESSITE_D_HOMOTHETIE(VRAI); HHCinitialisation(point_argument ,GENERATEUR_REEL ,GENERATEUR_IMAGINAIRE ,M_composante_J ,M_composante_K ,M_composante_S ,M_composante_T ,M_composante_U ,M_composante_V ); /* Calcul du nombre argument de l'ensemble de Julia courant. */ Test(IL_FAUT(editer_le_nombre_argument_des_julias)) Bblock CAL2(Prin9("image %04d : octonion=(%+.^^^,%+.^^^,%+.^^^,%+.^^^,%+.^^^,%+.^^^,%+.^^^,%+.^^^)\n" ,numero_d_image ,HHReelle(point_argument) ,HHImaginaire(point_argument) ,HHJmaginaire(point_argument) ,HHKmaginaire(point_argument) ,HHSmaginaire(point_argument) ,HHTmaginaire(point_argument) ,HHUmaginaire(point_argument) ,HHVmaginaire(point_argument) ) ); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes EGAL(saut_des_calculs ,MODU(SUCC(saut_des_calculs) ,CALCUL ,PRED(INTE(DIVI(FLOT(pas_de_calcul) ,MAX2(DIVI(FLOT(dimX_BASE),FLOT(dimX)),DIVI(FLOT(dimY_BASE),FLOT(dimY))) ) ) ) ) ); /* Afin de determiner le point suivant de facon "homothetique", c'est-a-dire de facon a ce */ /* que le nombre de points extraits soit a peu pres independant de la taille de l'image... */ INCR(numero_d_image,I); /* Numero de la prochaine image (fictive...) a generer. */ Eblock ETan RETU_Commande; Eblock ECommande