/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A D O X E   D E   G E N Z L I N G  :                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrk/ParadoxeG.01$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20050422084953).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/sequence.01.I"

#define   UTILISER_UN_ESPACE_DE_PARAMETRAGE_TRIDIMENSIONNEL                                                                             \
                    VRAI                                                                                                                \
                                        /* Doit-on utiliser un espace de parametrage tridimensionnel ('VRAI') ou bidimensionnel      */ \
                                        /* ('FAUX') ? Ceci a ete introduit le 20001211162430.                                        */

#define   UTILISER_LE_GENERATEUR_A_PERIODICITE_PARAMETRABLE                                                                             \
                    FAUX                                                                                                                \
                                        /* Doit-on utiliser le generateur a periodicite parametrable ('VRAI') ou l'autre ('FAUX') ?  */
#define   GRAINE                                                                                                                        \
                    PARE(1789)                                                                                                          \
                                        /* Definition du generateur aleatoire...                                                     */

#define   DEPHASAGE_INITIAL                                                                                                             \
                    ZERO                                                                                                                \
                                        /* Nombre de valeurs aleatoires a generer initialement en aveugle de facon a se dephaser     */ \
                                        /* dans la liste des valeurs aleatoires generees (introduit le 20021028090331).              */

#define   EXTERIEUR_DE_L_ESPACE                                                                                                         \
                    GRIS_0
#define   INTERIEUR_DE_L_ESPACE                                                                                                         \
                    GRIS_8
                                        /* Definition de l'interieur et de l'exterieur de l'Espace de generation des droites         */
                                        /* aleatoires.                                                                               */
#define   L_ESPACE_EST_L_ESPACE_DE_TIRAGE_ALEATOIRE                                                                                     \
                    FAUX                                                                                                                \
                                        /* L'espace est-il l'espace de tirage aleatoire ('VRAI') ou bien definit-il les points       */ \
                                        /* eux-memes (ceci a ete introduit le 20050425084205) ? La valeur par defaut est passee de   */ \
                                        /* 'VRAI' a 'FAUX' le 20050621094753 car il est finalement plus utile d'analyser des images  */ \
                                        /* de points generees a l'exterieur de ce programme et qui sont arbitraires et par exemple   */ \
                                        /* non necessairement aleatoires...                                                          */

#define   NOMBRE_DE_POINTS                                                                                                              \
                    VINGT                                                                                                               \
                                        /* Nombre de points du processus aleatoire...                                                */

#define   EDITER_TOUTES_LES_INFORMATIONS                                                                                                \
                    FAUX                                                                                                                \
                                        /* Faut-il editer toutes les informations ('VRAI') ou uniquement les angles ('FAUX') ? Ceci  */ \
                                        /* a ete introduit le 20050423232748.                                                        */
#define   EDITER_LES_COORDONNEES                                                                                                        \
                    FAUX
#define   EDITER_LES_ANGLES                                                                                                             \
                    VRAI
#define   EDITER_LES_ANGLES_EN_RADIANS                                                                                                  \
                    VRAI
#define   EDITER_LES_STATISTIQUES                                                                                                       \
                    FAUX
                                        /* Controle des diverses editions, la possibilite d'editer les angles en degres plutot       */
                                        /* qu'en radians ayant ete introduite le 20050710123922...                                   */

#define   NIVEAU_DES_DROITES                                                                                                            \
                    GRIS_2
#define   NIVEAU_DES_SEGMENTS                                                                                                           \
                    GRIS_8
                                        /* Niveaux de trace des droites et des segments...                                           */
#include  xci/valeurs.01.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/valeurs.02.I"

#define   GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(valeur_aleatoire,borne_inferieure,borne_superieure)                                \
                    Bblock                                                                                                              \
                    Test(IL_NE_FAUT_PAS(utiliser_le_generateur_a_periodicite_parametrable))                                             \
                         Bblock                                                                                                         \
                                        /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree  */ \
                                        /* par le point courant de l'espace de parametrage :                                         */ \
                         EGAL(valeur_aleatoire                                                                                          \
                             ,COND(IL_NE_FAUT_PAS(utiliser_un_espace_de_parametrage_tridimensionnel)                                    \
                                  ,rdnI2D(ADRESSE(point_courant_de_l_espace_de_parametrage_2D)                                          \
                                         ,graine                                                                                        \
                                         ,RDN_INIT_AND_GENERE                                                                           \
                                         ,borne_inferieure,borne_superieure                                                             \
                                          )                                                                                             \
                                  ,rdnI3D(ADRESSE(point_courant_de_l_espace_de_parametrage_3D)                                          \
                                         ,graine                                                                                        \
                                         ,RDN_INIT_AND_GENERE                                                                           \
                                         ,borne_inferieure,borne_superieure                                                             \
                                          )                                                                                             \
                                   )                                                                                                    \
                              );                                                                                                        \
                                        /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree  */ \
                                        /* par le point courant de l'espace de parametrage.                                          */ \
                                                                                                                                        \
                         SPIRALE_INITIALISATION;                                                                                        \
                                        /* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'.                         */ \
                         SPIRALE_DEPLACEMENT(ASD1(point_courant_de_l_espace_de_parametrage_2D,x)                                        \
                                            ,ASD1(point_courant_de_l_espace_de_parametrage_2D,y)                                        \
                                             );                                                                                         \
                         SPIRALE_DEPLACEMENT(ASD1(point_courant_de_l_espace_de_parametrage_3D,x)                                        \
                                            ,ASD1(point_courant_de_l_espace_de_parametrage_3D,y)                                        \
                                             );                                                                                         \
                                        /* Deplacement du point courant de la spirale de l'espace de parametrage, et ce en restant   */ \
                                        /* dans un plan Z=constante (Zmin)...                                                        */ \
                         SPIRALE_PARCOURS;                                                                                              \
                                        /* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant...                */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         EGAL(valeur_aleatoire                                                                                          \
                             ,rdn_iteratif_cercle()                                                                                     \
                              );                                                                                                        \
                         EGAL(valeur_aleatoire                                                                                          \
                             ,DENO(valeur_aleatoire,borne_inferieure,borne_superieure)                                                  \
                              );                                                                                                        \
                                        /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] non parametree */ \
                                        /* par le point courant de l'espace de parametrage.                                          */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

