/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A D O X E   D E   B E R T R A N D   G E N E R A L I S E  :                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    Cette commande traite le paradoxe de                                                                           */
/*                  Bertrand generalise et s'inspire du                                                                              */
/*                  programme 'v $xtc/Paradoxe.01$c'.                                                                                */
/*                                                                                                                                   */
/*                    Cette commande a ete realisee suite au cours                                                                   */
/*                  donne au CMAP par Christian Leonard ("Quelques                                                                   */
/*                  Lecons sur l'Entropie") a partir du 20041021...                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Paradoxe de Bertrand :                                                                                                     */
/*                                                                                                                                   */
/*                    On retrouve le paradoxe de Bertrand original                                                                   */
/*                  a condition de choisir :                                                                                         */
/*                                                                                                                                   */
/*                                      A1 = Espace  = image binaire carree ou rectangulaire,                                        */
/*                                      A2 = Domaine = image binaire circulaire centree generee, par exemple,                        */
/*                                                     par '$xci/gauss$X' puis '$xci/seuil$X seuil=200'.                             */
/*                                                                                                                                   */
/*                  ensuite, il faut faire une partition de tous les cas                                                             */
/*                  d'intersection des droites aleatoires et du disque                                                               */
/*                  suivant la valeur de la variable 'rapport_de_la_masse_superieure_a_la_masse_totale'                              */
/*                  par rapport a 'seuil' et '1-seuil', ou 'seuil' vaut :                                                            */
/*                                                                                                                                   */
/*                                                             ___                                                                   */
/*                                                            /                                                                      */
/*                                                 4.pi - 3.\/  3                                                                    */
/*                                      seuil   = ----------------- ~ 0.1955011094778853                                             */
/*                                                      12.pi                                                                        */
/*                                                                                                                                   */
/*                                      1-seuil ~ 0.8044988905221147                                                                 */
/*                                                                                                                                   */
/*                  ce qui correspond au rapport de l'aire d'un secteur                                                              */
/*                  circulaire compris entre le cercle unite et l'un des                                                             */
/*                  cotes d'un triangle equilateral inscrit et de l'aire                                                             */
/*                  de ce meme cercle unite...                                                                                       */
/*                                                                                                                                   */
/*                    Les cas situes dans [seuil,1-seuil] correspondent aux cas                                                      */
/*                  ou la corde (intersection de la droite et du disque) est                                                         */
/*                  superieure ou egale au cote d'un triangle equilateral inscrit                                                    */
/*                  dans le paradoxe de Bertrand original. L'extraction de ces cas                                                   */
/*                  pourra se faire a l'aide de :                                                                                    */
/*                                                                                                                                   */
/*                                      $xrv/INCLcc.11$X    ne=0      fichierX=<ListeDesProportionsDeTousLesCasDIintersection>    \  */
/*                                                                    fichierA=0.1955011094778853                                 \  */
/*                                                                    fichierB=0.8044988905221147                                 \  */
/*                                                                    valeurs=VRAI                                                   */
/*                                                                                                                                   */
/*                    Ensuite le rapport entre le nombre de ces cas dans [seuil,1-seuil]                                             */
/*                  et le nombre total de cas (de droites intersectant le disque                                                     */
/*                  unite...) donne la probabilite cherchee (~0.5).                                                                  */
/*                                                                                                                                   */
/*                    A titre d'exemple le 20050111103349 sur '$LACT17', 1000000 iterations                                          */
/*                  furent demandees. Cela a donne 318134 cas d'intersection et parmi eux,                                           */
/*                  161744 cas ou la corde etait superieure ou egale au cote du                                                      */
/*                  triangle equilateral inscrit. Cela fait donc une probabilite                                                     */
/*                  egale a 161744/318134=0.5084 (donc tres proche de 0.5).                                                          */
/*                  Voir a ce propos l'image 'v $xiirk/BERT.11'.                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrk/ParadoxeB.01$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20050106093310).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   EXTERIEUR_DU_DOMAINE                                                                                                          \
                    GRIS_0
#define   INTERIEUR_DU_DOMAINE                                                                                                          \
                    NOIR_PLANCHER
                                        /* Definition de l'interieur et de l'exterieur du Domaine que les droites aleatoires         */
                                        /* doivent intersecter.                                                                      */

