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