#define   ACCES_POINT(point)                                                                                                            \
                    IdTb1(liste_des_points                                                                                              \
                         ,INDX(point,PREMIER_POINT)                                                                                     \
                         ,nombre_de_points                                                                                              \
                          )                                                                                                             \
                                        /* Acces a un point de numero donne 'point'...                                               */

#define   EQUATION_D_UNE_DROITE(point1,point2,delta_X,delta_Y,coefficient_a,coefficient_b,coefficient_c)                                \
                    Bblock                                                                                                              \
                    Test(IFET(IFNE(ASD1(ACCES_POINT(point1),x),ASD1(ACCES_POINT(point2),x))                                             \
                             ,IFNE(ASD1(ACCES_POINT(point1),y),ASD1(ACCES_POINT(point2),y))                                             \
                              )                                                                                                         \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         EGAL(coefficient_a                                                                                             \
                             ,NEGA(DIVI(delta_Y,delta_X))                                                                               \
                              );                                                                                                        \
                         EGAL(coefficient_b                                                                                             \
                             ,FU                                                                                                        \
                              );                                                                                                        \
                         EGAL(coefficient_c                                                                                             \
                             ,NEGA(LIZ2(coefficient_a,CHOI(ASD1(ACCES_POINT(point1),x),ASD1(ACCES_POINT(point2),x))                     \
                                       ,coefficient_b,CHOI(ASD1(ACCES_POINT(point1),y),ASD1(ACCES_POINT(point2),y))                     \
                                        )                                                                                               \
                                   )                                                                                                    \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Test(IFEQ(ASD1(ACCES_POINT(point1),x),ASD1(ACCES_POINT(point2),x)))                                            \
                              Bblock                                                                                                    \
                              EGAL(coefficient_a                                                                                        \
                                  ,FU                                                                                                   \
                                   );                                                                                                   \
                              EGAL(coefficient_b                                                                                        \
                                  ,FZERO                                                                                                \
                                   );                                                                                                   \
                              EGAL(coefficient_c                                                                                        \
                                  ,NEGA(CHOI(ASD1(ACCES_POINT(point1),x),ASD1(ACCES_POINT(point2),x)))                                  \
                                   );                                                                                                   \
                                        /* Cas d'une droite verticale...                                                             */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IFEQ(ASD1(ACCES_POINT(point1),y),ASD1(ACCES_POINT(point2),y)))                                       \
                                   Bblock                                                                                               \
                                   EGAL(coefficient_a                                                                                   \
                                       ,FZERO                                                                                           \
                                        );                                                                                              \
                                   EGAL(coefficient_b                                                                                   \
                                       ,FU                                                                                              \
                                        );                                                                                              \
                                   EGAL(coefficient_c                                                                                   \
                                       ,NEGA(CHOI(ASD1(ACCES_POINT(point1),y),ASD1(ACCES_POINT(point2),y)))                             \
                                        );                                                                                              \
                                        /* Cas d'une droite horizontale...                                                           */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   PRINT_ERREUR("l'equation de la droite ne peut etre determinee");                                     \
                                   CAL1(Prer2("point1={%f,%f}\n",ASD1(ACCES_POINT(point1),x),ASD1(ACCES_POINT(point1),y)));             \
                                   CAL1(Prer2("point1={%f,%f}\n",ASD1(ACCES_POINT(point2),x),ASD1(ACCES_POINT(point2),y)));             \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

#define   TRACE_D_UN_SEGMENT(point1,point2)                                                                                             \
                    Bblock                                                                                                              \
                    SET_CURSOR(_____cNORMALISE_OX(ASD1(ACCES_POINT(point1),x))                                                          \
                              ,_____cNORMALISE_OY(ASD1(ACCES_POINT(point1),y))                                                          \
                              ,_____cNORMALISE_OZ(Zmin)                                                                                 \
                               );                                                                                                       \
                    gA;                                                                                                                 \
                                                                                                                                        \
                    SET_CURSOR(_____cNORMALISE_OX(ASD1(ACCES_POINT(point2),x))                                                          \
                              ,_____cNORMALISE_OY(ASD1(ACCES_POINT(point2),y))                                                          \
                              ,_____cNORMALISE_OZ(Zmin)                                                                                 \
                               );                                                                                                       \
                    gB;                                                                                                                 \
                                        /* Trace du segment.                                                                         */ \
                    Eblock

#define   TRACE_D_UNE_DROITE(coefficient_A,coefficient_B,coefficient_C)                                                                 \
                    Bblock                                                                                                              \
                    Test(IFET(IZNE(coefficient_A),IZNE(coefficient_B)))                                                                 \
                                        /* Cas d'une droite oblique :                                                                */ \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(coefficient_A_renormalise,NEGA(DIVI(coefficient_A,coefficient_B))));                           \
                         DEFV(Float,INIT(coefficient_B_renormalise,NEGA(DIVI(coefficient_C,coefficient_B))));                           \
                         DEFV(Int,INIT(Y_pour_Xmin,UNDEF));                                                                             \
                         DEFV(Int,INIT(X_pour_Ymin,UNDEF));                                                                             \
                         EGAL(Y_pour_Xmin,AXPB(coefficient_A_renormalise,Xmin,coefficient_B_renormalise));                              \
                         EGAL(X_pour_Ymin,DIVI(SOUS(Ymin,coefficient_B_renormalise),coefficient_A_renormalise));                        \
                                                                                                                                        \
                         Test(IFGE(Y_pour_Xmin,Ymin))                                                                                   \
                              Bblock                                                                                                    \
                              SET_CURSOR(_____cNORMALISE_OX(Xmin)                                                                       \
                                        ,_____cNORMALISE_OY(Y_pour_Xmin)                                                                \
                                        ,_____cNORMALISE_OZ(Zmin)                                                                       \
                                         );                                                                                             \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              DEFV(Int,INIT(Y_pour_Xmax,AXPB(coefficient_A_renormalise,Xmax,coefficient_B_renormalise)));               \
                                                                                                                                        \
                              SET_CURSOR(_____cNORMALISE_OX(Xmax)                                                                       \
                                        ,_____cNORMALISE_OY(Y_pour_Xmax)                                                                \
                                        ,_____cNORMALISE_OZ(Zmin)                                                                       \
                                         );                                                                                             \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         gA;                                                                                                            \
                                                                                                                                        \
                         Test(IFGE(X_pour_Ymin,Xmin))                                                                                   \
                              Bblock                                                                                                    \
                              SET_CURSOR(_____cNORMALISE_OX(X_pour_Ymin)                                                                \
                                        ,_____cNORMALISE_OY(Ymin)                                                                       \
                                        ,_____cNORMALISE_OZ(Zmin)                                                                       \
                                         );                                                                                             \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              DEFV(Int,INIT(X_pour_Ymax,DIVI(SOUS(Ymax,coefficient_B_renormalise),coefficient_A_renormalise)));         \
                                                                                                                                        \
                              SET_CURSOR(_____cNORMALISE_OX(X_pour_Ymax)                                                                \
                                        ,_____cNORMALISE_OY(Ymax)                                                                       \
                                        ,_____cNORMALISE_OZ(Zmin)                                                                       \
                                         );                                                                                             \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         gB;                                                                                                            \
                                        /* Trace de la droite.                                                                       */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Test(IZEQ(coefficient_A))                                                                                      \
                                        /* Cas d'une droite horizontale :                                                            */ \
                              Bblock                                                                                                    \
                              DEFV(Int,INIT(Y_horizontal,NEGA(DIVI(coefficient_C,coefficient_B))));                                     \
                              SET_CURSOR(_____cNORMALISE_OX(Xmin)                                                                       \
                                        ,_____cNORMALISE_OY(Y_horizontal)                                                               \
                                        ,_____cNORMALISE_OZ(Zmin)                                                                       \
                                         );                                                                                             \
                                                                                                                                        \
                              gA;                                                                                                       \
                                                                                                                                        \
                              SET_CURSOR(_____cNORMALISE_OX(Xmax)                                                                       \
                                        ,_____cNORMALISE_OY(Y_horizontal)                                                               \
                                        ,_____cNORMALISE_OZ(Zmin)                                                                       \
                                         );                                                                                             \
                                                                                                                                        \
                              gB;                                                                                                       \
                                        /* Trace de la droite.                                                                       */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IZEQ(coefficient_B))                                                                                 \
                                        /* Cas d'une droite verticale :                                                              */ \
                                   Bblock                                                                                               \
                                   DEFV(Int,INIT(X_horizontal,NEGA(DIVI(coefficient_C,coefficient_A))));                                \
                                   SET_CURSOR(_____cNORMALISE_OX(X_horizontal)                                                          \
                                             ,_____cNORMALISE_OY(Ymin)                                                                  \
                                             ,_____cNORMALISE_OZ(Zmin)                                                                  \
                                              );                                                                                        \
                                                                                                                                        \
                                   gA;                                                                                                  \
                                                                                                                                        \
                                   SET_CURSOR(_____cNORMALISE_OX(X_horizontal)                                                          \
                                             ,_____cNORMALISE_OY(Ymax)                                                                  \
                                             ,_____cNORMALISE_OZ(Zmin)                                                                  \
                                              );                                                                                        \
                                                                                                                                        \
                                   gB;                                                                                                  \
                                        /* Trace de la droite.                                                                       */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   PRINT_ERREUR("la droite ne peut etre tracee");                                                       \
                                   CAL1(Prer3("(a,b,c)={%f,%f,%f}\n",coefficient_A,coefficient_B,coefficient_C));                       \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A D O X E   D E   G E N Z L I N G  :                                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageE),NOM_PIPE));
                                        /* Definition de l'Espace de generation des droites aleatoires.                              */
     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
                                        /* Nom de l'image ou montrer les droites...                                                  */

     DEFV(genere_p,INIT(exterieur_de_l_espace,EXTERIEUR_DE_L_ESPACE));
     DEFV(genere_p,INIT(interieur_de_l_espace,INTERIEUR_DE_L_ESPACE));
                                        /* Definition de l'interieur et de l'exterieur de l'Espace de generation des droites         */
                                        /* aleatoires. On notera au passage que 'exterieur_de_l_espace' ne sert a rien mais          */
                                        /* qu'il est conserve par symetrie avec ce qui est fait avec le Domaine...                   */
     DEFV(Logical,INIT(l_espace_est_l_espace_de_tirage_aleatoire,L_ESPACE_EST_L_ESPACE_DE_TIRAGE_ALEATOIRE));
                                        /* L'espace est-il l'espace de tirage aleatoire ('VRAI') ou bien definit-il les points       */
                                        /* eux-memes (ceci a ete introduit le 20050425084205) ? La valeur par defaut est passee de   */
                                        /* 'VRAI' a 'FAUX' le 20050621094753 car il est finalement plus utile d'analyser des images  */
                                        /* de points generees a l'exterieur de ce programme et qui sont arbitraires et par exemple   */
                                        /* non necessairement aleatoires...                                                          */

     DEFV(Logical,INIT(utiliser_un_espace_de_parametrage_tridimensionnel,UTILISER_UN_ESPACE_DE_PARAMETRAGE_TRIDIMENSIONNEL));
                                        /* Doit-on utiliser un espace de parametrage tridimensionnel ('VRAI') ou bidimensionnel      */
                                        /* ('FAUX') ? Ceci a ete introduit le 20001211162430.                                        */

     DEFV(Logical,INIT(utiliser_le_generateur_a_periodicite_parametrable,UTILISER_LE_GENERATEUR_A_PERIODICITE_PARAMETRABLE));
                                        /* Doit-on utiliser le generateur a periodicite parametrable ('VRAI') ou l'autre ('FAUX') ?  */

     DEFV(Positive,INIT(dephasage_initial,DEPHASAGE_INITIAL));
                                        /* Nombre de valeurs aleatoires a generer initialement en aveugle de facon a se dephaser     */
                                        /* dans la liste des valeurs aleatoires generees (introduit le 20021028090331).              */

     DEFV(Int,INIT(graine,GRAINE));
                                        /* Definition du generateur aleatoire...                                                     */

     DEFV(Int,INIT(nombre_de_points,NOMBRE_DE_POINTS));
                                        /* Nombre de points du processus aleatoire...                                                */

     DEFV(Logical,INIT(editer_toutes_les_informations,EDITER_TOUTES_LES_INFORMATIONS));
                                        /* Faut-il editer toutes les informations ('VRAI') ou uniquement les angles ('FAUX') ? Ceci  */
                                        /* a ete introduit le 20050423232748.                                                        */
     DEFV(Logical,INIT(editer_les_coordonnees,EDITER_LES_COORDONNEES));
     DEFV(Logical,INIT(editer_les_angles,EDITER_LES_ANGLES));
     DEFV(Logical,INIT(editer_les_angles_en_radians,EDITER_LES_ANGLES_EN_RADIANS));
     DEFV(Logical,INIT(editer_les_statistiques,EDITER_LES_STATISTIQUES));
                                        /* Controle des diverses editions, la possibilite d'editer les angles en degres plutot       */
                                        /* qu'en radians ayant ete introduite le 20050710123922...                                   */

     DEFV(genere_p,INIT(niveau_des_droites,NIVEAU_DES_DROITES));
     DEFV(genere_p,INIT(niveau_des_segments,NIVEAU_DES_SEGMENTS));
                                        /* Niveaux de trace des droites et des segments...                                           */