#define   NOMBRE_D_ITERATIONS                                                                                                           \
                    MILLE                                                                                                               \
                                        /* Nombre d'iterations du processus aleatoire...                                             */

#define   EDITER_TOUTES_LES_INFORMATIONS                                                                                                \
                    FAUX                                                                                                                \
                                        /* Faut-il editer toutes les informations ('VRAI') ou uniquement les proportions ('FAUX') ?  */ \
                                        /* La valeur par defaut est passee de 'VRAI' a 'FAUX' le 20050107094905...                   */
#define   EDITER_LES_PROPORTIONS                                                                                                        \
                    VRAI                                                                                                                \
                                        /* Faut-il editer les proportions ('VRAI') ou pas ('FAUX') ?                                 */
#define   EDITER_LA_PROBABILITE                                                                                                         \
                    FAUX                                                                                                                \
                                        /* Faut-il editer la probabilite des rapports inclus dans [seuil,1-seuil] ('VRAI') ou        */ \
                                        /* pas ('FAUX') ? Ceci a ete introduit le 20050125140312...                                  */

#define   EPSILON_D_APPARTENANCE_A_LA_DROITE                                                                                            \
                    FRA1(FRA10(FU))                                                                                                     \
                                        /* Pour un test approche d'appartenance a la droite...                                       */
#define   EPSILON_DE_VALIDATION_DES_MASSES                                                                                              \
                    FRA1(FRA10(FU))                                                                                                     \
                                        /* Pour un test approche de validation du calcul des masses...                               */

#define   SEUIL_DES_RAPPORTS_DE_LA_MASSE_SUPERIEURE_A_LA_MASSE_TOTALE                                                                   \
                    DIVI(SOUS(GRO4(PI),GRO3(RACX(TROIS))),GRO12(PI))                                                                    \
                                        /* Seuil de 'rapport_de_la_masse_superieure_a_la_masse_totale' correspondant au paradoxe de  */ \
                                        /* Bertrand original...                                                                      */
#define   VISUALISER_AVEC_DEUX_NIVEAUX                                                                                                  \
                    VRAI                                                                                                                \
                                        /* Faut-il visualiser avec deux niveaux ('VRAI') ou avec plusieurs ('FAUX') ? Ceci a ete     */ \
                                        /* introduit le 20050120210430...                                                            */

#define   NIVEAU_DES_DROITES_DE_RAPPORT_INFERIEUR_AU_SEUIL                                                                              \
                    GRIS_4
#define   NIVEAU_DES_DROITES_DE_RAPPORT_SUPERIEUR_AU_SEUIL                                                                              \
                    GRIS_8
                                        /* Niveaux de trace des droites intersectant le Domaine suivant la position de               */
                                        /* 'rapport_de_la_masse_superieure_a_la_masse_totale' par rapport au seuil dans le           */
                                        /* cas 'IL_FAUT(visualiser_avec_deux_niveaux)' (introduit le 20050120210430).                */
#define   NIVEAU_DES_DROITES_DE_RAPPORT_MINIMAL                                                                                         \
                    GRIS_4
#define   NIVEAU_DES_DROITES_DE_RAPPORT_MAXIMAL                                                                                         \
                    GRIS_8
                                        /* Niveaux de trace des droites intersectant le Domaine suivant la position de               */
                                        /* 'rapport_de_la_masse_superieure_a_la_masse_totale' par rapport au seuil dans le           */
                                        /* cas 'IL_NE_FAUT_PAS(visualiser_avec_deux_niveaux)' (introduit le 20050120210430).         */

