/*************************************************************************************************************************************/
/* */
/* V O Y A G E A U T O U R D E L ' E N S E M B L E D E */
/* M A N D E L B R O T S U I V A N T U N E D E S E S */
/* E Q U I P O T E N T I E L L E A V E C T R A C E D E */
/* L ' E N S E M B L E P A R T I E L D E M A N D E L B R O T */
/* E N 2 D E T E N 3 D , E T D E L ' E N S E M B L E */
/* D E J U L I A A S S O C I E A U P O I N T C O U R A N T : */
/* */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * ** * * * * * ** * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * ** * * * * * ** */
/* * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* */
/* ATTENTION : */
/* */
/* Ce programme, avant le 19970206000000, */
/* ne calculait en fait correctement que */
/* des images au format carre ('Std' par */
/* exemple). Il a fallu introduire les */
/* fonction 'CHANGEMENT_HOMOTHETIQUE...(...)' */
/* pour corriger cette anomalie... */
/* */
/* */
/* Nota : */
/* */
/* On regardera avec profit les images */
/* suivantes : */
/* */
/* v $xiirc/TOUR.C.11.0032 p=$xiP/fractal.21 */
/* */
/* v $xifc/TOUR.10025 p=$xiP/fractal.21 */
/* v $xiac/TOUR.1$R64 p=$xiP/fractal.21 */
/* */
/* qui donne des exemples des visualisations */
/* ainsi realisees. */
/* */
/* */
/* Author of '$xrc/tour.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1988??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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
#include image_image_MONTAGNES_EXT
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 20190321130536. */
#define EDITER_QUELQUES_INFORMATIONS \
FAUX \
/* Faut-il editer quelques informations ('VRAI') ou pas ('FAUX'). Ceci fut introduit le */ \
/* 20060523130825... */
#define FORME_DES_POINTILLES \
PARE(0x0101010101010101) \
/* Vecteurs_____pointilles destines a montrer la position du point courant... */ \
/* */ \
/* Le 20250212141508, il y a eu passage de '0x01010101' a '0x0101010101010101'... */
#define SEUIL \
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 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 MARQUAGE_POINT_COURANT \
BLANC \
/* Pour marquer le point courant... */
#define M_NOMBRE_D_ITERATIONS \
QUAR(COULEURS) \
/* Nombre d'iterations demandees pour le calcul de l'ensemble de Mandelbrot. */
#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. */
/* */
/* Le 20120212101626, les 'I_cHOMOTHETIE_Std_O?(...)'s furent introduits... */
#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. */
/* */
/* Le 20120212101626, les 'I_cHOMOTHETIE_Std_O?(...)'s furent introduits... */
#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 \
QUAD(PAR0(QUATRE)) \
/* 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 DEMI_TAILLE_FENETRE \
PARE(0.10) \
/* Demi taille de la fenetre de calcul de l'ensemble partiel de Mandelbrot. */
#define P_FENETRE_GAUCHE \
SOUS(GENERATEUR_REEL,DEMI_TAILLE_FENETRE)
#define P_FENETRE_DROITE \
ADD2(GENERATEUR_REEL,DEMI_TAILLE_FENETRE)
#define P_FENETRE_BAS \
SOUS(GENERATEUR_IMAGINAIRE,DEMI_TAILLE_FENETRE)
#define P_FENETRE_HAUT \
ADD2(GENERATEUR_IMAGINAIRE,DEMI_TAILLE_FENETRE)
/* Definition de la fenetre de calcul des ensembles partiels de Mandelbrot. */
#define P_NOMBRE_D_ITERATIONS \
COULEURS \
/* Nombre d'iterations demandees pour le calcul des ensembles partiels */ \
/* de Mandelbrot. */
#define NIV01 NOIR_CLIPPING
#define NIV02 SUCC(NIV01)
#define NIV03 SUCC(NIV02)
#define NIV04 SUCC(NIV03)
#define NIV05 SUCC(NIV04)
#define NIV06 SUCC(NIV05)
#define NIV07 SUCC(NIV06)
#define NIV08 SUCC(NIV07)
#define NIV09 SUCC(NIV08)
#define NIV10 SUCC(NIV09)
#define NIV11 SUCC(NIV10)
#define NIV12 SUCC(NIV11)
#define NIV13 SUCC(NIV12)
#define NIV14 SUCC(NIV13)
#define NIV15 SUCC(NIV14)
#define NIV16 SUCC(NIV15)
/* Pour generer la liste de substitution de la montagne... */
#define OMBRES \
VRAI
#define PENOMBRE \
PARE(12.0)
/* Pour */
#define DEPTH \
VRAI
#define MIN_DEPTH_CUEING \
FZERO
/* generer */
#define AVION \
FAUX \
/* la surface */
#define ALIAS \
VRAI \
/* montagneuse. */
#define TRANS_OX \
0.0
#define TRANS_OY \
0.80000
/* Translation de la montagne. */
#define X_SOURCE \
6.4453
#define Y_SOURCE \
2.7343
/* Position de la source lumineuse. */
#define POSITIF \
FU \
/* Modulation du champ de Mandelbrot. */
#define J_FENETRE_GAUCHE \
PARE(-1.0)
#define J_FENETRE_DROITE \
PARE(1.0)
#define vJ_FENETRE_GAUCHE \
CHANGEMENT_HOMOTHETIQUE_D_ABSCISSE_GAUCHE(J_FENETRE_GAUCHE,J_FENETRE_DROITE)
#define vJ_FENETRE_DROITE \
CHANGEMENT_HOMOTHETIQUE_D_ABSCISSE_DROITE(J_FENETRE_GAUCHE,J_FENETRE_DROITE)
#define J_FENETRE_BAS \
PARE(-1.0)
#define J_FENETRE_HAUT \
PARE(1.0)
#define vJ_FENETRE_BAS \
CHANGEMENT_HOMOTHETIQUE_D_ORDONNEE_BAS(J_FENETRE_BAS,J_FENETRE_HAUT)
#define vJ_FENETRE_HAUT \
CHANGEMENT_HOMOTHETIQUE_D_ORDONNEE_HAUT(J_FENETRE_BAS,J_FENETRE_HAUT)
/* Definition de la fenetre de calcul des ensembles de Julia. */
#define J_NOMBRE_D_ITERATIONS \
COND(IZEQ(NOMBRE_DE_CONTOURS),QUAR(COULEURS),COULEURS) \
/* Nombre d'iterations demandees pour le calcul des ensembles de Julia ; */ \
/* ce nombre varie suivant qu'on est a l'exterieur ('QUAR(COULEURS)') */ \
/* ou bien a l'interieur ('COULEURS'). */
#define VISUALISATION_ARGUMENTS_DE_SORTIE \
FAUX \
/* Faut-il visualiser l'argument de sortie ('VRAI') ou les equipotentielles ('FAUX'). */
#define PREMIERE_TRAJECTOIRE \
SUCC(NOIR) \
/* Premier niveau de marquage de la trajectoire, */
#define DERNIERE_TRAJECTOIRE \
PRED(CONTOUR) \
/* Premier niveau de marquage de la trajectoire, */
#include xci/sequence.01.I"
#redefine DERNIERE_IMAGE \
INFINI \
/* Numero de la derniere image a generer : ce parametre permet de s'arreter en cours de */ \
/* route... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#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,PAS_COULEURS) \
Bblock \
EGAL(ITb1(exterieur,INDX(niveau,NOIR)),logique1); \
EGAL(ITb1(interieur,INDX(niveau,NOIR)),logique2); \
Eblock \
EBoI \
BoIn(niveau,SUCC(SEUIL),BLANC,PAS_COULEURS) \
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. */
#define EDITION_D_INFORMATIONS(fonction_d_edition) \
Bblock \
Test(IL_FAUT(editer_quelques_informations)) \
Bblock \
BLOC(fonction_d_edition); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition d'informations si necessaire (introduit le 20060523131245). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D ' U N E S E Q U E N C E S U R L ' E N S E M B L E D E J U L I A : */
/* */
/*************************************************************************************************************************************/
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 20190321130536. */
DEFV(Logical,INIT(editer_quelques_informations,EDITER_QUELQUES_INFORMATIONS));
/* Faut-il editer quelques informations ('VRAI') ou pas ('FAUX'). Ceci fut introduit le */
/* 20060523130825... */
DEFV(Logical,INIT(visualisation_arguments_de_sortie,VISUALISATION_ARGUMENTS_DE_SORTIE));
/* Indicateur de choix entre la visualisation du nombre d'iterations ('FAUX'), */
/* et l'argument de sortie ('VRAI'). */
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(deltaF_2D,translation_montagne);
/* Translation de la surface montagneuse. */
DEFV(pointF_2D,source_lumineuse);
/* Position de la source lumineuse. */
DEFV(complexe,M_coin_bas_gauche);
/* Definition du point situe en bas a gauche de la fenetre courante, */
DEFV(complexe,M_coin_haut_droite);
/* Definition du point situe en haut a droite de la fenetre courante, */
/* pour le calcul de l'ensemble de Mandelbrot. */
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(complexe,P_coin_bas_gauche);
/* Definition du point situe en bas a gauche de la fenetre courante, */
DEFV(complexe,P_coin_haut_droite);
/* Definition du point situe en haut a droite de la fenetre courante, */
/* pour le calcul de l'ensemble partiel de Mandelbrot. */
DEFV(Positive,INIT(P_nombre_maximal_d_iterations,P_NOMBRE_D_ITERATIONS));
/* Nombre maximal d'iterations a effectuer pour le calcul de l'ensemble partiel */
/* de Mandelbrot. */
DEFV(complexe,J_coin_bas_gauche);
/* Definition du point situe en bas a gauche de la fenetre courante, */
DEFV(complexe,J_coin_haut_droite);
/* Definition du point situe en haut a droite de la fenetre courante, */
/* pour le calcul de l'ensemble de Julia. */
DEFV(complexe,point_argument);
/* Nombre complexe generateur. */
DEFV(Positive,INIT(J_nombre_maximal_d_iterations,J_NOMBRE_D_ITERATIONS));
/* Nombre maximal d'iterations a effectuer pour le calcul de l'ensemble de Julia. */
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(forme_des_pointilles,FORME_DES_POINTILLES));
/* Definition des pointilles (introduite le 20240627172938)... */
/* */
/* Le 20250212141508, il y a eu passage de '0x01010101' a '0x0101010101010101'... */
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageRC),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageRE),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageRM),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageRT),NOM_PIPE));
/* Nom des images resultantes. */
DEFV(CHAR,INIT(POINTERc(nom_image),NOM_UNDEF));
/* Nom courant des images. */
DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES));
/* Nombre de chiffres codant le numero des images de la sequence a generer. */
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'). */
gVARIABLES_RELATIVES_A_LA_NECESSITE_D_HOMOTHETIE(VRAI);
/* Introduit le 20091126091346 car, en effet, il manquait en notant que la valeur 'VRAI' */
/* assure la compatibilite anterieure... */
/*..............................................................................................................................*/
EGAL(Z_Buffer_____valeur_initiale,VALEUR_INITIALE_DU_Z_BUFFER_POUR_LES_MONTAGNES);
/* Introduit le 20060414171928... */
EGAL(Imontagnes_precises_____visualiser_la_falaise_avant_de_la_montagne,VRAI);
/* Introduit le 20060523135333... */
GET_ARGUMENTSv(nombre_d_arguments
,BLOC(GET_ARGUMENT_L("Ireduction_moitie_____compatibilite_20030611=""compatibilite_20030611="
,Ireduction_moitie_____compatibilite_20030611
);
GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20061220=""compatibilite_20061220="
,Imontagnes_precises_____compatibilite_20061220
);
/* Introduit le 20061220110846... */
GET_ARGUMENT_L("SX_SY_SZ_____compatibilite_20070416=""compatibilite_20070416="
,SX_SY_SZ_____compatibilite_20070416
);
/* Argument introduit le 20070416155051... */
GET_ARGUMENT_L("compatibilite_20190321=",compatibilite_20190321);
/* Argument introduit le 20190321130536... */
GET_ARGUMENT_L("informations=""editer=",editer_quelques_informations);
GET_ARGUMENT_I("pointilles=",forme_des_pointilles);
/* Argument introduit le 20190321130536... */
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_I("chiffres=",nombre_de_chiffres);
GET_ARGUMENT_C("imageRC=""RC=",nom_imageRC);
GET_ARGUMENT_C("imageRE=""RE=",nom_imageRE);
GET_ARGUMENT_C("imageRM=""RM=",nom_imageRM);
GET_ARGUMENT_C("imageRT=""RT=",nom_imageRT);
GET_ARGUMENT_L("arguments=",visualisation_arguments_de_sortie);
GET_ARGUMENT_I("pas=",pas_de_calcul);
GET_ARGUMENT_F("exposantJ=",Ijulia_dans_C_____exposant);
GET_ARGUMENT_F("exposantM=",Imandelbrot_dans_C_____exposant);
/* Arguments introduits le 20091118121857... */
/* */
/* Le 20100608132608, passage de 'GET_ARGUMENT_I(...)' a 'GET_ARGUMENT_F(...)'. */
GET_ARGUMENT_F("seuilJ=",Ijulia_dans_C_____seuil_du_carre_du_module);
GET_ARGUMENT_F("seuilM=",Imandelbrot_dans_C_____seuil_du_carre_du_module);
/* Arguments introduits le 20091118183857... */
)
);
EGAL(Imontagnes_precises_____inclinaison_de_la_source_lumineuse,FU);
/* Afin de donner une importance maximale a la coordonnee 'Z' de la source... */
Cinitialisation(M_coin_bas_gauche,M_FENETRE_GAUCHE,M_FENETRE_BAS);
Cinitialisation(M_coin_haut_droite,M_FENETRE_DROITE,M_FENETRE_HAUT);
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 vecteurs_____pointilles... */
SUBSTITUTION(L_SUBSTITUTION_VARIABLE);
CALS(Imandelbrot_dans_C(ImageA1
,ADRESSE(M_coin_bas_gauche),ADRESSE(M_coin_haut_droite)
,M_nombre_maximal_d_iterations
,FAUX
)
);
/* Calcul de l'ensemble de Mandelbrot dont on va extraire une equipotentielle. */
SET_FILTRAGE(INACTIF);
CALi(Iupdate_image(nom_imageRM,ImageA1));
/* Et on stocke l'ensemble de Mandelbrot... */
DEFINE_CONTOUR(VRAI,FAUX);
/* Definition de l'interieur et de l'exterieur du contour... */
Test(IFLE(niveau_de_marquage_du_contour,SUCC(SEUIL)))
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
)
);
/* Extraction de l'equipotentielle choisie. */
/* */
/* La valeur 'NoProcess' a ete introduite le 20040619190549... */
CALi(Iupdate_image(nom_imageRE,ImageA2));
/* Et on stocke l'equipotentielle... */
CALS(Imove(ImageA1,ImageA2));
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
)
);
/* Extraction du contour courant interieur a l'equipotentielle. */
/* */
/* La valeur 'NoProcess' a ete introduite le 20040619190549... */
CALS(Imove(ImageA1,ImageA2));
/* De facon a extraire le contour interieur du contour courant... */
Eblock
ERep
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
CALi(Inoir(Image_VERTE));
/* Nettoyage du futur contour pour le processus 'Pextraction', et du */
/* marquage des points ou l'on calcule l'ensemble partiel de Mandelbrot pour le */
/* processus courant (le "pere")... */
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(Image_VERTE
,ImageA1
,ADRESSE(point_de_depart)
,exterieur,interieur
,niveau_de_marquage_du_contour
,emission_des_points
,ADRESSE(Pextraction)
)
);
/* La valeur 'NoProcess' a ete introduite le 20040619190549... */
CALi(Iupdate_image(nom_imageRC,Image_VERTE));
/* Et on stocke le contour... */
)
,Pextraction
);
/* Envoi en parallele de l'extraction du contour, c'est-a-dire de */
/* l'equipotentielle numero 'SEUIL'. */
SKH(UNITE);
/* Definition de l'echelle globale. */
SXH(MOIT(INVE(M_FENETRE_GD)));
/* Definition de l'echelle sur l'axe des 'X'. */
SYH(MOIT(INVE(M_FENETRE_BH)));
/* Definition de l'echelle sur l'axe des 'Y'. */
SZH(UNITE);
/* Definition de l'echelle sur l'axe des 'Z'. */
CALS(FgPO());
/* Retour a l'origine. */
SET_ANTI_ALIASING(FAUX);
SET_COULEURS(NOIR,MARQUAGE_POINT_COURANT);
SET_POINTILLES(PAS_DE_POINTILLES);
WCG(vecteurs_____Gcon_10);
/* Definition du point courant, */
WCG(vecteurs_____Gcon_11);
/* Et */
WCG(vecteurs_____Gcon_12);
/* du cadre */
WCG(vecteurs_____Gcon_13);
/* qui */
WCG(vecteurs_____Gcon_14);
/* l'entoure. */
SXH(UNITE);
/* Definition de l'echelle sur l'axe des 'X'. */
SYH(UNITE);
/* Definition de l'echelle sur l'axe des 'Y'. */
SET_CURSOR(_____cNORMALISE_OX(Xcentre),_____cNORMALISE_OY(Ymin),_____cNORMALISE_OZ(Zmin));
WCG(vecteurs_____Gcon_01);
/* Memorisation du coin bas-gauche. */
SET_CURSOR(_____cNORMALISE_OX(Xmax),_____cNORMALISE_OY(Ymin),_____cNORMALISE_OZ(Zmin));
WCG(vecteurs_____Gcon_02);
/* Memorisation du coin bas-droite. */
SET_CURSOR(_____cNORMALISE_OX(Xmax),_____cNORMALISE_OY(Ycentre),_____cNORMALISE_OZ(Zmin));
WCG(vecteurs_____Gcon_03);
/* Memorisation du coin haut-droite. */
SET_CURSOR(_____cNORMALISE_OX(Xcentre),_____cNORMALISE_OY(Ycentre),_____cNORMALISE_OZ(Zmin));
WCG(vecteurs_____Gcon_04);
/* Memorisation du coin haut-gauche. */
INITIALISATION_ACCROISSEMENT_2D(translation_montagne,TRANS_OX,TRANS_OY);
INITIALISATION_POINT_2D(source_lumineuse,X_SOURCE,Y_SOURCE);
CALS(Iblanc(ImageA2));
/* A2 : texture a appliquer sur la montagne. */
Cinitialisation(J_coin_bas_gauche,J_FENETRE_GAUCHE,J_FENETRE_BAS);
Cinitialisation(J_coin_haut_droite,J_FENETRE_DROITE,J_FENETRE_HAUT);
/* Definition de la fenetre de calcul de l'ensemble de Julia. */
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). */
Test(IFINff(numero_d_image,PREMIERE_IMAGE,DERNIERE_IMAGE))
/* Afin de se positionner dans la sequence... */
Bblock
EDITION_D_INFORMATIONS(BLOC(Bblock
CAL3(Prme2("numero=%0*d",nombre_de_chiffres,numero_d_image));
Eblock
)
);
CALi(Inoir(ImageA));
/* Par pure hygiene... */
Cinitialisation(P_coin_bas_gauche,P_FENETRE_GAUCHE,P_FENETRE_BAS);
Cinitialisation(P_coin_haut_droite,P_FENETRE_DROITE,P_FENETRE_HAUT);
/* Definition de la fenetre de calcul de l'ensemble partiel de Mandelbrot. */
SET_FILTRAGE(ACTIF);
REINITIALISATION_LISTE_DE_SUBSTITUTION;
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 vecteurs_____pointilles... */
SUBSTITUTION(L_SUBSTITUTION_VARIABLE);
EDITION_D_INFORMATIONS(BLOC(Bblock
CAL3(Prme2(" MandelbrotBasGauche={%+.^^^,%+.^^^}"
,Reelle(P_coin_bas_gauche)
,Imaginaire(P_coin_bas_gauche)
)
);
CAL3(Prme2(" MandelbrotHautDroite={%+.^^^,%+.^^^}"
,Reelle(P_coin_haut_droite)
,Imaginaire(P_coin_haut_droite)
)
);
Eblock
)
);
/* Le 20091123123416, le format "^^g" est passe a "^^^" pour plus de souplesse... */
CALS(Imandelbrot_dans_C(ImageG
,ADRESSE(P_coin_bas_gauche),ADRESSE(P_coin_haut_droite)
,P_nombre_maximal_d_iterations
,VISUALISATION_ARGUMENTS_DE_SORTIE
)
);
SUBSTITUTION(L_SUBSTITUTION_01);
/* Afin d'acceder aux listes de substitutions... */
DEMI_FENETRE_BD(ImageA
,ImageG
,COND(IL_NE_FAUT_PAS(VISUALISATION_ARGUMENTS_DE_SORTIE),VRAI,FAUX)
,CALCUL_DU_MAXIMUM_DANS_UNE_DEMI_FENETRE
);
/* Reduction de moitie de l'ensemble partiel de Mandelbrot 2D. */
SET_FILTRAGE(INACTIF);
CALS(Iinit_Z_Buffer());
Test(EST_PAIR(NOIR_CLIPPING))
Bblock
PRINT_ERREUR("mauvaise modification de la liste de substitution liee au clipping vertical");
Eblock
ATes
Bblock
Eblock
ETes
SET_FILTRAGE(ACTIF);
REINITIALISATION_LISTE_DE_SUBSTITUTION;
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV01,NIV02);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV02,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV03,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV04,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV05,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV06,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV07,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV08,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV09,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV10,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV11,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV12,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV13,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV14,NIV16);
MODIFICATION_LISTE_DE_SUBSTITUTION(NIV15,NIV16);
/* Afin d'isoler le niveau de marquage du clipping avant ; en ignorant le */
/* parametrage (OH scandale...), on arrive aux correspondances suivantes : */
/* */
/* 00 --> 00 (NOIR), */
/* 01 --> 02 (NOIR_CLIPPING), */
/* */
/* 02 --> 16 pour les niveaux suivants, */
/* 03 --> 16, */
/* 04 --> 16, */
/* 05 --> 16, */
/* 06 --> 16, */
/* 07 --> 16, */
/* 08 --> 16, */
/* 09 --> 16, */
/* 10 --> 16, */
/* 11 --> 16, */
/* 12 --> 16, */
/* 13 --> 16, */
/* 14 --> 16, */
/* 15 --> 16, */
/* 16 --> 16, */
/* nn --> nn (quel que soit 'nn'), */
/* */
/* puis, a l'aide de 'L_SUBSTITUTION_02' : */
/* */
/* 00 --> 128 (NOIR), */
/* 01 --> 128 (inutilise), */
/* */
/* 02 --> 129 (NOIR_CLIPPING), */
/* 03 --> 129 (inutilise), */
/* */
/* 04 --> 130 (inutilise), */
/* 05 --> 130 (inutilise), */
/* 06 --> 131 (inutilise), */
/* 07 --> 131 (inutilise), */
/* 08 --> 132 (inutilise), */
/* 09 --> 132 (inutilise), */
/* 10 --> 133 (inutilise), */
/* 11 --> 133 (inutilise), */
/* 12 --> 134 (inutilise), */
/* 13 --> 134 (inutilise), */
/* 14 --> 135 (inutilise), */
/* 15 --> 135 (inutilise), */
/* */
/* 16 --> 136, */
/* 17 --> 136 pour les autres niveaux, */
/* */
/* or, on fait ensuite une 'Ireduction_moitie', et le risque c'est que */
/* l'on fasse a l'interieur d'un carre une moyenne du type : */
/* (NOIR+NOIR+NOIR+PREMIER)/4, ou 'PREMIER' designe le premier niveau disponible */
/* pour la montagne (02) ; ici, 'PREMIER' est, apres substitution, egal a 16, la */
/* moyenne vaut donc (0+0+0+16)/4 = 4, ce qui donnera apres la substitution */
/* 'VARIABLE' : 130, qui ne correspond donc pas au niveau de substitution */
/* ni de 'NOIR', ni de 'NOIR_CLIPPING'. Ainsi, les niveaux de la montagne */
/* ne vont pas rentrer en "collision" ni avec 'NOIR', ni avec 'NOIR_CLIPPING'... */
SUBSTITUTION(L_SUBSTITUTION_VARIABLE);
CALS(Imontagnes(ImageR
,POSITIF,ImageG
,ImageA2
,VRAI
,ADRESSE(translation_montagne)
,OMBRES,PENOMBRE,ADRESSE(source_lumineuse),DEPTH,MIN_DEPTH_CUEING
,AVION
,ALIAS
)
);
SET_FILTRAGE(INACTIF);
SET_FILTRAGE(ACTIF);
/* Afin d'acceder aux listes de substitutions... */
SUBSTITUTION(L_SUBSTITUTION_02);
DEMI_FENETRE_BG(ImageA,ImageR,VRAI,CALCUL_DU_MAXIMUM_DANS_UNE_DEMI_FENETRE);
/* Reduction de moitie de l'ensemble partiel de Mandelbrot 3D. */
SET_FILTRAGE(INACTIF);
Cinitialisation(point_argument
,GENERATEUR_REEL
,GENERATEUR_IMAGINAIRE
);
SET_FILTRAGE(ACTIF);
REINITIALISATION_LISTE_DE_SUBSTITUTION;
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 vecteurs_____pointilles... */
SUBSTITUTION(L_SUBSTITUTION_VARIABLE);
EDITION_D_INFORMATIONS(BLOC(Bblock
CAL3(Prme2(" ArgumentJulia={%+.^^^,%+.^^^}"
,Reelle(point_argument)
,Imaginaire(point_argument)
)
);
Eblock
)
);
/* Le 20091123123416, le format "^^g" est passe a "^^^" pour plus de souplesse... */
CALS(Ijulia_dans_C(ImageR
,ADRESSE(J_coin_bas_gauche),ADRESSE(J_coin_haut_droite)
,ADRESSE(point_argument)
,J_nombre_maximal_d_iterations
,visualisation_arguments_de_sortie
)
);
SUBSTITUTION(L_SUBSTITUTION_01);
/* Afin d'acceder aux listes de substitutions... */
DEMI_FENETRE_HG(ImageA
,ImageR
,COND(IL_NE_FAUT_PAS(visualisation_arguments_de_sortie),VRAI,FAUX)
,CALCUL_DU_MAXIMUM_DANS_UNE_DEMI_FENETRE
);
/* Reduction de moitie de l'ensemble de Julia 2D. */
SET_FILTRAGE(INACTIF);
CALi(Iload_image(ImageR,nom_imageRM));
/* Rechargement de la vue globale de Mandelbrot. */
SET_FILTRAGE(ACTIF);
/* Afin d'acceder aux listes de substitutions... */
SUBSTITUTION(L_SUBSTITUTION_01);
DEMI_FENETRE_HD(ImageA,ImageR,VRAI,CALCUL_DU_MAXIMUM_DANS_UNE_DEMI_FENETRE);
/* Reduction de moitie de l'ensemble entier de Mandelbrot avec indication */
/* de la position du point courant. */
SET_FILTRAGE(INACTIF);
CALS(Imove(ImageG,ImageA));
/* Afin de permettre le trace graphique... */
CALS(Iinit_Z_Buffer());
/* Ceci a du etre ajoute le 19970204161048 car, en effet, la fonction 'Imontagnes(...)' */
/* depuis maintenant un certain nombre d'annees gere le 'Z-Buffer'. Or le programme */
/* '$xrc/tour.01$K' n'avait pas ete utilise depuis quelques annees... */
RCG(vecteurs_____Gcon_10);
SET_CURSOR(ADD2(MOIT(ASD1(point_courant_extrait,x)),_____cNORMALISE_OX(Xcentre))
,ADD2(MOIT(ASD1(point_courant_extrait,y)),_____cNORMALISE_OY(Ycentre))
,_____cNORMALISE_OZ(Zmin)
);
/* Et marquage du point ou a lieu le calcul dans la vue globale de l'ensemble */
/* de Mandelbrot. */
WCG(vecteurs_____Gcon_10);
gA;
/* Marquage du point courant. */
MOVE(_lDENORMALISE_OX(DEMI_TAILLE_FENETRE),ZERO,ZERO);
CALS(FgPS());
/* Construction d'une croix. */
MOVE(ZERO,_lDENORMALISE_OY(DEMI_TAILLE_FENETRE),ZERO);
WCG(vecteurs_____Gcon_13);
MOVE(NEGA(_lDENORMALISE_OX(DEMI_TAILLE_FENETRE)),ZERO,ZERO);
CALS(FgPS());
/* Construction d'une croix. */
MOVE(NEGA(_lDENORMALISE_OX(DEMI_TAILLE_FENETRE)),ZERO,ZERO);
WCG(vecteurs_____Gcon_14);
MOVE(ZERO,NEGA(_lDENORMALISE_OY(DEMI_TAILLE_FENETRE)),ZERO);
CALS(FgPS());
/* Construction d'une croix. */
MOVE(ZERO,NEGA(_lDENORMALISE_OY(DEMI_TAILLE_FENETRE)),ZERO);
WCG(vecteurs_____Gcon_11);
MOVE(_lDENORMALISE_OX(DEMI_TAILLE_FENETRE),ZERO,ZERO);
CALS(FgPS());
/* Construction d'une croix. */
MOVE(_lDENORMALISE_OX(DEMI_TAILLE_FENETRE),ZERO,ZERO);
WCG(vecteurs_____Gcon_12);
RCG(vecteurs_____Gcon_11);gA;RCG(vecteurs_____Gcon_12);gB;
RCG(vecteurs_____Gcon_12);gA;RCG(vecteurs_____Gcon_13);gB;
RCG(vecteurs_____Gcon_13);gA;RCG(vecteurs_____Gcon_14);gB;
RCG(vecteurs_____Gcon_14);gA;RCG(vecteurs_____Gcon_11);gB;
/* Petit cadre... */
RCG(vecteurs_____Gcon_01);gA;RCG(vecteurs_____Gcon_02);gB;
RCG(vecteurs_____Gcon_02);gA;RCG(vecteurs_____Gcon_03);gB;
RCG(vecteurs_____Gcon_03);gA;RCG(vecteurs_____Gcon_04);gB;
RCG(vecteurs_____Gcon_04);gA;RCG(vecteurs_____Gcon_01);gB;
/* Grand cadre... */
RCG(vecteurs_____Gcon_11);gA;RCG(vecteurs_____Gcon_01);SET_POINTILLES(forme_des_pointilles);gB;
RCG(vecteurs_____Gcon_12);gA;RCG(vecteurs_____Gcon_02);SET_POINTILLES(forme_des_pointilles);gB;
RCG(vecteurs_____Gcon_13);gA;RCG(vecteurs_____Gcon_03);SET_POINTILLES(forme_des_pointilles);gB;
RCG(vecteurs_____Gcon_14);gA;RCG(vecteurs_____Gcon_04);SET_POINTILLES(forme_des_pointilles);gB;
/* Jonction entre le petit et le grand cadres... */
EGAL(nom_image,chain_Aconcaten2_sauf_nom_pipe(nom_imageR,chain_numero(numero_d_image,nombre_de_chiffres)));
CALi(Iupdate_image(nom_image,ImageG));
CALZ_FreCC(nom_image);
/* Et on stocke l'image... */
EDITION_D_INFORMATIONS(BLOC(Bblock
CALS(Fsauts_de_lignes(UN));
Eblock
)
);
Eblock
ATes
Bblock
Eblock
ETes
store_point(MODU(numero_d_image,PREMIERE_TRAJECTOIRE,DERNIERE_TRAJECTOIRE)
,Image_VERTE
,_cDENORMALISE_OX(ASD1(point_courant_extrait,x)),_cDENORMALISE_OY(ASD1(point_courant_extrait,y))
,FVARIABLE
);
/* Et marquage du point ou a lieu le calcul avec un niveau fonction */
/* du numero de l'image ; cette mise a jour a lieu meme si les calculs */
/* precedents ne sont pas effectues afin que l'image 'nom_imageRT' */
/* soit toujours correcte, meme lorsque l'on fait une reprise... */
INCR(numero_d_image,I);
/* Numero de la prochaine image a generer. */
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... */
Eblock
ETan
CALi(Iupdate_image(nom_imageRT,Image_VERTE));
/* Et on stocke la trajectoire... */
RETU_Commande;
Eblock
ECommande