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