/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N E   C O U R B E   F R A C T A L E   B I D I M E N S I O N N E L L E                          */
/*        D A N S   L E   P L A N   C O M P L E X E  :                                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrc/Cfract_2D.12$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19990812101139).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.11.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*                                                                                    3                                              */
/*        D E F I N I T I O N   D E   L ' E S P A C E   P H Y S I Q U E   D A N S   R     ( D E B U T )  :                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    Les extrema des coordonnees {x,y,z}                                                                            */
/*                  ainsi que ceux de leurs differentielles                                                                          */
/*                  {dx,dy,dz} sont fixees un peu arbitrairement                                                                     */
/*                  et sans etre parametrees.                                                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   hXmin_ESPACE                                                                                                                  \
                    PARE(-1.0)
#define   hYmin_ESPACE                                                                                                                  \
                    PARE(-1.0)
#define   hZmin_ESPACE                                                                                                                  \
                    PARE(-1.0)
                                        /* Definition du "coin" inferieur-gauche-arriere de l'espace physique.                       */

#define   hXmax_ESPACE                                                                                                                  \
                    PARE(1.0)
#define   hYmax_ESPACE                                                                                                                  \
                    PARE(1.0)
#define   hZmax_ESPACE                                                                                                                  \
                    PARE(1.0)
                                        /* Definition du "coin" superieur-droite-avant de l'espace physique.                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*                                                                                    3                                              */
/*        D E F I N I T I O N   D E   L ' E S P A C E   P H Y S I Q U E   D A N S   R     ( D E B U T )  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.12.I"

#define   dXmin_ESPACE                                                                                                                  \
                    PARE(0.0)
#define   dYmin_ESPACE                                                                                                                  \
                    PARE(0.0)
#define   dZmin_ESPACE                                                                                                                  \
                    PARE(0.0)
                                        /* Definition des minima des differentielles {dx,dy,dz}.                                     */
#define   dXmax_ESPACE                                                                                                                  \
                    PARE(1.0)
#define   dYmax_ESPACE                                                                                                                  \
                    PARE(1.0)
#define   dZmax_ESPACE                                                                                                                  \
                    PARE(1.0)
                                        /* Definition des maxima des differentielles {dx,dy,dz}.                                     */

#include  xrk/attractor.1D.I"
                                        /* Formules de renormalisation des differentielles dans [0,1] ; elles sont utilisees lorsque */
                                        /* la production d'images en couleurs est demandee (voir 'visualiser_en_RVB').               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   D U   M O D E   D E   R E P R E S E N T A T I O N   D E S   P O I N T S  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   COLORIER_LES_POINTS_ALEATOIREMENT                                                                                             \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(colorier_les_points_aleatoirement,COLORIER_LES_POINTS_ALEATOIREMENT)));
                                        /* Cet indicateur permet de savoir si les points seront coloriees aleatoirement ('VRAI')     */
                                        /* ou seront representees autrement...                                                       */
#define   COLORIER_LES_POINTS_AVEC_LE_PLAN_COMPLEXE                                                                                     \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(colorier_les_points_avec_le_plan_complexe,COLORIER_LES_POINTS_AVEC_LE_PLAN_COMPLEXE)));
                                        /* Cet indicateur permet de savoir si les points seront coloriees en utilisant certaines     */
                                        /* informations du plan complexe ('VRAI') ou seront representees autrement...                */

#define   COMPOSANTE_ROUGE_PAR_DEFAUT                                                                                                   \
                    BLANC
DEFV(Local,DEFV(genere_p,INIT(composante_ROUGE_par_defaut,COMPOSANTE_ROUGE_PAR_DEFAUT)));
#define   COMPOSANTE_VERTE_PAR_DEFAUT                                                                                                   \
                    BLANC
DEFV(Local,DEFV(genere_p,INIT(composante_VERTE_par_defaut,COMPOSANTE_VERTE_PAR_DEFAUT)));
#define   COMPOSANTE_BLEUE_PAR_DEFAUT                                                                                                   \
                    BLANC
DEFV(Local,DEFV(genere_p,INIT(composante_BLEUE_par_defaut,COMPOSANTE_BLEUE_PAR_DEFAUT)));
                                        /* Introduit le 20151206111701, date avant laquelle on ne pouvait forcer que du 'BLANC'...   */

