/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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.11$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1996??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#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   GENERATION_D_UNE_COMPOSANTE_DE_COULEUR_D_UN_POINT(point,composante,couleur,seuil_inferieur,seuil_superieur)                   \
                    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__BLANC);                                                                             \
                                        /* Dans le dernier cas, on fixe le maximum ('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"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   RAYON_DE_VISUALISATION                                                                                                        \
                    FRA8(FRA10(FU))

#include  xrk/recuit_2D.16.I"

#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                                                                                                         \
                         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            \
                                                                           );                                                           \
                         GENERATION_D_UNE_COMPOSANTE_DE_COULEUR_D_UN_POINT(nombre                                                       \
                                                                          ,dcyZ                                                         \
                                                                          ,COMPOSANTE_CHROMATIQUE_VERTE                                 \
                                                                          ,seuil_inferieur_du_VERTE,seuil_superieur_du_VERTE            \
                                                                           );                                                           \
                         GENERATION_D_UNE_COMPOSANTE_DE_COULEUR_D_UN_POINT(nombre                                                       \
                                                                          ,dczZ                                                         \
                                                                          ,COMPOSANTE_CHROMATIQUE_BLEUE                                 \
                                                                          ,seuil_inferieur_du_BLEUE,seuil_superieur_du_BLEUE            \
                                                                           );                                                           \
                                        /* Generation des couleurs...                                                                */ \
                         EGAL(dcx,dcxZ);                                                                                                \
                         EGAL(dcy,dcyZ);                                                                                                \
                         EGAL(dcz,dczZ);                                                                                                \
                                        /* Forcage des derivees (dcx,dcy,dcz) au point courant.                                      */ \
                                                                                                                                        \
                         CALS(memorisation_1_point_08(SOUS(cx,Xcentre_ESPACE)                                                           \
                                                     ,SOUS(cy,Ycentre_ESPACE)                                                           \
                                                     ,SOUS(cz,Zcentre_ESPACE)                                                           \
                                                     ,dcx                                                                               \
                                                     ,dcy                                                                               \
                                                     ,dcz                                                                               \
                                                     ,UNDEF                                                                             \
                                                     ,MUL2(grossissement_du_rayon_de_visualisation_des_points                           \
                                                          ,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"

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

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

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,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.                                   */
     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(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'.                                                                    */

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

          Test(IL_FAUT(materialiser_les_connexions))
               Bblock
               Repe(nombre_absolu_de_points_sur_une_chaine_de_connexion)
                    Bblock
                    DEFV(Float,INIT(lambda
                                   ,ADD2(COORDONNEE_BARYCENTRIQUE_MINIMALE
                                        ,SCAL(compteur_des_repetitions_du_Repe
                                             ,SOUS(ADD3(UN,nombre_absolu_de_points_sur_une_chaine_de_connexion,UN)
                                                  ,PREMIERE_ITERATION_D_UN_Repe
                                                   )
                                             ,SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE
                                                  ,COORDONNEE_BARYCENTRIQUE_MINIMALE
                                                   )
                                              )
                                         )
                                    )
                         );
                                        /* Definition de la coordonnee barycentrique d'interpolation des coordonnees et des          */
                                        /* couleurs des points de l'espace. On notera le 'ADD3(UN,...,UN)' destine a prendre en      */
                                        /* compte le fait que 'nombre_absolu_de_points_sur_une_chaine_de_connexion' exclut les       */
                                        /* extremites qui correspondent aux points du reseau eux-memes...                            */

                    EGAL(cx,BARY(Reelle(zG),Reelle(zD),lambda));
                    EGAL(cy,BARY(Imaginaire(zG),Imaginaire(zD),lambda));
                    EGAL(cz,BARY(Z_du_plan_de_la_courbe,Z_du_plan_de_la_courbe,lambda));
                                        /* Recuperation de la position du point courant (cx,cy,cz)...                                */
                    EGAL(dcx,BARY(dcxZG,dcxZD,lambda));
                    EGAL(dcy,BARY(dcyZG,dcyZD,lambda));
                    EGAL(dcz,BARY(dczZG,dczZD,lambda));
                                        /* Forcage arbitraire des derivees (dcx,dcy,dcz) au point courant.                           */

                    CALS(memorisation_1_point_08(SOUS(cx,Xcentre_ESPACE)
                                                ,SOUS(cy,Ycentre_ESPACE)
                                                ,SOUS(cz,Zcentre_ESPACE)
                                                ,dcx
                                                ,dcy
                                                ,dcz
                                                ,UNDEF
                                                ,NEUT(rayon_de_visualisation)
                                                 )
                         );
                                        /* Memorisation du point courant...                                                          */
                    Eblock
               ERep
               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(Float,INIT(xG,XG));
     DEFV(Float,INIT(yG,YG));
                                        /* Definition de l'extremite "Gauche" de la courbe.                                          */
     DEFV(Float,INIT(xD,XD));
     DEFV(Float,INIT(yD,YD));
                                        /* Definition de l'extremite "Droite" de la courbe.                                          */

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

                         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("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_L("connexions=",materialiser_les_connexions);
                         GET_ARGUMENT_F("grossissement=",grossissement_du_rayon_de_visualisation_des_points);
                         GET_ARGUMENT_I("points=",nombre_absolu_de_points_sur_une_chaine_de_connexion);

                         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 20200808102424 les majuscules ont ete introduites pour {x,y}...                        */
                         )
                    );

#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.