#include  xci/valeurs.03.I"

     /*..............................................................................................................................*/
     GET_ARGUMENTSv(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("Ipoint_anti_aliase_segment_____compatibilite_20110420=""compatibilite_20110420="
                                       ,Ipoint_anti_aliase_segment_____compatibilite_20110420
                                        );
                                        /* Parametre introduit le 20110420145531...                                                  */

                         GET_ARGUMENT_C("imageE=""E=""A=",nom_imageE);
                         GET_ARGUMENT_C("R=",nom_imageR);

                         GET_ARGUMENT_P("exte=",exterieur_de_l_espace);
                         GET_ARGUMENT_P("inte=",interieur_de_l_espace);
                         GET_ARGUMENT_L("aleatoire=",l_espace_est_l_espace_de_tirage_aleatoire);
                         GET_ARGUMENT_N("deterministe=",l_espace_est_l_espace_de_tirage_aleatoire);

                         GET_ARGUMENT_I("points=""Pnombre=",nombre_de_points);
                                        /* Le 20050623153703, "nombre=" a ete remplace par "Pnombre=" (double definition...).        */

                         GET_ARGUMENT_L("tridimensionnel=""3D=",utiliser_un_espace_de_parametrage_tridimensionnel);

                         GET_ARGUMENT_L("periodique=",utiliser_le_generateur_a_periodicite_parametrable);

                         GET_ARGUMENT_I("graine=""g=",graine);
                         GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation);
                         GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation);

                         GET_ARGUMENT_F("x=""X=",ASD1(rdn_iteratif_cercle_____point_courant_sur_la_droite,x));
                         GET_ARGUMENT_F("y=""Y=",ASD1(rdn_iteratif_cercle_____point_courant_sur_la_droite,y));
                         GET_ARGUMENT_F("pente=""Ad=",rdn_iteratif_cercle_____pente_A_de_la_droite);
                                        /* Le 20050623153703, "A=" a ete remplace par "Ad=" (double definition...).                  */
                         GET_ARGUMENT_F("ordonnee=""Bd=",rdn_iteratif_cercle_____ordonnee_a_l_origine_B_de_la_droite);
                                        /* Le 20050623153703, "B=" a ete remplace par "Bd=" (double definition...).                  */
                         GET_ARGUMENT_F("pd=""pas_droite=",rdn_iteratif_cercle_____pas_de_parcours_de_la_droite);
                                        /* Le 20050623153703, "pas=" a ete remplace par "pas_droite=" et "pd=" (double def...).      */
                         GET_ARGUMENT_F("rayon=",rdn_iteratif_cercle_____rayon_minimal_des_cercles);
                         GET_ARGUMENT_F("facteur=""extension=",rdn_iteratif_cercle_____facteur_d_extension_du_rayon_des_cercles);
                         GET_ARGUMENT_I("saut=",rdn_iteratif_cercle_____nombre_de_nombres_aleatoires_a_sauter);
                         GET_ARGUMENT_F("nombre=",rdn_iteratif_cercle_____nombre_aleatoire_courant);
                         GET_ARGUMENT_L("premiere_racine=",rdn_iteratif_cercle_____prendre_la_premiere_racine);

                         GET_ARGUMENT_I("dephasage=",dephasage_initial);

                         GET_ARGUMENT_L("informations=""editer=",editer_toutes_les_informations);
                         GET_ARGUMENT_L("coordonnees=",editer_les_coordonnees);
                         GET_ARGUMENT_L("angles=",editer_les_angles);
                         GET_ARGUMENT_L("radians=",editer_les_angles_en_radians);
                         GET_ARGUMENT_N("degres=",editer_les_angles_en_radians);
                         GET_ARGUMENT_L("statistiques=",editer_les_statistiques);

                         GET_ARGUMENT_P("droites=",niveau_des_droites);
                         GET_ARGUMENT_P("segments=",niveau_des_segments);

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
                                        /* Cette procedure fut introduite le 20061226190122...                                       */
                         )
                    );

     Test(IFET(IL_FAUT(editer_toutes_les_informations),IL_NE_FAUT_PAS(editer_les_coordonnees)))
          Bblock
          EGAL(editer_les_coordonnees,VRAI);
                                        /* Afin de vraiment tout editer...                                                           */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IL_FAUT(editer_toutes_les_informations),IL_NE_FAUT_PAS(editer_les_angles)))
          Bblock
          EGAL(editer_les_angles,VRAI);
                                        /* Afin de vraiment tout editer...                                                           */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IL_FAUT(editer_toutes_les_informations),IL_NE_FAUT_PAS(editer_les_statistiques)))
          Bblock
          EGAL(editer_les_statistiques,VRAI);
                                        /* Afin de vraiment tout editer...                                                           */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA1,nom_imageE))))
                                        /* Definition de l'Espace de generation des droites aleatoires ('A1').                       */
          Bblock
          DEFV(pointF_2D,DdTb1(POINTERs
                              ,liste_des_points
                              ,nombre_de_points
                              ,tMalo(MUL2(nombre_de_points,SIZE(pointF_2D)),pointF_2D)
                               )
               );
          DEFV(Int,INIT(point,PREMIER_POINT));
          DEFV(Int,INIT(point_A,UNDEF));
          DEFV(Int,INIT(point_B,UNDEF));
          DEFV(Int,INIT(point_C,UNDEF));
          DEFV(Int,INIT(point_D,UNDEF));
                                        /* Definition de la liste des points et des index d'acces...                                 */

          DEFV(Int,INIT(nombre_de_points_dans_l_Espace,ZERO));
                                        /* Nombre total de cas traites parmi 'nombre_de_points'...                                   */

          DEFV(pointI_2D,point_courant_de_l_espace_de_parametrage_2D);
          DEFV(pointI_3D,point_courant_de_l_espace_de_parametrage_3D);
                                        /* Point courant d'un espace abstrait servant a parametrer le generateur d'evenements.       */

          SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL_GLOBAL,SPIRALE_DELTA_VERTICAL_GLOBAL)
                                        /* Donnees de generation d'une spirale de parcours d'un espace abstrait bidimensionnel       */
                                        /* de parametrage de la generation des evenements.                                           */

                                        /* ATTENTION : jusqu'au 20010926155950, il y avait ici :                                     */
                                        /*                                                                                           */
                                        /*                  SPIRALE_REINITIALISATION_BRAS_ET_DELTAS;                                 */
                                        /*                                                                                           */
                                        /* qui provenait d'un "copier-coller" un peu large. Il ne sert a rien et a ete supprime...   */

          SPIRALE_VALIDATION;
                                        /* Validation des pas de parcours (pasX,pasY) de l'Espace abstrait de parametrage du         */
                                        /* generateur d'evenements.                                                                  */
          INITIALISATION_POINT_2D(point_courant_de_l_espace_de_parametrage_2D,Xmin,Ymin);
          INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage_3D,Xmin,Ymin,Zmin);
                                        /* Initialisation de l'espace de parametrage independante du format de l'image, puisque le   */
                                        /* point 'min' n'en depend pas...                                                            */

          Test(IL_NE_FAUT_PAS(utiliser_le_generateur_a_periodicite_parametrable))
               Bblock
               Repe(dephasage_initial)
                    Bblock
                    DEFV(Float,INIT(valeur_aleatoire_sautee,FLOT__UNDEF));
                    GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(valeur_aleatoire_sautee
                                                              ,COORDONNEE_BARYCENTRIQUE_MINIMALE
                                                              ,COORDONNEE_BARYCENTRIQUE_MAXIMALE
                                                               );
                                        /* Et on saute eventuellement les 'dephasage_initial' premieres valeurs aleatoires...        */
                    Eblock
               ERep
               Eblock
          ATes
               Bblock
               Test(IZNE(dephasage_initial))
                    Bblock
                    PRINT_ERREUR("le dephasage est incompatible avec l'utilisation du generateur aleatoire periodique");
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ETes

          CALi(FgERASE());

          SET_ANTI_ALIASING(VRAI);
                                        /* Mise en place systematique de l'anti-aliasing...                                          */

          EGAL(point,PREMIER_POINT);

          Test(EST_VRAI(l_espace_est_l_espace_de_tirage_aleatoire))
               Bblock
               CALS(Ihistogramme(ImageA1));
                                        /* Calcul de l'histogramme de l'Espace (introduit le 20050502092743).                        */

               Test(IFLT(ACCES_HISTOGRAMME(interieur_de_l_espace),NEUT(nombre_de_points)))
                                        /* Test introduit le 20050502092743... On notera qu'il serait peut-etre logique de           */
                                        /* remplacer 'NEUT(...)' par un 'GRO?(...)' car, en effet, il convient que l'Espace de       */
                                        /* tirage aleatoire ait beaucoup plus de points que demandes (l'Espace de tirage aleatoire   */
                                        /* doit etre evidemment plus dense que l'ensemble des points aleatoires eux-memes...).       */
                    Bblock
                    PRINT_ERREUR("l'Espace de tirage aleatoire n'est pas assez dense");
                    CAL1(Prer2("(%d points aleatoires sont demandes et l'Espace de tirage aleatoire n'en contient que %d)\n"
                              ,nombre_de_points
                              ,ACCES_HISTOGRAMME(interieur_de_l_espace)
                               )
                         );
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Tant(IFLT(nombre_de_points_dans_l_Espace,nombre_de_points))
                    Bblock
                    DEFV(pointI_2D,point_courant_aleatoire);

                    GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(ASD1(point_courant_aleatoire,x),FLOT(Xmin),FLOT(Xmax));
                    GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(ASD1(point_courant_aleatoire,y),FLOT(Ymin),FLOT(Ymax));
                                        /* Definition du point courant de la droite aleatoire...                                     */

                    Test(IFEQ(load_point(ImageA1,ASD1(point_courant_aleatoire,x),ASD1(point_courant_aleatoire,y))
                             ,interieur_de_l_espace
                              )
                         )
                         Bblock
                                        /* Cas ou le point courant est dans l'Espace, on le conserve :                               */
                         TRANSFERT_POINT_2D(ACCES_POINT(point),point_courant_aleatoire);

                         INCR(nombre_de_points_dans_l_Espace,I);
                         INCR(point,I);
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou le point courant est a l'exterieur de l'Espace, on l'ignore...                     */
                         Eblock
                    ETes
                    Eblock
               ETan
               Eblock
          ATes
               Bblock
               begin_image
                    Bblock
                    Test(IFEQ(load_point(ImageA1,X,Y)
                             ,interieur_de_l_espace
                              )
                         )
                         Bblock
                                        /* Cas ou le point courant est dans l'Espace, on le conserve :                               */
                         Test(IFLT(nombre_de_points_dans_l_Espace,nombre_de_points))
                                        /* S'il y a encore de la place...                                                            */
                              Bblock
                              INITIALISATION_POINT_2D(ACCES_POINT(point),X,Y);

                              INCR(nombre_de_points_dans_l_Espace,I);
                              INCR(point,I);
                              Eblock
                         ATes
                              Bblock
                              PRINT_ERREUR("il y a trop de points dans l'Espace et seuls les premiers seront utilises");
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou le point courant est a l'exterieur de l'Espace, on l'ignore...                     */
                         Eblock
                    ETes
                    Eblock
               end_image

               Test(IFLT(nombre_de_points_dans_l_Espace,nombre_de_points))
                                        /* Test introduit le 20050502092743...                                                       */
                    Bblock
                    PRINT_ERREUR("il n'y a pas assez de points dans l'Espace");
                    CAL1(Prer2("(%d points avaient ete demandes et seulement %d ont ete trouves)\n"
                              ,nombre_de_points
                              ,nombre_de_points_dans_l_Espace
                               )
                         );
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ETes

          Test(IL_FAUT(editer_les_coordonnees))
               Bblock
               DoIn(point,PREMIER_POINT,LSTX(PREMIER_POINT,nombre_de_points_dans_l_Espace),I)
                    Bblock
                    CAL2(Prin2("point aleatoire..................... : X=%f Y=%f\n"
                              ,ASD1(ACCES_POINT(point),x)
                              ,ASD1(ACCES_POINT(point),y)
                               )
                         );
                    Eblock
               EDoI
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          DoIn(point_A,PREMIER_POINT,LSTX(PREMIER_POINT,nombre_de_points_dans_l_Espace),I)
               Bblock
               DoIn(point_B,point_A,LSTX(PREMIER_POINT,nombre_de_points_dans_l_Espace),I)
                    Bblock
                    DoIn(point_C,PREMIER_POINT,LSTX(PREMIER_POINT,nombre_de_points_dans_l_Espace),I)
                         Bblock
                         DoIn(point_D,point_C,LSTX(PREMIER_POINT,nombre_de_points_dans_l_Espace),I)
                              Bblock
                              Test(I4ET(IFLT(point_A,point_B),IFLT(point_C,point_D),IFLE(point_A,point_C),IFLE(point_B,point_D)))
                                   Bblock
                                        /* Cas ou les points {A,B} et {C,D} definissent chacun une droite :                          */
                                        /*                                                                                           */
                                        /* ATTENTION : on notera que malgre tout deux points d'index differents, peuvent etre        */
                                        /* geometriquement confondus (meme s'il s'agit d'un evenement rare...), mais cela est        */
                                        /* detecte plus loin en testant la nullite de 'delta_X_??' et de 'delta_Y_AB??"...           */
                                        /*                                                                                           */
                                        /* ATTENTION : on notera que ces tests sont destines a eviter de traiter deux fois le meme   */
                                        /* couple de droite, mais dans un ordre different...                                         */
                                   DEFV(Float,INIT(delta_X_AB,SOUS(ASD1(ACCES_POINT(point_B),x),ASD1(ACCES_POINT(point_A),x))));
                                   DEFV(Float,INIT(delta_Y_AB,SOUS(ASD1(ACCES_POINT(point_B),y),ASD1(ACCES_POINT(point_A),y))));
                                   DEFV(Float,INIT(delta_X_CD,SOUS(ASD1(ACCES_POINT(point_D),x),ASD1(ACCES_POINT(point_C),x))));
                                   DEFV(Float,INIT(delta_Y_CD,SOUS(ASD1(ACCES_POINT(point_D),y),ASD1(ACCES_POINT(point_C),y))));

                                   DEFV(Float,INIT(coefficient_a_de_AB,FLOT__UNDEF));
                                   DEFV(Float,INIT(coefficient_b_de_AB,FLOT__UNDEF));
                                   DEFV(Float,INIT(coefficient_c_de_AB,FLOT__UNDEF));

                                   DEFV(Float,INIT(coefficient_a_de_CD,FLOT__UNDEF));
                                   DEFV(Float,INIT(coefficient_b_de_CD,FLOT__UNDEF));
                                   DEFV(Float,INIT(coefficient_c_de_CD,FLOT__UNDEF));

                                   Test(IFET(IFOU(IZNE(delta_X_AB),IZNE(delta_Y_AB))
                                            ,IFOU(IZNE(delta_X_CD),IZNE(delta_Y_CD))
                                             )
                                        )
                                        Bblock
                                        /* Cas ou les points 'A' et 'B' ('C' et 'D' respectivement) sont geometriquement             */
                                        /* differents :                                                                              */
                                        EQUATION_D_UNE_DROITE(point_A
                                                             ,point_B
                                                             ,delta_X_AB
                                                             ,delta_Y_AB
                                                             ,coefficient_a_de_AB
                                                             ,coefficient_b_de_AB
                                                             ,coefficient_c_de_AB
                                                              );
                                        /* Definition de la droite 'AB'.                                                             */
                                        EQUATION_D_UNE_DROITE(point_C
                                                             ,point_D
                                                             ,delta_X_CD
                                                             ,delta_Y_CD
                                                             ,coefficient_a_de_CD
                                                             ,coefficient_b_de_CD
                                                             ,coefficient_c_de_CD
                                                              );
                                        /* Definition de la droite 'CD'.                                                             */

                                        Test(IFOU(IFNE(coefficient_a_de_AB,coefficient_a_de_CD)
                                                 ,IFNE(coefficient_b_de_AB,coefficient_b_de_CD)
                                                  )
                                             )
                                             Bblock
                                        /* Cas ou les deux droites 'AB' et 'CD' sont distinctes et non paralleles :                  */
                                             DEFV(Float,INIT(angle_entre_AB_et_CD
                                                            ,SOUA(ATAN(delta_Y_AB,delta_X_AB)
                                                                 ,ATAN(delta_Y_CD,delta_X_CD)
                                                                  )
                                                             )
                                                  );
                                        /* Angle dans [0,2.pi] entre les vecteurs 'AB' et 'CD'.                                      */

                                             Test(IFGT(angle_entre_AB_et_CD,PI))
                                                  Bblock
                                                  EGAL(angle_entre_AB_et_CD,SOUS(angle_entre_AB_et_CD,PI));
                                        /* L'angle entre les vecteurs 'AB' et 'CD' est d'abord ramene dans [0,pi],                   */
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  Eblock
                                             ETes

                                             Test(IFGT(angle_entre_AB_et_CD,PI_SUR_2))
                                                  Bblock
                                                  EGAL(angle_entre_AB_et_CD,SOUS(PI,angle_entre_AB_et_CD));
                                        /* Puis dans [0,pi/2]...                                                                     */
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  Eblock
                                             ETes

                                             Test(IL_FAUT(editer_les_angles))
                                                  Bblock
                                                  Test(IL_FAUT(editer_toutes_les_informations))
                                                       Bblock
                                                       CAL2(Prin4("points.............................. : %d %d %d %d\n"
                                                                 ,point_A,point_B
                                                                 ,point_C,point_D
                                                                  )
                                                            );
                                                       CAL2(Prin4("droite 'AB'......................... : {A={%f,%f},B={%f,%f}}"
                                                                 ,ASD1(ACCES_POINT(point_A),x),ASD1(ACCES_POINT(point_A),y)
                                                                 ,ASD1(ACCES_POINT(point_B),x),ASD1(ACCES_POINT(point_B),y)
                                                                  )
                                                            );
                                                       CAL2(Prin3(" a=%f b=%f c=%f\n"
                                                                 ,coefficient_a_de_AB
                                                                 ,coefficient_b_de_AB
                                                                 ,coefficient_c_de_AB
                                                                  )
                                                            );
                                                       CAL2(Prin4("droite 'CD'......................... : {C={%f,%f},D={%f,%f}}"
                                                                 ,ASD1(ACCES_POINT(point_C),x),ASD1(ACCES_POINT(point_C),y)
                                                                 ,ASD1(ACCES_POINT(point_D),x),ASD1(ACCES_POINT(point_D),y)
                                                                  )
                                                            );
                                                       CAL2(Prin3(" a=%f b=%f c=%f\n"
                                                                 ,coefficient_a_de_CD
                                                                 ,coefficient_b_de_CD
                                                                 ,coefficient_c_de_CD
                                                                  )
                                                            );

                                                       Test(IL_FAUT(editer_les_angles_en_radians))
                                                            Bblock
                                                            CAL2(Prin0("angle (en radians).................. : "));
                                                            Eblock
                                                       ATes
                                                            Bblock
                                                            CAL2(Prin0("angle (en degres)................... : "));
                                                            Eblock
                                                       ETes
                                                       Eblock
                                                  ATes
                                                       Bblock
                                                       Eblock
                                                  ETes

                                                  CAL2(Prin2(Cara(chain_Aconcaten5(INTRODUCTION_FORMAT
                                                                                  ,valeurs_signees
                                                                                  ,".*"
                                                                                  ,format_d_edition
                                                                                  ,"\n"
                                                                                   )
                                                                  )
                                                            ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales)
                                                            ,COND(IL_FAUT(editer_les_angles_en_radians)
                                                                 ,NEUT(angle_entre_AB_et_CD)
                                                                 ,CONVERSION_RADIANS_EN_DEGRES(angle_entre_AB_et_CD)
                                                                  )
                                                             )
                                                       );
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  Eblock
                                             ETes

                                             Test(IFNE_chaine(nom_imageR,NOM_PIPE))
                                                  Bblock
                                                  Test(IFNE(niveau_des_droites,NOIR))
                                                       Bblock
                                                       SET_COULEURS(NOIR,niveau_des_droites);

                                                       TRACE_D_UNE_DROITE(coefficient_a_de_AB
                                                                         ,coefficient_b_de_AB
                                                                         ,coefficient_c_de_AB
                                                                          );
                                                       TRACE_D_UNE_DROITE(coefficient_a_de_CD
                                                                         ,coefficient_b_de_CD
                                                                         ,coefficient_c_de_CD
                                                                          );
                                        /* Trace des droites 'AB' et 'CD'...                                                         */
                                                       Eblock
                                                  ATes
                                                       Bblock
                                                       Eblock
                                                  ETes

                                                  Test(IFNE(niveau_des_segments,NOIR))
                                                       Bblock
                                                       SET_COULEURS(niveau_des_droites,niveau_des_segments);

                                                       TRACE_D_UN_SEGMENT(point_A,point_B);
                                                       TRACE_D_UN_SEGMENT(point_C,point_D);
                                        /* Trace des segments 'AB' et 'CD'...                                                        */
                                        /*                                                                                           */
                                        /* ATTENTION : je note le 20050627155730 qu'etant donne que l'on trace ci-dessus les         */
                                        /* droites 'AB' et 'CD', puis ici et maintenant les segments 'AB' et 'CD', ces derniers      */
                                        /* sont donc traces deux fois (une fois sur les droites et une seconde fois en tant que      */
                                        /* tel...). Cela a donc des consequences desastreuses en ce qui concerne l'anti-aliasing     */
                                        /* des segments 'AB' et 'CD'. C'est pourquoi, a cette date, le :                             */
                                        /*                                                                                           */
                                        /*                  SET_COULEURS(NOIR,niveau_des_segments);                                  */
                                        /*                                                                                           */
                                        /* ci-dessus a ete modifie pour arranger considerablement les choses (meme si cela n'est     */
                                        /* pas parfait...).                                                                          */
                                                       Eblock
                                                  ATes
                                                       Bblock
                                                       Eblock
                                                  ETes
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  Eblock
                                             ETes
                                             Eblock
                                        ATes
                                             Bblock
                                        /* Cas ou les deux droites 'AB' et 'CD' sont confondues...                                   */
                                             Eblock
                                        ETes
                                        Eblock
                                   ATes
                                        Bblock
                                        /* Cas ou les points 'A' et 'B' ('C' et 'D' respectivement) sont geometriquement             */
                                        /* confondus...                                                                              */
                                        Eblock
                                   ETes
                                   Eblock
                              ATes
                                   Bblock
                                        /* Cas ou les points {A,B} ou {C,D} ne definissent pas une droite...                         */
                                   Eblock
                              ETes
                              Eblock
                         EDoI
                         Eblock
                    EDoI
                    Eblock
               EDoI
               Eblock
          EDoI

          Test(IL_FAUT(editer_les_statistiques))
               Bblock
               CAL2(Prin0("\n\n"));
               CAL2(Prin1("nombre de points demandes........... = %d\n",nombre_de_points));
               CAL2(Prin1("nombre de points dans l'Espace...... = %d\n",nombre_de_points_dans_l_Espace));
               CAL2(Prin0("\n"));
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFNE_chaine(nom_imageR,NOM_PIPE))
               Bblock
               CALi(Iupdate_image(nom_imageR,ImageG));
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          FdTb1(liste_des_points,nombre_de_points,pointF_2D,ADRESSE_PLUS_DEFINIE);
                                        /* Definition de la liste des points...                                                      */
          Eblock
     ATes
          Bblock
          Test__CODE_ERREUR__ERREUR07;
          Eblock
     ETes

     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.