#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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A D O X E   D E   B E R T R A N D   G E N E R A L I S E  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
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_imageD),NOM_PIPE));
                                        /* Definition du Domaine que les droites aleatoires doivent intersecter.                     */
     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(genere_p,INIT(exterieur_du_domaine,EXTERIEUR_DU_DOMAINE));
     DEFV(genere_p,INIT(interieur_du_domaine,INTERIEUR_DU_DOMAINE));
                                        /* Definition de l'interieur et de l'exterieur du Domaine que les droites aleatoires         */
                                        /* doivent intersecter.                                                                      */

     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_d_iterations,NOMBRE_D_ITERATIONS));
                                        /* Nombre d'iterations du processus aleatoire...                                             */

     DEFV(Logical,INIT(editer_toutes_les_informations,EDITER_TOUTES_LES_INFORMATIONS));
                                        /* Faut-il editer toutes les informations ('VRAI') ou uniquement les proportions ('FAUX') ?  */
                                        /* La valeur par defaut est passee de 'VRAI' a 'FAUX' le 20050107094905...                   */
     DEFV(Logical,INIT(editer_les_proportions,EDITER_LES_PROPORTIONS));
                                        /* Faut-il editer les proportions ('VRAI') ou pas ('FAUX') ?                                 */
     DEFV(Logical,INIT(editer_la_probabilite,EDITER_LA_PROBABILITE));
                                        /* Faut-il editer la probabilite des rapports inclus dans [seuil,1-seuil] ('VRAI') ou        */
                                        /* pas ('FAUX') ? Ceci a ete introduit le 20050125140312...                                  */

     DEFV(Float,INIT(seuil_des_rapports_de_la_masse_superieure_a_la_masse_totale
                    ,SEUIL_DES_RAPPORTS_DE_LA_MASSE_SUPERIEURE_A_LA_MASSE_TOTALE
                     )
          );

                                        /* Seuil de 'rapport_de_la_masse_superieure_a_la_masse_totale' correspondant au paradoxe de  */
                                        /* Bertrand original...                                                                      */

     DEFV(Float,INIT(epsilon_d_appartenance_a_la_droite,EPSILON_D_APPARTENANCE_A_LA_DROITE));
                                        /* Pour un test approche d'appartenance a la droite...                                       */
     DEFV(Float,INIT(epsilon_de_validation_des_masses,EPSILON_DE_VALIDATION_DES_MASSES));
                                        /* Pour un test approche de validation du calcul des masses...                               */

     DEFV(Logical,INIT(visualiser_avec_deux_niveaux,VISUALISER_AVEC_DEUX_NIVEAUX));
                                        /* Faut-il visualiser avec deux niveaux ('VRAI') ou avec plusieurs ('FAUX') ? Ceci a ete     */
                                        /* introduit le 20050120210430...                                                            */
     DEFV(genere_p,INIT(niveau_des_droites_de_rapport_inferieur_au_seuil,NIVEAU_DES_DROITES_DE_RAPPORT_INFERIEUR_AU_SEUIL));
     DEFV(genere_p,INIT(niveau_des_droites_de_rapport_superieur_au_seuil,NIVEAU_DES_DROITES_DE_RAPPORT_SUPERIEUR_AU_SEUIL));
                                        /* Niveaux de trace des droites intersectant le Domaine suivant la position de               */
                                        /* 'rapport_de_la_masse_superieure_a_la_masse_totale' par rapport au seuil dans le           */
                                        /* cas 'IL_FAUT(visualiser_avec_deux_niveaux)' (introduit le 20050120210430).                */
     DEFV(genere_p,INIT(niveau_des_droites_de_rapport_minimal,NIVEAU_DES_DROITES_DE_RAPPORT_MINIMAL));
     DEFV(genere_p,INIT(niveau_des_droites_de_rapport_maximal,NIVEAU_DES_DROITES_DE_RAPPORT_MAXIMAL));
                                        /* Niveaux de trace des droites intersectant le Domaine suivant la position de               */
                                        /* 'rapport_de_la_masse_superieure_a_la_masse_totale' par rapport au seuil dans le           */
                                        /* cas 'IL_NE_FAUT_PAS(visualiser_avec_deux_niveaux)' (introduit le 20050120210430).         */

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

                         GET_ARGUMENT_C("imageE=""E=""A1=",nom_imageE);
                         GET_ARGUMENT_C("imageD=""D=""A2=",nom_imageD);
                         GET_ARGUMENT_C("imageR=""R=",nom_imageR);

                         GET_ARGUMENT_P("exte=",exterieur_de_l_espace);
                         GET_ARGUMENT_P("inte=",interieur_de_l_espace);
                         GET_ARGUMENT_P("extd=",exterieur_du_domaine);
                         GET_ARGUMENT_P("intd=",interieur_du_domaine);

                         GET_ARGUMENT_I("iterations=",nombre_d_iterations);
                                        /* Le 20050623153309, "nombre=" a ete supprime (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=""A=",rdn_iteratif_cercle_____pente_A_de_la_droite);
                         GET_ARGUMENT_F("ordonnee=""B=",rdn_iteratif_cercle_____ordonnee_a_l_origine_B_de_la_droite);
                         GET_ARGUMENT_F("pas=",rdn_iteratif_cercle_____pas_de_parcours_de_la_droite);
                         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("proportions=",editer_les_proportions);
                         GET_ARGUMENT_L("probabilite=""proba=",editer_la_probabilite);

                         GET_ARGUMENT_F("epsilon_droite=""epsd=",epsilon_d_appartenance_a_la_droite);
                         GET_ARGUMENT_F("epsm=""epsilon_masse=",epsilon_de_validation_des_masses);

                         GET_ARGUMENT_F("seuil=",seuil_des_rapports_de_la_masse_superieure_a_la_masse_totale);

                         GET_ARGUMENT_L("c2=""bicolore=",visualiser_avec_deux_niveaux);
                         GET_ARGUMENT_N("multicolore=""cn=""cN=",visualiser_avec_deux_niveaux);
                         GET_ARGUMENT_P("niveau_inferieur_2=""ni2=",niveau_des_droites_de_rapport_inferieur_au_seuil);
                         GET_ARGUMENT_P("ns2=""niveau_superieur_2=",niveau_des_droites_de_rapport_superieur_au_seuil);
                         GET_ARGUMENT_P("niveau_inferieur_N=""nin=""niN=",niveau_des_droites_de_rapport_minimal);
                         GET_ARGUMENT_P("nsn=""nsN=""niveau_superieur_N=",niveau_des_droites_de_rapport_maximal);

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

     CALi(FgERASE());
                                        /* Initialisation de l'image Resultat. Jusqu'au 20050111141712, il y avait ici :             */
                                        /*                                                                                           */
                                        /*                  CALi(Inoir(ImageG));                                                     */
                                        /*                                                                                           */
                                        /* par erreur...                                                                             */

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

     Test(IFET(IL_FAUT(editer_toutes_les_informations),IL_NE_FAUT_PAS(editer_la_probabilite)))
          Bblock
          EGAL(editer_la_probabilite,VRAI);
                                        /* Afin de vraiment tout editer (introduit le 20050125170902)...                             */
          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
          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA2,nom_imageD))))
                                        /* Definition du Domaine que les droites aleatoires doivent intersecter ('A2').              */
               Bblock
               DEFV(Int,INIT(nombre_de_cas_traites,ZERO));
                                        /* Nombre total de cas traites parmi 'nombre_d_iterations'...                                */
               DEFV(Int,INIT(nombre_de_cas_traites_de_rapport_important,ZERO));
                                        /* Nombre total de cas pour lesquels 'rapport_de_la_masse_superieure_a_la_masse_totale' est  */
                                        /* inclus dans [seuil,1-seuil], ce que l'on appelera donc un "rapport important" ('seuil'    */
                                        /* designant 'seuil_des_rapports_de_la_masse_superieure_a_la_masse_totale') ; au passage,    */
                                        /* on n'oubliera pas que 'R' et '1-R' sont equivalents par definition et ainsi l'importance  */
                                        /* de 'R' s'apprecie pas rapport a 1/2 et non pas par rapport a 1 ('R' designe evidemment    */
                                        /* 'rapport_de_la_masse_superieure_a_la_masse_totale'). Ceci a ete introduit le              */
                                        /* 20050125140312...                                                                         */

               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

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

               Repe(nombre_d_iterations)
                    Bblock
                    DEFV(pointI_2D,point_courant_de_la_droite);

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

                    Test(IFEQ(load_point(ImageA1,ASD1(point_courant_de_la_droite,x),ASD1(point_courant_de_la_droite,y))
                             ,interieur_de_l_espace
                              )
                         )
                         Bblock
                                        /* Cas ou le point courant de la droite est dans l'Espace, on le conserve :                  */
                         DEFV(Logical,INIT(on_a_trouve_au_moins_un_point_de_la_droite_dans_le_domaine,FAUX));
                                        /* Afin de savoir si droite intersecte le Domaine...                                         */
                         DEFV(Float,INIT(masse_inferieure,FZERO));
                         DEFV(Float,INIT(masse_superieure,FZERO));
                         DEFV(Float,INIT(masse_totale,FZERO));
                                        /* Pour connaitre la masse des points du Domaine situes "en-dessous" et "au-dessus" de       */
                                        /* la droite aleatoire. Le passage de la notion d'aire a celui de masse a eu lieu le         */
                                        /* 20050110133503 ce qui a permis d'exploiter l'ensemble des valeurs possibles de            */
                                        /* 'niveau_du_point_courant_du_domaine' vu alors comme un ensemble de densites...            */

                         DEFV(Float,INIT(angle_de_la_droite,FLOT__UNDEF));
                         DEFV(Float,INIT(coefficient_A,FLOT__UNDEF));
                         DEFV(Float,INIT(coefficient_B,FLOT__UNDEF));

                         GENERATION_DE_LA_VALEUR_ALEATOIRE_COURANTE(angle_de_la_droite,NEGA(PI_SUR_2),NEUT(PI_SUR_2));

                         EGAL(coefficient_A,TANX(angle_de_la_droite));
                         EGAL(coefficient_B
                             ,AXPB(NEGA(coefficient_A),ASD1(point_courant_de_la_droite,x),ASD1(point_courant_de_la_droite,y))
                              );
                                        /* Definition de la droite aleatoire...                                                      */

                         begin_image
                              Bblock
                              DEFV(genere_p,INIT(niveau_du_point_courant_du_domaine,load_point(ImageA2,X,Y)));

                              Test(IFEQ(niveau_du_point_courant_du_domaine,exterieur_du_domaine))
                                   Bblock
                                        /* Cas ou le point courant est a l'exterieur du Domaine, on l'ignore...                      */
                                   Eblock
                              ATes
                                   Bblock
                                   Test(IFGE(niveau_du_point_courant_du_domaine,interieur_du_domaine))
                                        Bblock
                                        /* Cas ou le point courant est a l'interieur du Domaine :                                    */
                                        DEFV(genere_Float,INIT(densite_du_point_courant_du_domaine
                                                              ,______NORMALISE_NIVEAU(niveau_du_point_courant_du_domaine)
                                                               )
                                             );

                                        DEFV(Float,INIT(equation_de_la_droite
                                                       ,LIN2(FU,FLOT(Y),NEGA(coefficient_A),FLOT(X),NEGA(coefficient_B))
                                                        )
                                             );

                                        Test(IZEQ_a_peu_pres(equation_de_la_droite
                                                            ,epsilon_d_appartenance_a_la_droite
                                                             )
                                             )
                                             Bblock
                                             EGAL(on_a_trouve_au_moins_un_point_de_la_droite_dans_le_domaine,VRAI);
                                             Eblock
                                        ATes
                                             Bblock
                                             Eblock
                                        ETes

                                        Test(IZGE(equation_de_la_droite))
                                             Bblock
                                             INCR(masse_superieure,densite_du_point_courant_du_domaine);
                                        /* Cas ou le point courant est "au-dessus" de la droite aleatoire...                         */
                                             Eblock
                                        ATes
                                             Bblock
                                             INCR(masse_inferieure,densite_du_point_courant_du_domaine);
                                        /* Cas ou le point courant est "au-dessous" de la droite aleatoire...                        */
                                             Eblock
                                        ETes

                                        INCR(masse_totale,densite_du_point_courant_du_domaine);
                                        Eblock
                                   ATes
                                        Bblock
                                        PRINT_ERREUR("un niveau du Domaine n'est ni a l'exterieur ni a l'interieur");
                                        Eblock
                                   ETes
                                   Eblock
                              ETes
                              Eblock
                         end_image

                         Test(IFNE_a_peu_pres_absolu(masse_totale
                                                    ,ADD2(masse_inferieure,masse_superieure)
                                                    ,epsilon_de_validation_des_masses
                                                     )
                              )
                              Bblock
                              PRINT_ERREUR("le calcul des masses est incorrect (1)");
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes

                         Test(EST_VRAI(on_a_trouve_au_moins_un_point_de_la_droite_dans_le_domaine))
                              Bblock
                              DEFV(Float,INIT(rapport_de_la_masse_superieure_a_la_masse_totale
                                             ,DIVI(masse_superieure,masse_totale)
                                              )
                                   );

                              INCR(nombre_de_cas_traites,I);

                              Test(INCLff(rapport_de_la_masse_superieure_a_la_masse_totale
                                         ,NEUT(seuil_des_rapports_de_la_masse_superieure_a_la_masse_totale)
                                         ,COMP(seuil_des_rapports_de_la_masse_superieure_a_la_masse_totale)
                                          )
                                   )
                                   Bblock
                                   INCR(nombre_de_cas_traites_de_rapport_important,I);
                                        /* Comptage introduit le 20050125140312...                                                   */
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              Test(IL_FAUT(editer_toutes_les_informations))
                                   Bblock
                                   CAL2(Prin0("\n"));
                                   CAL2(Prin2("point aleatoire.......................... : X=%d Y=%d\n"
                                             ,ASD1(point_courant_de_la_droite,x)
                                             ,ASD1(point_courant_de_la_droite,y)
                                              )
                                        );
                                   CAL2(Prin2("droite aleatoire......................... : Y=(%f)xX+(%f)\n"
                                             ,coefficient_A
                                             ,coefficient_B
                                              )
                                        );
                                   CAL2(Prin1("masse des points 'au-dessous'............ = %f\n",masse_inferieure));
                                   CAL2(Prin1("masse des points 'au-dessus'............. = %f\n",masse_superieure));
                                   CAL2(Prin1("masse totale des points.................. = %f\n",masse_totale));
                                   CAL2(Prin0("proportion............................... = "));
                                        /* On notera que cette proportion peut etre nulle dans le cas ou 'masse_superieure' est      */
                                        /* elle-meme nulle, ce qui correspond approximativement a une tangence de la droite et       */
                                        /* du Domaine...                                                                             */
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              Test(IL_FAUT(editer_les_proportions))
                                   Bblock
                                   Test(IZNE(masse_totale))
                                        Bblock
                                        CAL2(Prin2(Cara(chain_Aconcaten5(INTRODUCTION_FORMAT,valeurs_signees,".*",format_d_edition,"\n"))
                                                  ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales)
                                                  ,rapport_de_la_masse_superieure_a_la_masse_totale
                                                   )
                                             );
                                        /* Edition de la proportion de points "au-dessus" de la droite aleatoire...                  */
                                        /*                                                                                           */
                                        /* On rappelle le 20171012160942 que ce sont ces proportions qui sont visualisees sous       */
                                        /* forme d'histogramme dans des images du type 'v $xiirk/BERT.11'. On voit ainsi qu'il y a   */
                                        /* beaucoup plus de droites qui coupe "faiblement" le domaine (avec donc une intersection    */
                                        /* "legere") que de droite qui le coupe "lourdement" (avec donc une intersection "lourde").  */
                                        Eblock
                                   ATes
                                        Bblock
                                        PRINT_ERREUR("le calcul des masses est incorrect (2)");
                                        Eblock
                                   ETes
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              Test(IFNE_chaine(nom_imageR,NOM_PIPE))
                                        /* Test introduit le 20050111102612 pour accelerer le processus...                           */
                                   Bblock
                                   Test(IL_FAUT(visualiser_avec_deux_niveaux))
                                        Bblock
                                        SET_COULEURS(NOIR
                                                    ,COND(INCLff(rapport_de_la_masse_superieure_a_la_masse_totale
                                                                ,NEUT(seuil_des_rapports_de_la_masse_superieure_a_la_masse_totale)
                                                                ,COMP(seuil_des_rapports_de_la_masse_superieure_a_la_masse_totale)
                                                                 )
                                                         ,niveau_des_droites_de_rapport_superieur_au_seuil
                                                         ,niveau_des_droites_de_rapport_inferieur_au_seuil
                                                          )
                                                     );
                                        /* Cas d'une visualisation bicolore...                                                       */
                                        Eblock
                                   ATes
                                        Bblock
                                        SET_COULEURS(NOIR
                                                    ,GENP(NIVA(HOMO(COND(IFLE(rapport_de_la_masse_superieure_a_la_masse_totale,FDU)
                                                                        ,NEUT(rapport_de_la_masse_superieure_a_la_masse_totale)
                                                                        ,COMP(rapport_de_la_masse_superieure_a_la_masse_totale)
                                                                         )
                                                                   ,FZERO
                                                                   ,FDU
                                                                   ,FLOT(NIVR(niveau_des_droites_de_rapport_minimal))
                                                                   ,FLOT(NIVR(niveau_des_droites_de_rapport_maximal))
                                                                    )
                                                               )
                                                          )
                                                     );
                                        /* Cas d'une visualisation multicolore (introduite le 20050120210430)...                     */
                                        /*                                                                                           */
                                        /* On rappelle le 20171012160942 que plus l'intersection est "lourde", plus le niveau        */
                                        /* de visualisation de la droite aleatoire courante sera important...                        */
                                        Eblock
                                   ETes

                                   begin_nouveau_block
                                        Bblock
                                        DEFV(Int,INIT(Y_pour_Xmin,AXPB(coefficient_A,Xmin,coefficient_B)));
                                        DEFV(Int,INIT(X_pour_Ymin,DIVZ(SOUS(Ymin,coefficient_B),coefficient_A)));

                                        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,Xmax,coefficient_B)));

                                             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,DIVZ(SOUS(Ymax,coefficient_B),coefficient_A)));

                                             SET_CURSOR(_____cNORMALISE_OX(X_pour_Ymax)
                                                       ,_____cNORMALISE_OY(Ymax)
                                                       ,_____cNORMALISE_OZ(Zmin)
                                                        );
                                             Eblock
                                        ETes

                                        gB;
                                        /* Trace de la droite courante qui intersecte le Domaine...                                  */
                                        Eblock
                                   end_nouveau_block
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou le point courant de la droite est a l'exterieur de l'Espace, on l'ignore...        */
                         Eblock
                    ETes
                    Eblock
               ERep

               Test(IL_FAUT(editer_toutes_les_informations))
                    Bblock
                    CAL2(Prin0("\n\n"));
                    CAL2(Prin1("nombre d'iterations...................... = %d\n",nombre_d_iterations));
                    CAL2(Prin1("nombre de cas traites.................... = %d\n",nombre_de_cas_traites));
                    CAL2(Prin1("nombre de cas traites superieurs au seuil = %d\n",nombre_de_cas_traites_de_rapport_important));
                    CAL2(Prin0("\n"));
                                        /* Nombre total de cas traites parmi 'nombre_d_iterations' (pour lesquels la droite          */
                                        /* intersecte donc le Domaine...).                                                           */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(editer_la_probabilite))
                    Bblock
                    Test(IL_FAUT(editer_toutes_les_informations))
                         Bblock
                         CAL2(Prin0("probabilite.............................. = "));
                                        /* Nombre total de cas traites pour lesquels le rapport est inclus dans [seuil,1-seuil]...   */
                                        /* Ceci a ete introduit le 20050125140312...                                                 */
                         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)
                              ,DIVZ(FLOT(nombre_de_cas_traites_de_rapport_important),FLOT(nombre_de_cas_traites))
                               )
                         );
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFNE_chaine(nom_imageR,NOM_PIPE))
                                        /* Test introduit le 20050111102612 pour accelerer le processus...                           */
                    Bblock
                    CALi(Iupdate_image(nom_imageR,ImageG));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes
          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.