#define   GENERATION_D_UNE_COMPOSANTE_DE_COULEUR_D_UN_POINT(point,composante,couleur,seuil_inferieur,seuil_superieur,niveau_par_defaut) \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(colorier_les_points_aleatoirement))                                                                    \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(discriminateur                                                                                 \
                                        ,COND(IFEQ(couleur,COMPOSANTE_CHROMATIQUE_ROUGE)                                                \
                                             ,FU                                                                                        \
                                             ,COND(IFEQ(couleur,COMPOSANTE_CHROMATIQUE_VERTE)                                           \
                                                  ,FDEUX                                                                                \
                                                  ,COND(IFEQ(couleur,COMPOSANTE_CHROMATIQUE_BLEUE)                                      \
                                                       ,FTROIS                                                                          \
                                                       ,FLOT__UNDEF                                                                     \
                                                        )                                                                               \
                                                   )                                                                                    \
                                              )                                                                                         \
                                         )                                                                                              \
                              );                                                                                                        \
                                                                                                                                        \
                         EGAL(ASD1(point_courant_de_l_espace_de_parametrage,x)                                                          \
                             ,_cDENORMALISE_OX(MUL2(discriminateur,Reelle(point)))                                                      \
                              );                                                                                                        \
                         EGAL(ASD1(point_courant_de_l_espace_de_parametrage,y)                                                          \
                             ,_cDENORMALISE_OY(MUL2(discriminateur,Imaginaire(point)))                                                  \
                              );                                                                                                        \
                                        /* Cette modification de 'point_courant_de_l_espace_de_parametrage' en fonction du 'point'   */ \
                                        /* est destinee a obtenir toujours les memes couleurs au meme point, ce qui sinon ne serait  */ \
                                        /* pas possible, car, sauf pour les extremites 'Gauche' et 'Droite' du segment de depart,    */ \
                                        /* chaque point calcule est utilise deux fois (une premiere fois en tant que 'Droite', puis  */ \
                                        /* une seconde fois en tant que 'Gauche'). Enfin, l'intervention de 'discriminateur' est     */ \
                                        /* destine a generer des valeurs differentes pour les trois composantes...                   */ \
                                                                                                                                        \
                         GENERATION_D_UNE_VALEUR(composante                                                                             \
                                                ,FLOT(seuil_inferieur)                                                                  \
                                                ,FLOT(seuil_superieur)                                                                  \
                                                 );                                                                                     \
                                        /* Lorsque la composante est aleatoire, on la tire au sort...                                */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(colorier_les_points_avec_le_plan_complexe))                                                       \
                              Bblock                                                                                                    \
                              DEFV(Float,INIT(discriminateur                                                                            \
                                             ,COND(IFEQ(couleur,COMPOSANTE_CHROMATIQUE_ROUGE)                                           \
                                                  ,SCAL(Cargument_2PI(point)                                                            \
                                                       ,CERCLE_TRIGONOMETRIQUE                                                          \
                                                       ,FU                                                                              \
                                                        )                                                                               \
                                                  ,COND(IFEQ(couleur,COMPOSANTE_CHROMATIQUE_VERTE)                                      \
                                                       ,NORM(DIVI(Reelle(z_difference),Cmodule(z_difference))                           \
                                                            ,NEGA(FU)                                                                   \
                                                            ,NEUT(FU)                                                                   \
                                                             )                                                                          \
                                                       ,COND(IFEQ(couleur,COMPOSANTE_CHROMATIQUE_BLEUE)                                 \
                                                            ,NORM(DIVI(Imaginaire(z_difference),Cmodule(z_difference))                  \
                                                                 ,NEGA(FU)                                                              \
                                                                 ,NEUT(FU)                                                              \
                                                                  )                                                                     \
                                                            ,FLOT__UNDEF                                                                \
                                                             )                                                                          \
                                                        )                                                                               \
                                                   )                                                                                    \
                                              )                                                                                         \
                                   );                                                                                                   \
                                                                                                                                        \
                              EGAL(composante                                                                                           \
                                  ,SCAL(discriminateur                                                                                  \
                                       ,FU                                                                                              \
                                       ,FLOT__BLANC                                                                                     \
                                        )                                                                                               \
                                   );                                                                                                   \
                                        /* Lorsque la composante utilise le plan Complexe suivant le code arbitraire :               */ \
                                        /*                                                                                           */ \
                                        /*        ROUGE   : Cargument_2PI(point)                                                     */ \
                                        /*        VERTE   : DIVI(Reelle(z_difference),Cmodule(z_difference))                         */ \
                                        /*        BLEUE   : DIVI(Imaginaire(z_difference),Cmodule(z_difference))                     */ \
                                        /*                                                                                           */ \
                                        /* On notera au passage que pour 'VERTE' et 'BLEUE' il aurait ete bien d'utiliser            */ \
                                        /* 'Cargument_2PI(...)' utilisant le segment a droite et a gauche de 'point' respectivement  */ \
                                        /* mais, malheureusement, ces informations ne sont pas disponibles...                        */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(composante,FLOT(niveau_par_defaut));                                                                 \
                                        /* Dans le dernier cas, on fixe un niveau par defaut (a priori le maximum, soit 'BLANC').    */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(composante                                                                                                     \
                        ,______NORMALISE_NIVEAU(TRON(composante                                                                         \
                                                    ,seuil_inferieur                                                                    \
                                                    ,seuil_superieur                                                                    \
                                                     )                                                                                  \
                                                )                                                                                       \
                         );                                                                                                             \
                                        /* Seuillage de la composante courante. On notera que lorsque la valeur est aleatoire cela   */ \
                                        /* n'est pas utile, mais ainsi, on prevoit l'avenir...                                       */ \
                    Eblock                                                                                                              \
                                        /* Generation d'une des trois composantes de la couleur d'un point...                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A T E R I A L I S A T I O N   D E S   C O N N E X I O N S  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   MATERIALISER_LES_CONNEXIONS                                                                                                   \
                    FAUX

#include  xrk/recuit_2D.14.I"

#define   AJUSTER_AUTOMATIQUEMENT_LE_NOMBRE_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION                                                       \
                    VRAI
DEFV(Local,DEFV(Logical,INIT(ajuster_automatiquement_le_nombre_de_points_sur_une_chaine_de_connexion
                            ,AJUSTER_AUTOMATIQUEMENT_LE_NOMBRE_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION
                             )
                )
     );
                                        /* Indique si l'on doit ajuster automatiquement le nombre de points sur une chaine de        */
                                        /* connexion ('VRAI') ou bien utiliser 'nombre_absolu_de_points_sur_une_chaine_de_connexion' */
                                        /* ('FAUX').                                                                                 */
