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