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