#define   FACTEUR_DU_NOMBRE_RELATIF_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION                                                               \
                    FU
DEFV(Local,DEFV(Float,INIT(facteur_du_nombre_relatif_de_points_sur_une_chaine_de_connexion
                          ,FACTEUR_DU_NOMBRE_RELATIF_DE_POINTS_SUR_UNE_CHAINE_DE_CONNEXION
                           )
                )
     );
                                        /* En fait facteur multiplicatif permettant de passer de la longueur d'une chaine de         */
                                        /* connexion au nombre de points a utiliser.                                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   D I F F E R E N T S   E S P A C E S   E T   D E   L ' E F F E T   D E   B R U M E  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.13.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A I D E   A U   C A D R A G E   D E S   I M A G E S  :                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.1C.I"

DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES
                                        /* Definition des extrema des coordonnees et des derivees. On notera bien l'absence de       */
                                        /* point-virgule apres 'DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES'.   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E S   I M A G E S  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/champs_5.14.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   G E N E R A L E S   R E L A T I V E S   A   L A   V I S U A L I S A T I O N  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NOMBRE_D_ITERATIONS                                                                                                           \
                    QUATRE                                                                                                              \
                                        /* Le nombre d'iterations est initialise pour la courbe de von Koch...                       */

#include  xrv/particule.41.I"

#include  xrk/attractor.14.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N   D E   M E M O R I S A T I O N   D U   P O I N T   C O U R A N T  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.16.I"

#define   RAYON_DE_VISUALISATION                                                                                                        \
                    FRA8(FRA10(FU))
DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,RAYON_DE_VISUALISATION)));
                                        /* Rayon du disque materialisant une iteration.                                              */

                                        /* Nota : on remarquera que contrairement a 'v $xrc/Cfract_2D.11$K', on n'utilise pas :      */
                                        /*                                                                                           */
                                        /*                  #include  xrk/recuit_2D.16.I"                                            */
                                        /*                                                                                           */
                                        /* car, en effet, ce fichier definit la fonction 'memorisation_1_point_08(...)' avec un      */
                                        /* argument supplementaire 'rayon_de_visualisation' qui est incompatible avec l'appel de     */
                                        /* de cette fonction dans 'VISUALISATION_D_UNE_CHAINE_DE_CONNEXION', d'ou cette solution...  */

BFonctionI

DEFV(Local,DEFV(FonctionI,memorisation_1_point_07(AXf,AYf,AZf,AdXf,AdYf,AdZf,numero_de_l_iteration_courante)))
DEFV(Argument,DEFV(Float,AXf));
DEFV(Argument,DEFV(Float,AYf));
DEFV(Argument,DEFV(Float,AZf));
                                        /* Definition de la position {x,y,z} de l'iteration courante.                                */
DEFV(Argument,DEFV(Float,AdXf));
DEFV(Argument,DEFV(Float,AdYf));
DEFV(Argument,DEFV(Float,AdZf));
                                        /* Definition des differentielles {dx,dy,dz} de la position de l'iteration courante.         */
DEFV(Argument,DEFV(Int,numero_de_l_iteration_courante));
                                        /* Numero de l'iteration courante afin d'attenuer eventuellement la luminance des points     */
                                        /* materialisant chaque iteration en fonction de leur numero (les premieres iterations etant */
                                        /* plus sombres, et les dernieres etant plus lumineuses).                                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrk/attractor.15.I"

     INIT_ERROR;
     /*..............................................................................................................................*/
     MEMORISATION_DU_POINT_COURANT(X_DERIVEE_DANS_01(AdXf)
                                  ,Y_DERIVEE_DANS_01(AdYf)
                                  ,Z_DERIVEE_DANS_01(AdZf)
                                   );
                                        /* Memorisation du point courant en Noir et Blanc ou en Couleurs, mais uniquement s'il est   */
                                        /* visible en fonction des conditions de visualisation...                                    */
     RETU_ERROR;
     Eblock

EFonctionI

#define   Z_DU_PLAN_DE_LA_COURBE                                                                                                        \
                    Zcentre_ESPACE
DEFV(Local,DEFV(Float,INIT(Z_du_plan_de_la_courbe,Z_DU_PLAN_DE_LA_COURBE)));
                                        /* Coordonnee 'Z' du plan de la courbe.                                                      */

#define   MEMORISATION_DU_NOMBRE_COMPLEXE_COURANT(memoriser,nombre,dcxZ,dcyZ,dczZ)                                                      \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(memoriser))                                                                                            \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(EnTete_de_sauvegardM ## rayon_de_visualisation,rayon_de_visualisation));                       \
                                        /* Sauvegarde du rayon de visualisation avant sa modification. Ne pas le faire a des         */ \
                                        /* consequences graves dans le cas de la visualisation des axes au cas ou plusieurs          */ \
                                        /* images sont generees : pour les suivantes, le rayon de visualisation s'il n'est pas       */ \
                                        /* reinitialise se retrouve avec cette valeur...                                             */ \
                                                                                                                                        \
                         EGAL(cx,Reelle(nombre));                                                                                       \
                         EGAL(cy,Imaginaire(nombre));                                                                                   \
                         EGAL(cz,Z_du_plan_de_la_courbe);                                                                               \
                                        /* Recuperation de la position du point courant (cx,cy,cz)...                                */ \
                                                                                                                                        \
                         GENERATION_D_UNE_COMPOSANTE_DE_COULEUR_D_UN_POINT(nombre                                                       \
                                                                          ,dcxZ                                                         \
                                                                          ,COMPOSANTE_CHROMATIQUE_ROUGE                                 \
                                                                          ,seuil_inferieur_du_ROUGE,seuil_superieur_du_ROUGE            \
                                                                          ,composante_ROUGE_par_defaut                                  \
                                                                           );                                                           \
                         GENERATION_D_UNE_COMPOSANTE_DE_COULEUR_D_UN_POINT(nombre                                                       \
                                                                          ,dcyZ                                                         \
                                                                          ,COMPOSANTE_CHROMATIQUE_VERTE                                 \
                                                                          ,seuil_inferieur_du_VERTE,seuil_superieur_du_VERTE            \
                                                                          ,composante_VERTE_par_defaut                                  \
                                                                           );                                                           \
                         GENERATION_D_UNE_COMPOSANTE_DE_COULEUR_D_UN_POINT(nombre                                                       \
                                                                          ,dczZ                                                         \
                                                                          ,COMPOSANTE_CHROMATIQUE_BLEUE                                 \
                                                                          ,seuil_inferieur_du_BLEUE,seuil_superieur_du_BLEUE            \
                                                                          ,composante_BLEUE_par_defaut                                  \
                                                                           );                                                           \
                                        /* Generation des couleurs...                                                                */ \
                                                                                                                                        \
                         EGAL(dcx,dcxZ);                                                                                                \
                         EGAL(dcy,dcyZ);                                                                                                \
                         EGAL(dcz,dczZ);                                                                                                \
                                        /* Forcage des derivees (dcx,dcy,dcz) au point courant.                                      */ \
                                                                                                                                        \
                         EGAL(rayon_de_visualisation                                                                                    \
                             ,MUL2(grossissement_du_rayon_de_visualisation_des_points                                                   \
                                  ,rayon_de_visualisation                                                                               \
                                   )                                                                                                    \
                              );                                                                                                        \
                         CALS(memorisation_1_point_07(SOUS(cx,Xcentre_ESPACE)                                                           \
                                                     ,SOUS(cy,Ycentre_ESPACE)                                                           \
                                                     ,SOUS(cz,Zcentre_ESPACE)                                                           \
                                                     ,dcx                                                                               \
                                                     ,dcy                                                                               \
                                                     ,dcz                                                                               \
                                                     ,UNDEF                                                                             \
                                                      )                                                                                 \
                              );                                                                                                        \
                                                                                                                                        \
                         EGAL(rayon_de_visualisation,EnTete_de_sauvegardM ## rayon_de_visualisation);                                   \
                                        /* Restauration du rayon de visualisation...                                                 */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(memoriser_zG,FAUX);                                                                                            \
                                        /* Ainsi, seul le 'zG' qui definit le segment de "base" est trace ; les autres 'zG' obtenus  */ \
                                        /* recursivement ne le sont pas, car, en effet, un 'zG' est toujours le 'zD' du segment      */ \
                                        /* suivant de la courbe...                                                                   */ \
                    Eblock                                                                                                              \
                                        /* Memorisation du nombre complexe courant...                                                */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   V I S U A L I S A T I O N   E T   D ' I N T E R P O L A T I O N  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
=define   ZOOM_IMPLICITE                                                                                                                \
                    GRO7(FRA10(FU))                                                                                                     \
                                        /* Afin d'etre sur de voir toutes les particules generees...                                 */

#include  xrk/attractor.17.I"

#include  xrv/particule.31.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   I N I T I A L I S A T I O N S  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.18.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P O U R   D E S   R A I S O N S   D E   C O M P A T I B I L I T E  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/integr.1B.vv.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   A N G L E S   D E   R O T A T I O N  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/particule.22.I"

dfTRANSFORMAT_31(liste_ANGLE_DE_ROTATION,fichier_ANGLE_DE_ROTATION,ANGLE_DE_ROTATION_IMPLICITE,FZERO)
                                        /* On verra avec interet 'v $xtc/FracCurve.11$c' qui tire au sort ses parametres, puis       */
                                        /* les edite...                                                                              */
#define   sANGLE_DE_ROTATION(numero_de_l_angle)                                                                                         \
                    FLOT(sTRANSFORMAT_31(numero_de_l_angle,liste_ANGLE_DE_ROTATION))

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R O C E D U R E   R E C U R S I V E   D E                                                                                */
/*        G E N E R A T I O N   D ' U N E   C O U R B E   F R A C T A L E   B I D I M E N S I O N N E L L E  :                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   XG                                                                                                                            \
                    FZERO
#define   YG                                                                                                                            \
                    FDU
                                        /* Definition de l'extremite "Gauche" de la courbe.                                          */
#define   XD                                                                                                                            \
                    FU
#define   YD                                                                                                                            \
                    FDU
                                        /* Definition de l'extremite "Droite" de la courbe.                                          */

DEFV(Local,DEFV(Float,INIT(xG,XG)));
DEFV(Local,DEFV(Float,INIT(yG,YG)));
                                        /* Definition de l'extremite "Gauche" de la courbe.                                          */
DEFV(Local,DEFV(Float,INIT(xD,XD)));
DEFV(Local,DEFV(Float,INIT(yD,YD)));
                                        /* Definition de l'extremite "Droite" de la courbe.                                          */

#define   APLATIR(z_courbe,z_plat)                                                                                                      \
                    COND(IL_FAUT(aplatir_la_courbe_fractale),z_plat,z_courbe)
#define   zG_general                                                                                                                    \
                    APLATIR(zG,zG_a_plat)
#define   zD_general                                                                                                                    \
                    APLATIR(zD,zD_a_plat)

DEFV(Local,DEFV(Logical,INIT(c_est_le_premier_segment,VRAI)));
DEFV(Local,DEFV(complexe,zD_a_plat_precedent));
#define   APLATIR_LA_COURBE_FRACTALE                                                                                                    \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(aplatir_la_courbe_fractale,APLATIR_LA_COURBE_FRACTALE)));
                                        /* Faut-il generer la courbe "standard" ('FAUX') ou bien l'aplatir ('VRAI') et ce afin de    */
                                        /* voir comment varie sa longueur (ceci a ete introduit le 20181128210650).                  */

#define   NIVEAU_DE_RECURSION_A_NE_PAS_DEPASSER                                                                                         \
                    TROIS
DEFV(Local,DEFV(Int,INIT(niveau_de_recursion_a_ne_pas_depasser,NIVEAU_DE_RECURSION_A_NE_PAS_DEPASSER)));
                                        /* Niveau de recursion a ne pas depasser...                                                  */

#define   RAPPORT_DE_REDUCTION                                                                                                          \
                    FTROIS
DEFV(Local,DEFV(Float,INIT(rapport_de_reduction,RAPPORT_DE_REDUCTION)));
                                        /* Facteur de reduction initialise pour la courbe de von Koch.                               */

#define   ROTATION_ET_CONSTRUCTION(angle)                                                                                               \
                    Bblock                                                                                                              \
                    Cegal(zG_reduit,zD_reduit);                                                                                         \
                                        /* Initialisation du nombre "Gauche" avec le nombre "Droite".                                */ \
                    Crotation(z_difference_reduite,z_difference_reduite,angle);                                                         \
                                        /* Rotation et homothetie du generateur.                                                     */ \
                    Csomme(zD_reduit,zG_reduit,z_difference_reduite);                                                                   \
                                        /* Initialisation du nombre "Droite" avec le nombre "Gauche" translate.                      */ \
                    CALS(construction_de_la_courbe_fractale(ADRESSE(zG_reduit)                                                          \
                                                           ,ADRESSE(zD_reduit)                                                          \
                                                           ,SUCC(niveau_de_recursion)                                                   \
                                                           ,memoriser_zG                                                                \
                                                            )                                                                           \
                         );                                                                                                             \
                                        /* Et enfin, construction recursive...                                                       */ \
                    Eblock                                                                                                              \
                                        /* Construction recursive de la courbe fractale...                                           */

#define   EDITER_LES_NOMBRES_G_ET_D                                                                                                     \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(editer_les_nombres_G_et_D,EDITER_LES_NOMBRES_G_ET_D)));
                                        /* Controle de l'edition eventuelle des nombres 'zG' et 'zD' (introduit le 20181130161021).  */

BFonctionI

DEFV(Local,DEFV(FonctionI,construction_de_la_courbe_fractale(ARGUMENT_POINTERs(AzG)
                                                            ,ARGUMENT_POINTERs(AzD)
                                                            ,niveau_de_recursion
                                                            ,memoriser_zG
                                                             )
                )
     )
DEFV(Argument,DEFV(complexe,POINTERs(AzG)));
DEFV(Argument,DEFV(complexe,POINTERs(AzD)));
                                        /* Nombres "Gauche" et "Droite" courants.                                                    */
DEFV(Argument,DEFV(Int,niveau_de_recursion));
                                        /* Niveau de recursion courant.                                                              */
DEFV(Argument,DEFV(Logical,memoriser_zG));
                                        /* Faut-il memoriser 'zG' ?                                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock

     DEFV(complexe,zG);
     DEFV(complexe,zD);
                                        /* Nombres "Gauche" et "Droite" courants.                                                    */
     DEFV(complexe,zG_a_plat);
     DEFV(complexe,zD_a_plat);
                                        /* Nombres "Gauche" et "Droite" courants lors de la mise a plat de la courbe...              */

     DEFV(complexe,z_difference);
                                        /* Difference entre les nombres "Gauche" et "Droite" courants.                               */

     INIT_ERROR;
     /*..............................................................................................................................*/
     Cegal(zG,INDIRECT(AzG));
     Cegal(zD,INDIRECT(AzD));
                                        /* Recuperation des nombres "Gauche" et "Droite" courants.                                   */

     Test(IL_FAUT(editer_les_nombres_G_et_D))
                                        /* Test introduit le 20181130161021...                                                       */
          Bblock
          Repe(PRED(niveau_de_recursion));
               Bblock
               CALS(FPrme0("     "));
               Eblock
          ERep

          CAL3(Prme1("niveau=%d",niveau_de_recursion));
          CAL3(Prme2("     G={%+.^^^,%+.^^^}",Reelle(zG),Imaginaire(zG)));
          CAL3(Prme2("     D={%+.^^^,%+.^^^}",Reelle(zD),Imaginaire(zD)));
          CALS(Fsauts_de_lignes(UN));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Cdifference(z_difference,zD,zG);
                                        /* Calcul de la difference entre les nombres "Gauche" et "Droite" courants.                  */

     Test(IFGE(niveau_de_recursion,niveau_de_recursion_a_ne_pas_depasser))
          Bblock
          DEFV(Int,INIT(nombre_effectif_de_points_sur_une_chaine_de_connexion,UNDEF));
                                        /* Nombre de points effectif sur une chaine de connexion.                                    */

          DEFV(Float,INIT(dcxZG,FLOT__UNDEF));
          DEFV(Float,INIT(dcyZG,FLOT__UNDEF));
          DEFV(Float,INIT(dczZG,FLOT__UNDEF));
                                        /* Couleur du point 'zG'.                                                                    */
          DEFV(Float,INIT(dcxZD,FLOT__UNDEF));
          DEFV(Float,INIT(dcyZD,FLOT__UNDEF));
          DEFV(Float,INIT(dczZD,FLOT__UNDEF));
                                        /* Couleur du point 'zD'.                                                                    */

          Test(IL_FAUT(aplatir_la_courbe_fractale))
               Bblock
               Test(EST_VRAI(c_est_le_premier_segment))
                    Bblock
                    Cinitialisation(zG_a_plat,Reelle(zG),yG);
                    Cinitialisation(zD_a_plat,Reelle(zD),yG);
                                        /* ATTENTION : je rappelle le 20181130151634 que c'est bien 'yG' que l'on utilise deux fois  */
                                        /* ci-dessus (pour 'zG_a_plat' ET 'zD_a_plat') car, en effet, on veut obtenir un segment     */
                                        /* horizontal (et donc a 'y' constant)...                                                    */

                    EGAL(c_est_le_premier_segment,FAUX);
                    Eblock
               ATes
                    Bblock
                    Cinitialisation(zG_a_plat
                                   ,Reelle(zD_a_plat_precedent)
                                   ,yG
                                    );
                    Cinitialisation(zD_a_plat
                                   ,ADD2(Reelle(zG_a_plat),RdisF2D(Reelle(zG),Imaginaire(zG),Reelle(zD),Imaginaire(zD)))
                                   ,yG
                                    );
                                        /* Ainsi, on se deplace a l'horizontal (a 'y' constant et egal a 'yG'), l'amplitude du       */
                                        /* deplacement horizontal etant egal a la distance entre 'zG' et 'zD'...                     */
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Cegal(zD_a_plat_precedent,zD_a_plat);
                                        /* Dispositif de mise a plat introduit le 20181128211412...                                  */

          MEMORISATION_DU_NOMBRE_COMPLEXE_COURANT(memoriser_zG,zG_general,dcxZG,dcyZG,dczZG);
          MEMORISATION_DU_NOMBRE_COMPLEXE_COURANT(VRAI,zD_general,dcxZD,dcyZD,dczZD);
                                        /* Memorisation des nombres complexes "Gauche" et "Droite" courants.                         */

          Test(IL_FAUT(materialiser_les_connexions))
               Bblock
               Test(IL_FAUT(ajuster_automatiquement_le_nombre_de_points_sur_une_chaine_de_connexion))
                    Bblock
                    EGAL(nombre_effectif_de_points_sur_une_chaine_de_connexion
                        ,TRPU(ARRI(MUL2(facteur_du_nombre_relatif_de_points_sur_une_chaine_de_connexion
                                       ,DIVI(RdisF3D(Reelle(zG_general),Imaginaire(zG_general),Z_du_plan_de_la_courbe
                                                    ,Reelle(zD_general),Imaginaire(zD_general),Z_du_plan_de_la_courbe
                                                     )
                                            ,rayon_de_visualisation
                                             )
                                        )
                                   )
                              )
                         );
                                        /* Cas ou il y a ajustement automatique du nombre de points : celui-ci est alors fonction    */
                                        /* de la distance d(A,B) et des rayons de visualisation (sans oublier que ceux-ci sont       */
                                        /* definis dans [0,1] et non pas dans l'espace physique).                                    */
                    Eblock
               ATes
                    Bblock
                    EGAL(nombre_effectif_de_points_sur_une_chaine_de_connexion
                        ,nombre_absolu_de_points_sur_une_chaine_de_connexion
                         );
                                        /* Cas ou il n'y a pas d'ajustement automatique du nombre de points...                       */
                    Eblock
               ETes

               EGAL(nombre_effectif_de_points_sur_une_chaine_de_connexion
                   ,MAX2(nombre_effectif_de_points_sur_une_chaine_de_connexion,DEUX)
                    );
                                        /* Il faut malgre tout visualiser au moins 2 points (les 2 extremites 'A' et 'B').           */

               VISUALISATION_D_UNE_CHAINE_DE_CONNEXION(Reelle(zG_general),Imaginaire(zG_general),Z_du_plan_de_la_courbe
                                                      ,dcxZG,dcyZG,dczZG
                                                      ,rayon_de_visualisation
                                                      ,Reelle(zD_general),Imaginaire(zD_general),Z_du_plan_de_la_courbe
                                                      ,dcxZD,dcyZD,dczZD
                                                      ,rayon_de_visualisation
                                                      ,nombre_effectif_de_points_sur_une_chaine_de_connexion
                                                      ,UNDEF
                                                      ,interpoler_les_chaines_de_connexion_par_des_splines_cubiques
                                                      ,dcxZG,dcyZG,dczZG
                                                      ,dcxZD,dcyZD,dczZD
                                                       );
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          DEFV(complexe,z_difference_reduite);
                                        /* Afin de reduire la difference courante suivant le facteur et l'angle courants...          */
          DEFV(complexe,zG_reduit);
          DEFV(complexe,zD_reduit);
                                        /* Nouveaux nombres "Gauche" et "Droite" apres reduction...                                  */

          Cegal(zD_reduit,zG);
                                        /* Initialisation du nombre "Droite" reduit avec le nombre "Gauche" courant.                 */
          Chomothetie(z_difference_reduite,z_difference,INVE(rapport_de_reduction));
                                        /* Reduction de la difference courante suivant le facteur courant.                           */

          Komp(numero_de_l_angle,nombre_d_iterations)
               Bblock
               ROTATION_ET_CONSTRUCTION(sANGLE_DE_ROTATION(numero_de_l_angle));
               Eblock
          EKom
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N E   C O U R B E   F R A C T A L E   B I D I M E N S I O N N E L L E                          */
/*        D A N S   L E   P L A N   C O M P L E X E  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(complexe,zG);
     DEFV(complexe,zD);
                                        /* Nombres "Gauche" et "Droite" de depart...                                                 */
     /*..............................................................................................................................*/
     INITIALISATIONS_GENERALES;
                                        /* Initialisations generales faites au tout debut...                                         */

     iTRANSFORMAT_31(liste_ANGLE_DE_ROTATION,ANGLE_DE_ROTATION_IMPLICITE);
                                        /* Initialisation de la liste des angles.                                                    */

#include  xrv/champs_5.1A.I"

     GET_ARGUMENTSv(nombre_d_arguments
                   ,BLOC(PROCESS_ARGUMENT_I("iterations=",nombre_d_iterations
                                           ,BLOC(VIDE;)
                                           ,BLOC(PRINT_AVERTISSEMENT("'iterations=' doit etre defini avant tout fichier");)
                                            );
                                        /* ATTENTION : la recuperation de 'nombre_d_iterations' doit preceder les                    */
                                        /* 'PROCESS_ARGUMENT_C(...)' qui suivent car ils l'utilisent.                                */
                                        /*                                                                                           */
                                        /* ATTENTION : ici, 'nombre_d_iterations' donne le nombre de segments en lequel est          */
                                        /* transforme tout segement de la generation precedente (par exemple 4 lorsque l'on          */
                                        /* genere la courbe de von Koch).                                                            */

                         PROCESS_ARGUMENTS_GEOMETRIQUES;

                         PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_12;
                                        /* Ces parametres ont ete introduits le 20021105122838.                                      */

                         PROCESS_ARGUMENT_FICHIER("ANGLE_DE_ROTATION="
                                                 ,fichier_ANGLE_DE_ROTATION
                                                 ,liste_ANGLE_DE_ROTATION
                                                 ,ANGLE_DE_ROTATION_IMPLICITE
                                                 ,lTRANSFORMAT_12
                                                  );

                         PROCESS_ARGUMENTS_DE_VISUALISATION;

                         GET_ARGUMENT_L("aplatir=""plat",aplatir_la_courbe_fractale);
                         GET_ARGUMENT_N("courbe=",aplatir_la_courbe_fractale);
                                        /* Ces options ont ete introduites le 20181128210650...                                      */

                         GET_ARGUMENT_L("aleatoire=",colorier_les_points_aleatoirement);
                         GET_ARGUMENT_I("graine=",graine_du_generateur_d_evenements);
                         GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation);
                         GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation);
                         GET_ARGUMENT_L("complexe=",colorier_les_points_avec_le_plan_complexe);

                         GET_ARGUMENT_P("composante_ROUGE=""cROUGE=",composante_ROUGE_par_defaut);
                         GET_ARGUMENT_P("composante_VERTE=""cVERTE=",composante_VERTE_par_defaut);
                         GET_ARGUMENT_P("composante_BLEUE=""cBLEUE=",composante_BLEUE_par_defaut);
                                        /* Ces options ont ete introduites le 20151206111701...                                      */

                         GET_ARGUMENT_L("connexions=",materialiser_les_connexions);
                         GET_ARGUMENT_L("ajuster_points=""Pajuster="
                                       ,ajuster_automatiquement_le_nombre_de_points_sur_une_chaine_de_connexion
                                        );

                         GET_ARGUMENT_L("equidistance=",garantir_l_equidistance_des_points_successifs_d_une_chaine_de_connexion);
                         GET_ARGUMENT_L("equidistance_chaine_connexion_____compatibilite_20051230=""compatibilite_20051230="
                                       ,equidistance_des_points_successifs_d_une_chaine_de_connexion_____compatibilite_20051230
                                        );
                         GET_ARGUMENT_L("equidistance_chaine_connexion_____compatibilite_20081109=""compatibilite_20081109="
                                       ,equidistance_des_points_successifs_d_une_chaine_de_connexion_____compatibilite_20081109
                                        );
                         GET_ARGUMENT_F("dm=""distance_minimale=""distance="
                                       ,distance_minimale_entre_deux_points_successifs_d_une_chaine_de_connexion
                                        );
                         GET_ARGUMENT_F("amelioration_lambda=""al=",facteur_d_amelioration_du_lambda_d_une_chaine_de_connexion);
                                        /* Ces options ont ete introduites le 20151204112156...                                      */

                         GET_ARGUMENT_I("points=""nombreA=""Apoints=",nombre_absolu_de_points_sur_une_chaine_de_connexion);
                         GET_ARGUMENT_F("nombreR=""Rpoints=",facteur_du_nombre_relatif_de_points_sur_une_chaine_de_connexion);

                         GET_ARGUMENT_F("grossissement=",grossissement_du_rayon_de_visualisation_des_points);
                         GET_ARGUMENT_L("cubique=",interpoler_les_chaines_de_connexion_par_des_splines_cubiques);

                         GET_ARGUMENT_F("z=",Z_du_plan_de_la_courbe);

                         GET_ARGUMENT_I("recursion=",niveau_de_recursion_a_ne_pas_depasser);

                         GET_ARGUMENT_F("reduction=""rapport=",rapport_de_reduction);
                         GET_ARGUMENT_F("XG=""xG=",xG);
                         GET_ARGUMENT_F("YG=""yG=",yG);
                         GET_ARGUMENT_F("XD=""xD=",xD);
                         GET_ARGUMENT_F("YD=""yD=",yD);
                                        /* Le 20200808102616 les majuscules ont ete introduites pour {x,y}...                        */

                         GET_ARGUMENT_L("editer_GD=""eGD=",editer_les_nombres_G_et_D);
                                        /* Options introduites le 20181130161021...                                                  */
                         )
                    );

#include  xrv/champs_5.19.I"
                                        /* Pour eviter le message :                                                                  */
                                        /*                                                                                           */
                                        /*                  Static function is not referenced.                                       */
                                        /*                                                                                           */
                                        /* sur 'SYSTEME_ES9000_AIX_CC'...                                                            */

#include  xrk/attractor.19.I"
                                        /* Validations et definition de l'espace physique.                                           */

     begin_nouveau_block
          Bblock

          Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation)
               Bblock
               RE_INITIALISATION_DE_L_HORLOGE;
               INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante);
                                        /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image.    */

               Cinitialisation(zG,xG,yG);
               Cinitialisation(zD,xD,yD);
                                        /* Initialisation des extremites de la courbe.                                               */

               CALS(construction_de_la_courbe_fractale(ADRESSE(zG),ADRESSE(zD),UN,VRAI));
                                        /* Construction de la courbe.                                                                */

#include  xrk/attractor.1A.I"

               PARALLELISME(BLOC(GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;));
                                        /* Generation de l'image courante...                                                         */
                                 )
                           ,BLOC(PASSAGE_A_L_IMAGE_SUIVANTE;)
                           ,numero_de_la_periode_courante
                            );

               Eblock
          EKom

          Eblock
     end_nouveau_block

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.