_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E G E N E R A T I O N S A L E A T O I R E S : */ /* */ /* */ /* Definition : */ /* */ /* Ce fichier contient toutes les fonctions */ /* de base de generation de champs aleatoires. */ /* */ /* */ /* Author of '$xiii/aleat.1$FON' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19870000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H A M P C O M P L E T E M E N T A L E A T O I R E E N N I V E A U X */ /* P E R M E T T A N T , P A R E X E M P L E , D E T E S T E R V I S U E L L E M E N T */ /* L A Q U A L I T E D U G E N E R A T E U R A L E A T O I R E : */ /* */ /* */ /* ..@.@@@@@@@* ..@ @ . .@*@**@* @. @ @. @**@. .. * *** .*@* @. */ /* .@@.*. *.**. @. @**... ..@ * .** * @.@ *@*@ @*@* .@**** * */ /* ** * * . **@ **.* **..* . *.**.@@*..*@@.. @.@*.* ..*.. .@. @*@ */ /* @ ...@ @ *.@@*@.** .. . . ** ..@.@.**@*@ @**@ . @ @@@@ @. */ /* @ @*.** @*@@.@@ ** . .**..* @@**@@@.@. ..@ @*....@.@@*.@ .*.* */ /* @@ .* @...*@@* @* ...@@@* ...@**@ @* *@@ ..@@...****...*.@@ *. */ /* ..@@. . *@@*@. *@@ . @@ *@@* .**.@.@@ .*. .@ . ** .@@@.**@ */ /* . *..@@ **@.@@*..@@.*.@ ** * @. * *.@@*@..@ @ . *@@.@@ **@ */ /* *.@@.@@ . * @..@* . .@@ *@***@ .. .@..@@**. .@ *@..**. */ /* . **. @* .@**.. @@.@.*. @ .@ ..@@@. @*. **.. *. @ * *@..@.*. */ /* @@.. .*@*.@*@ **@@ *@@@...@ .* * *..*@..@@*@...*@@. @ .. @**. */ /* * * **.**@@ @* @.. .@.@**..@ @.. * @ *@@@@**@ .* ** @* *@ */ /* * @ .@@ **@@* ..**. @ ** @ .@*..@*@. .* ..@*... **@.*.. ** *.@* */ /* *.*..@. .*@.@@ *.@..* *@@@ * .***.**..@ @*.@.. .. @ @*.@ @ @* */ /* @@@ ..*@.@@ @. .@.** . @*@*.@@ .* .@@.*.*@ @ @.*.. ..@**@.*@ */ /* @@@@@*@ . *@@*.@@ *@* .* .@**@* ***. @@@*.***.** @.*.@ .*@@* */ /* @ . . .. *@*.*@ . * .@@@@*@. @. .* . *@ *....*@.**.@@* . @. */ /* . . *@@@** .* .@@@@.....** @*.@.* @* . . .. @ ****. @.@@@**.@. */ /* . . @ * .@* @. .*@ @ .... @ . @ @@@.* @ @ @ @* @.@@**. .** */ /* @. .* @...*. **@*@*.@ * * @. **. *.*@.@.. * @ *@@ ..** .@*@* */ /* ***@***@*@.**.* .**@ .@*@*.@*. ...@.* @@.. ..* @@@@. @@@@*. */ /* @ * @.*@ * @* * *@ @* *.. * @*@ @ * .....*@. .@@ *@*@*.**@ */ /* . .**.@@ @ . @ @* .@.* @** .@***@* *@ . @@**@* @**.... ....@* */ /* @....@. *. .@...@..*.** @ @.** . @ .* *.@** *.@ *. @.@* *.@ */ /* .* . @*.*@* .. @*@...@@*.* * ***. * @@ @.@.. * *@*.@*.***. */ /* @@*.@@....@*.*@.**@..@.@* ** @*..** *@. @*...@@. @@@. .**...@ */ /* @**@* . . * **@.. @.. * @*@**@*. . @.. *@@@.*@ .**@*.*@ **** */ /* ..*@@@.@ @ . *..** *. @@*.. ..*.@ * @ @@**.@.* **@@*@@@ @* */ /* ... @**...@.* **@.* @.@ .@.*. *@ *@ .@.. *****.@. .@.@ @@* */ /* *.**@*@ **.*@* ***@@. *.*.@ *. @ .@**.*@.* @*@. ** @@* @*.@@@@ */ /* @@ ** @..*@ @@. @.@*.****@ ..@*@.*. * @ @.. @ .**@@*. @*@ .. @ */ /* ** ***.**@@.*** ***@ @. @ * @@@.* *.@* @ @. * *..@* @. */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Float,SINT(Irandom_niveaux_____maximum_ouvert,FLOT__BLANC))); DEFV(Common,DEFV(Float,SINT(Irandom_niveaux_____maximum_ferme,FLOT__BLANC))); /* Introduit le 20190124112346 pour permettre de garantir, si besoin est, l'equirepartition */ /* des niveaux y compris aux deux extremites 'NOIR' et 'BLANC' d'un histogramme (on prendra */ /* alors la valeur 'FLOT__BLANC+1'...). */ /* */ /* Au passage, ce phenomene d'equirepartition des niveaux dans l'histogramme, sauf aux */ /* deux extremites 'NOIR' et 'BLANC', vient du fait que chaque niveau est atteint a la */ /* fois par la droite (par defaut) et par la gauche (par exces) a cause de la programmation */ /* 'v $ximf/aleatoires$FON RETU.ARRI.rdn..' et evidemment cet acces a la fois par la droite */ /* et par la gauche n'est pas possible pour le 'NOIR' (accessible uniquement par defaut) */ /* et pour le 'BLANC' (accessible uniquement par exces) ainsi que le montre la figure */ /* suivante : */ /* */ /* */ /* HISTOGRAMME : NOIR (...) NIVEAU (...) BLANC */ /* QUELCONQUE */ /* | | */ /* | | | */ /* | | | */ /* |<- ->|<- ->| */ /* */ /* (defaut seul) (exces+defaut) (exces seul) */ /* */ DEFV(Common,DEFV(FonctionP,POINTERp(Irandom_niveaux(imageR,graine,borne_inferieure,borne_superieure)))) DEFV(Argument,DEFV(image,imageR)); /* Image Resultat, telle que : imageR[X][Y]=rdn((X,Y),graine,(inf,sup)). */ DEFV(Argument,DEFV(Int,graine)); /* Graine arbitraire dont depend la generation. */ DEFV(Argument,DEFV(Float,borne_inferieure)); /* Borne inferieure du generateur ; 'NOIR' est une bonne valeur, */ DEFV(Argument,DEFV(Float,borne_superieure)); /* Borne superieure du generateur ; 'BLANC' est une bonne valeur. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(pointI_2D,point_courant); /* Point (entier) courant. */ /*..............................................................................................................................*/ INITIALISATION_POINT_2D(point_courant,Xmin,Ymin); CALS(rdnaI2D(ADRESSE(point_courant) ,UNDEF ,RDN_INIT ,gTRNP(borne_inferieure,Irandom_niveaux_____maximum_ouvert,Irandom_niveaux_____maximum_ferme) ,gTRNP(borne_superieure,Irandom_niveaux_____maximum_ouvert,Irandom_niveaux_____maximum_ferme) ) ); /* Initialisation du generateur aleatoire avec des bornes dans [NOIR,BLANC]. */ begin_image Bblock INITIALISATION_POINT_2D(point_courant,X,Y); store_point(rdnaI2D(ADRESSE(point_courant),graine,RDN_GENERE,FLOT__ARGUMENT_ABSENT,FLOT__ARGUMENT_ABSENT) ,imageR ,X,Y ,FVARIABLE ); /* Generation d'une valeur aleatoire fonction du point courant {X,Y}, */ /* de la graine argument comprise entre les bornes inferieure et */ /* superieure. */ Eblock end_image RETI(imageR); Eblock EFonctionP _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H A M P C O M P L E T E M E N T A L E A T O I R E E N N I V E A U X */ /* P E R M E T T A N T , P A R E X E M P L E , D E T E S T E R V I S U E L L E M E N T */ /* L A Q U A L I T E D U G E N E R A T E U R A L E A T O I R E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,POINTERF(IFrandom_niveaux(imageR,graine,borne_inferieure,borne_superieure)))) DEFV(Argument,DEFV(imageF,imageR)); /* Image Resultat, telle que : imageR[X][Y]=rdn((X,Y),graine,(inf,sup)). */ DEFV(Argument,DEFV(Int,graine)); /* Graine arbitraire dont depend la generation. */ DEFV(Argument,DEFV(Float,borne_inferieure)); /* Borne inferieure du generateur ; 'NOIR' est une bonne valeur, */ DEFV(Argument,DEFV(Float,borne_superieure)); /* Borne superieure du generateur ; 'BLANC' est une bonne valeur. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(pointI_2D,point_courant); /* Point (entier) courant. */ /*..............................................................................................................................*/ INITIALISATION_POINT_2D(point_courant,Xmin,Ymin); CALS(rdnI2D(ADRESSE(point_courant) ,UNDEF ,RDN_INIT ,borne_inferieure ,borne_superieure ) ); /* Initialisation du generateur aleatoire avec des bornes dans [NOIR,BLANC]. */ begin_image Bblock INITIALISATION_POINT_2D(point_courant,X,Y); storeF_point(rdnI2D(ADRESSE(point_courant),graine,RDN_GENERE,FLOT__ARGUMENT_ABSENT,FLOT__ARGUMENT_ABSENT) ,imageR ,X,Y ); /* Generation d'une valeur aleatoire fonction du point courant {X,Y}, */ /* de la graine argument comprise entre les bornes inferieure et */ /* superieure. */ Eblock end_image RETIF(imageR); Eblock EFonctionF _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H A M P C O M P L E T E M E N T A L E A T O I R E E N N I V E A U X */ /* D O N T L A P E R I O D I C I T E E S T P A R A M E T R A B L E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(FonctionP,POINTERp(Irandom_niveaux_a_periodicite_parametrable(imageR)))) DEFV(Argument,DEFV(image,imageR)); /* Image Resultat, telle que : imageR[X][Y]=rdn. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ begin_image Bblock DEFV(Float,INIT(valeur_aleatoire_courante,rdn_iteratif_cercle())); store_point(__DENORMALISE_NIVEAU(valeur_aleatoire_courante) ,imageR ,X,Y ,FVARIABLE ); /* Generation d'une valeur aleatoire. On notera qu'il est interdit d'ecrire directement : */ /* */ /* __DENORMALISE_NIVEAU(rdn_iteratif_cercle()) */ /* */ /* parce que cela provoque plusieurs appels a 'rdn_iteratif_cercle(...)' via 'TRNF(...)'. */ Eblock end_image RETI(imageR); Eblock EFonctionP _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H A M P C O M P L E T E M E N T A L E A T O I R E E N N I V E A U X */ /* D O N T L A P E R I O D I C I T E E S T P A R A M E T R A B L E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,POINTERF(IFrandom_niveaux_a_periodicite_parametrable(imageR)))) DEFV(Argument,DEFV(imageF,imageR)); /* Image Resultat, telle que : imageR[X][Y]=rdn. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ begin_image Bblock DEFV(Float,INIT(valeur_aleatoire_courante,rdn_iteratif_cercle())); /* Par symetrie avec 'Irandom_niveaux_a_periodicite_parametrable(...)'. */ storeF_point(valeur_aleatoire_courante ,imageR ,X,Y ); /* Generation d'une valeur aleatoire. */ Eblock end_image RETIF(imageR); Eblock EFonctionF _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H A M P C O M P L E T E M E N T A L E A T O I R E E N P O S I T I O N : */ /* */ /* */ /* @@@@@ @@@@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ */ /* @@@@@ @@@@ @@@@@@ @ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ */ /* @@@@@@@@@@ @@@ @@@@@@@@@@@@ @@@@@@ @@@ @@@@@@@@@@@@ @@@@@@ @@@ @ */ /* @@@@@@ @@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@ */ /* @@@@@@@@@@@@ @@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@@@@@ */ /* @@@@@ @@@ @@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@ @@ */ /* @@@@@ @@@@@ @ @@@@@ @@@@@@@ @@@@@@@@@ @@@@@ @@@@@ @@@@@@@@@@ @@ */ /* @@@ @@@@@@@@ @@@ @@@@@@@@@@ @@@@ @@@@@@@@@@@ @@@@@@ @@@@@@ @@@@ */ /* @@@@@@@@@@@@@ @@@@ @@ @@@@ @ @@@@ @@@@@ @@@@ @@ @@ @@@@ @@@@@@@@ */ /* @@@@@@@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ @@@@ @@@@@ @@ */ /* @@@@@@@@@@@@@@@@@@ @@@ @@@ @@ @@@@@@@@@@@ @@@@@@@ @@ @@@@@@@@@@@ */ /* @@@@ @ @@@@@@@@ @@@@@@@@@ @@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@ */ /* @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@@@@@@ @@@@@ */ /* @@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@ @@@@ @@@@@@@@@@@@@@@@@ */ /* @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@ @@@ @@@@@@@@@@@@@@@ */ /* @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@@ */ /* @@ @ @@ @@@@@@@@@@ @@@ @@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@@@@@@@@@ */ /* @ @@@@@@@@@@@ @@@@@@ @@@@@@@ @@@@@@ @@@@@ @@ @@@@@@@@@@@ @@@@@@@ */ /* @@@ @@@@ @@@@@@@ @@@@@@@@@ @@@ @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@ */ /* @@@@ @@@@@ @@@@@@@ @@@@ @@@ @@@@@@@@@@@@@ @@ @@@@@@@@@@@@@@@ @@@ */ /* @@@@@@@ @@@@@@@@@ @@@@ @@@@@@ @@@@@@@ @@@@@@@@@@@ @ @@@@@@@ @@@ */ /* @@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@ @@ @@@ @@@@ @@@@@@ @@@@ */ /* @@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@@@ @ @@ @@@ @@@@ @@@@@@@@@@@@@@ */ /* @@@@@@ @@@ @@ @@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@@@ @@@@@@@@@@@@@@@@ */ /* @@@@@@@@@@@@@@@@@@ @@ @ @@@@@@@@@@@@@ @ @ @ @ @@@@@@@@@@@@@ @@ */ /* @@@@@@@@@ @@@@@ @ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@ @@@@@@@@@@ */ /* @@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ @@ @ @@@@@@@@ @@@@@ */ /* @@@@@@@ @@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@ @@@ */ /* @@@@ @ @@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@ @@@@@@@@@@@@@@@@ @@ */ /* @@@@@ @ @@@@@@@@@@@@@@ @@@@@@@@@@ @ @@@@@@@@@@@@ @@@@ @@@@@@@@@@ */ /* @@@@@@@@@@ @@@@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Positive,SINT(Irandom_positions_____nombre_de_points_marques,UNDEF))); /* Introduit le 20240828092008... */ DEFV(Common,DEFV(genere_p,SINT(Irandom_positions_____niveau_des_points_probables,NIVEAU_DES_POINTS_PROBABLES))); /* Introduit le 20140807100850 pour 'v $xci/random.02$K Irandom_positions'... */ DEFV(Common,DEFV(FonctionP,POINTERp(Irandom_positions(imageR,graine,seuil_de_generation)))) DEFV(Argument,DEFV(image,imageR)); /* Image Resultat, telle que : imageR[X][Y]=un point {X,Y} si la probabilite est favorable. */ DEFV(Argument,DEFV(Int,graine)); /* Graine arbitraire dont depend la generation. */ DEFV(Argument,DEFV(Float,seuil_de_generation)); /* Definition du seuil de generation ; il s'agit en fait d'une probabilite */ /* definie dans [0,1]. La generation est donc conditionnee par : */ /* */ /* rdn(X,Y) <= seuil : on genere un point en {X,Y}, */ /* rdn(X,Y) > seuil : on laisse le point {X,Y} inchange. */ /* */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(borne_inferieure,PROBABILITE_NULLE)); /* Borne inferieure du generateur, */ DEFV(Float,INIT(borne_superieure,PROBABILITE_UNITE)); /* Borne superieure du generateur. */ DEFV(pointI_2D,point_courant); /* Point (entier) courant. */ /*..............................................................................................................................*/ Test(NINCff(seuil_de_generation,borne_inferieure,borne_superieure)) Bblock PRINT_ATTENTION("la probabilite de generation n'est pas dans le segment [0,1]"); Eblock ATes Bblock Eblock ETes INITIALISATION_POINT_2D(point_courant,Xmin,Ymin); CALS(rdnI2D(ADRESSE(point_courant),UNDEF,RDN_INIT,borne_inferieure,borne_superieure)); /* Initialisation du generateur aleatoire. */ CLIR(Irandom_positions_____nombre_de_points_marques); /* Introduit le 20240828092008... */ begin_image Bblock INITIALISATION_POINT_2D(point_courant,X,Y); Test(IFLE(rdnI2D(ADRESSE(point_courant),graine,RDN_GENERE,FLOT__ARGUMENT_ABSENT,FLOT__ARGUMENT_ABSENT) ,seuil_de_generation ) ) Bblock store_point(Irandom_positions_____niveau_des_points_probables,imageR,X,Y,FVARIABLE); /* Generation du point courant {X,Y}, lorsque la probabilite est favorable... */ INCR(Irandom_positions_____nombre_de_points_marques,I); /* Introduit le 20240828092008... */ Eblock ATes Bblock Eblock ETes Eblock end_image RETI(imageR); Eblock EFonctionP _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P E R M U T A T I O N A L E A T O I R E D E S P O I N T D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Logical,SINT(Irandom_shuffling_____compatibilite_20160201,FAUX))); /* Permet de generer des images suivant la methode anterieure au 20160201125046... */ DEFV(Common,DEFV(Int,SINT(Irandom_shuffling_____increment_1_coordonnee_X,NEUT(PasX)))); DEFV(Common,DEFV(Int,SINT(Irandom_shuffling_____increment_1_coordonnee_Y,NEUT(PasX)))); DEFV(Common,DEFV(Int,SINT(Irandom_shuffling_____increment_2_coordonnee_X,NEGA(PasX)))); DEFV(Common,DEFV(Int,SINT(Irandom_shuffling_____increment_2_coordonnee_Y,NEGA(PasX)))); /* Afin de parametrer la fonction 'rdnI2D(...)'. */ DEFV(Common,DEFV(Int,SINT(Irandom_shuffling_____nombre_maximal_de_collisions,ZERO))); DEFV(Common,DEFV(Int,SINT(Irandom_shuffling_____limite_du_detecteur_de_collisions,CENT))); /* Afin de gerer les collisions. Ce dispositif a ete introduit le 20160201102456 et donner */ /* une valeur "infinie" a 'nombre_maximal_de_collisions' autorise donc les collisions */ /* telles qu'elles etaient possibles avant cette date... */ DEFV(Common,DEFV(FonctionP,POINTERp(Irandom_shuffling(imageR,imageA,graine,seuil_de_generation)))) DEFV(Argument,DEFV(image,imageR)); /* Image Resultat, telle que : imageR[X][Y]=Permutation(imageA[X][Y]). */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument. */ DEFV(Argument,DEFV(Int,graine)); /* Graine arbitraire dont depend la generation. */ DEFV(Argument,DEFV(Float,seuil_de_generation)); /* Definition du seuil de generation ; il s'agit en fait d'une probabilite */ /* definie dans [0,1]. La generation est donc conditionnee par : */ /* */ /* rdn(X,Y) <= seuil : on permute le point {X,Y} avec un point aleatoire, */ /* rdn(X,Y) > seuil : on laisse le point {X,Y} inchange. */ /* */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(borne_inferieure,PROBABILITE_NULLE)); /* Borne inferieure du generateur, */ DEFV(Float,INIT(borne_superieure,PROBABILITE_UNITE)); /* Borne superieure du generateur. */ DEFV(pointI_2D,point_courant); /* Point (entier) courant. */ BDEFV(imageI,matrice_des_nombres_de_collisions); /* Afin de pouvoir eviter, si besoin est, les "collisions"... */ /*..............................................................................................................................*/ Test(NINCff(seuil_de_generation,borne_inferieure,borne_superieure)) Bblock PRINT_ATTENTION("la probabilite de generation n'est pas dans le segment [0,1]"); Eblock ATes Bblock Eblock ETes INITIALISATION_POINT_2D(point_courant,Xmin,Ymin); CALS(rdnI2D(ADRESSE(point_courant),UNDEF,RDN_INIT,borne_inferieure,borne_superieure)); /* Initialisation du generateur aleatoire. */ CALS(IIinitialisation(matrice_des_nombres_de_collisions,ZERO)); /* Initialement, aucune collision... */ begin_image Bblock DEFV(genere_p,INIT(niveau_du_point_courant,load_point(imageA,X,Y))); INITIALISATION_POINT_2D(point_courant,X,Y); Test(IFLE(rdnI2D(ADRESSE(point_courant),graine,RDN_GENERE,FLOT__ARGUMENT_ABSENT,FLOT__ARGUMENT_ABSENT) ,seuil_de_generation ) ) Bblock DEFV(Logical,INIT(iterer_le_shuffling,VRAI)); DEFV(Logical,INIT(nombre_courant_d_iterations_lors_des_collisions,ZERO)); DEFV(Int,INIT(facteur_des_increments_des_coordonnees ,COND(IL_FAUT(Irandom_shuffling_____compatibilite_20160201),UN,UN) ) ); /* La reference a la "compatibilite_20160201" peut sembler redondante, mais en fait, elle */ /* est la au cas ou la valeur initiale ('UN') venait a changer... */ DEFV(genere_p,INIT(niveau_du_point_permute,NIVEAU_UNDEF)); DEFV(Int,INIT(point_permute_X,UNDEF)); DEFV(Int,INIT(point_permute_Y,UNDEF)); /* Coordonnees du point qui va etre permute avec le point courant {X,Y}... */ Tant(IL_FAUT(iterer_le_shuffling)) Bblock INITIALISATION_POINT_2D(point_courant ,ADD2(X ,MUL2(facteur_des_increments_des_coordonnees ,Irandom_shuffling_____increment_1_coordonnee_X ) ) ,ADD2(Y ,MUL2(facteur_des_increments_des_coordonnees ,Irandom_shuffling_____increment_1_coordonnee_Y ) ) ); EGAL(point_permute_X ,_cDENORMALISE_OX(NORZ(rdnI2D(ADRESSE(point_courant) ,graine ,RDN_GENERE ,FLOT__ARGUMENT_ABSENT ,FLOT__ARGUMENT_ABSENT ) ,borne_inferieure ,borne_superieure ,COORDONNEE_BARYCENTRIQUE_MINIMALE ) ) ); INITIALISATION_POINT_2D(point_courant ,ADD2(X ,MUL2(facteur_des_increments_des_coordonnees ,Irandom_shuffling_____increment_2_coordonnee_X ) ) ,ADD2(Y ,MUL2(facteur_des_increments_des_coordonnees ,Irandom_shuffling_____increment_2_coordonnee_Y ) ) ); EGAL(point_permute_Y ,_cDENORMALISE_OY(NORZ(rdnI2D(ADRESSE(point_courant) ,graine ,RDN_GENERE ,FLOT__ARGUMENT_ABSENT ,FLOT__ARGUMENT_ABSENT ) ,borne_inferieure ,borne_superieure ,COORDONNEE_BARYCENTRIQUE_MINIMALE ) ) ); /* Generation d'un point aleatoire... */ begin_nouveau_block Bblock DEFV(Int,INIT(nombre_de_collisions_au_point_courant ,loadI_point(matrice_des_nombres_de_collisions,X,Y) ) ); DEFV(Int,INIT(nombre_de_collisions_au_point_permute ,loadI_point(matrice_des_nombres_de_collisions,point_permute_X,point_permute_Y) ) ); Test(IFOU(IL_FAUT(Irandom_shuffling_____compatibilite_20160201) ,IFOU(I3ET(IFLE(nombre_de_collisions_au_point_courant ,Irandom_shuffling_____nombre_maximal_de_collisions ) ,IFLE(nombre_de_collisions_au_point_permute ,Irandom_shuffling_____nombre_maximal_de_collisions ) ,IFOU(IFNE(X,point_permute_X) ,IFNE(Y,point_permute_Y) ) ) ,IFGT(nombre_courant_d_iterations_lors_des_collisions ,Irandom_shuffling_____limite_du_detecteur_de_collisions ) ) ) ) Bblock EGAL(niveau_du_point_permute,load_point_valide(imageA,point_permute_X,point_permute_Y)); store_point(niveau_du_point_permute,imageR,X,Y,FVARIABLE); store_point_valide(niveau_du_point_courant,imageR,point_permute_X,point_permute_Y,FVARIABLE); /* Permutation du point courant {X,Y} et du point aleatoire... */ storeI_point(ADD2(nombre_de_collisions_au_point_courant,I) ,matrice_des_nombres_de_collisions ,X,Y ); storeI_point(ADD2(nombre_de_collisions_au_point_permute,I) ,matrice_des_nombres_de_collisions ,point_permute_X,point_permute_Y ); /* Comptage des collisions... */ EGAL(iterer_le_shuffling,FAUX); Eblock ATes Bblock INCR(nombre_courant_d_iterations_lors_des_collisions,I); INCR(facteur_des_increments_des_coordonnees,I); Eblock ETes Eblock end_nouveau_block Eblock ETan Eblock ATes Bblock store_point(niveau_du_point_courant,imageR,X,Y,FVARIABLE); /* Dans le cas contraire, on conserve le point courant {X,Y} en l'etat... */ storeI_point(ADD2(loadI_point(matrice_des_nombres_de_collisions,X,Y),I) ,matrice_des_nombres_de_collisions ,X,Y ); Eblock ETes Eblock end_image EDEFV(imageI,matrice_des_nombres_de_collisions); RETI(imageR); Eblock EFonctionP _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H A M P C O M P L E T E M E N T A L E A T O I R E E N C O O R D O N N E E S : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(genere_p,SINT(Irandom_coordonnees_____niveau_du_fond,NOIR))); /* Introduit le 20171021105301... */ DEFV(Common,DEFV(genere_p,SINT(Irandom_coordonnees_____niveau_des_points_probables,NIVEAU_DES_POINTS_PROBABLES))); /* Introduit le 20140807100850 par symetrie avec 'Irandom_positions(...)'. */ DEFV(Common,DEFV(Logical,SINT(Irandom_coordonnees_____unicite_des_marquages,FAUX))); /* Introduit le 20171021105301 pour permettre de ne pas marquer plusieurs fois le meme */ /* point. Mais cet indicateur est initialise de facon a garantir la compatibilite */ /* anterieure... */ DEFV(Common,DEFV(Int,SINT(Irandom_coordonnees_____translation_de_la_graine_pour_X,TROIS))); DEFV(Common,DEFV(Int,SINT(Irandom_coordonnees_____translation_de_la_graine_pour_Y,SEPT))); /* Modificateurs de la graine utilisee... */ DEFV(Common,DEFV(FonctionP,POINTERp(Irandom_coordonnees(imageR,graine,nombre_de_points_a_marquer)))) /* Fonction introduite le 20030227155745. */ DEFV(Argument,DEFV(image,imageR)); /* Image Resultat, telle que : imageR[X][Y]=un point {X,Y} si la probabilite est favorable. */ DEFV(Argument,DEFV(Int,graine)); /* Graine arbitraire dont depend la generation. */ DEFV(Argument,DEFV(Positive,nombre_de_points_a_marquer)); /* Nombre de points a marquer. */ /* */ /* On notera le 20171021115651 que pour etre sur que ce nombre de points soit un nombre */ /* de points DIFFERENTS, il faut evidemment que : */ /* */ /* Irandom_coordonnees_____unicite_des_marquages=VRAI */ /* */ /* en notant que, dans ces conditions, ce nombre peut etre inatteignable s'il est proche */ /* de 'dimXY' (ou superieur evidemment...). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(borne_inferieure,CHOI(_____cNORMALISE_OX(Xmin),_____cNORMALISE_OY(Ymin)))); /* Borne inferieure du generateur, */ DEFV(Float,INIT(borne_superieure,CHOI(_____cNORMALISE_OX(Xmax),_____cNORMALISE_OY(Ymax)))); /* Borne superieure du generateur. */ DEFV(pointI_2D,point_courant); /* Point (entier) courant. */ DEFV(Positive,INIT(nombre_de_points_deja_marques,ZERO)); /* Pour compter les points marques... */ /*..............................................................................................................................*/ INITIALISATION_POINT_2D(point_courant,Xmin,Ymin); CALS(rdnI2D(ADRESSE(point_courant),UNDEF,RDN_INIT,borne_inferieure,borne_superieure)); /* Initialisation du generateur aleatoire. */ begin_image /* On notera que cette facon de faire (en balayant par {begin_image,end_image} l'integralite */ /* de l'image), alors que l'on veut en general generer un petit nombre de points aleatoires, */ /* n'est pas optimisee. Elle fut choisie pour des raisons de simplicite de programmation (en */ /* particulier a cause du point de parametrage 'point_courant' du generateur aleatoire */ /* 'rdnI2D(...)'). */ Bblock INITIALISATION_POINT_2D(point_courant,X,Y); Test(IFLT(nombre_de_points_deja_marques,nombre_de_points_a_marquer)) Bblock DEFV(Logical,INIT(marquer_le_point,VRAI)); DEFV(Int,INIT(coordonnee_X ,_cDENORMALISE_OX(rdnI2D(ADRESSE(point_courant) ,ADD2(graine,Irandom_coordonnees_____translation_de_la_graine_pour_X) ,RDN_GENERE ,FLOT__ARGUMENT_ABSENT ,FLOT__ARGUMENT_ABSENT ) ) ) ); DEFV(Int,INIT(coordonnee_Y ,_cDENORMALISE_OY(rdnI2D(ADRESSE(point_courant) ,ADD2(graine,Irandom_coordonnees_____translation_de_la_graine_pour_Y) ,RDN_GENERE ,FLOT__ARGUMENT_ABSENT ,FLOT__ARGUMENT_ABSENT ) ) ) ); Test(IL_FAUT(Irandom_coordonnees_____unicite_des_marquages)) /* Test introduit le 20171021105301 et qui est destine a garantir qu'un meme point n'est pas */ /* marque deux fois... */ Bblock EGAL(marquer_le_point,FAUX); /* A priori, le point ne sra pas marque... */ Test(TEST_DANS_L_IMAGE(coordonnee_X,coordonnee_Y)) Bblock Test(IFEQ(load_point(imageR,coordonnee_X,coordonnee_Y),Irandom_coordonnees_____niveau_du_fond)) Bblock EGAL(marquer_le_point,VRAI); /* Le point ne sera marque que s'il ne l'etait pas anterieurement... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(marquer_le_point)) /* Test introduit le 20171021105301 et qui permet de garantir qu'un meme point n'est pas */ /* marque deux fois... */ Bblock store_point_valide(Irandom_coordonnees_____niveau_des_points_probables ,imageR ,coordonnee_X ,coordonnee_Y ,FVARIABLE ); /* Generation du point courant {RDN(X),RDN(Y)}. Evidemment, on notera que, par malchance, */ /* il est possible de marquer ainsi plusieurs fois le meme point (collision des {X,Y} */ /* aleatoires calculees ci-dessus). Cela est d'autant plus probable que le nombre de */ /* points a generer ('nombre_de_points_a_marquer') est grand... */ INCR(nombre_de_points_deja_marques,I); /* Comptage des points marques... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock end_image RETI(imageR); Eblock EFonctionP _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H A M P C O M P L E T E M E N T A L E A T O I R E E N P O S I T I O N */ /* E T F O N C T I O N D ' U N A U T R E C H A M P : */ /* */ /* */ /* # # # ### ### ### #### ### ### ######## */ /* ## # ## # # ## ### # ## # ### # # ## ### ##### */ /* # # ## #### ##### ### ## ######## #### ## */ /* # ### ## # # ## # ## # ##### ### ########## */ /* # # ## # ### ### ## # ## # #### ###### */ /* ## # # ### ## # # ##### ########## ######## */ /* # # # # ## # ## ### # #### # ##### ##### ### */ /* ### # # # # # ## # ########## # ###### ### */ /* # # ## # ## # ########## # ######## */ /* # # ##### # ## # #### # # # ############# */ /* # # # # ### # ### ### #### ## ########## */ /* # # # # ## ## ###### # #### ##### ### # #### */ /* # # # ## # ### ### # # ## ### ######### #### */ /* # # # # ### # ### # # ###################### */ /* # # ## # # # # ### ### ## ## ## #### ######## */ /* # # ##### ## # # # #### ###### ### ### ######## */ /* # ## # ## # # # # # ## ################# */ /* # # # # ### #### ####### ## ## ### ###### ### */ /* # #### ### ## ## #### # ########## #### */ /* # # ### ## # # # ### ############ ## */ /* # # # # ### ## # ## # # # # ####### */ /* # ## ## # ### ## ## ### ########### */ /* # # # # # ## #### # ## # ### ## ###### ####### */ /* # # #### # ### # ###### ######### #### */ /* # # # # # # # ## # ## #### #### #### */ /* # # # # ## # ## # ### # ## ## ### ## ###### */ /* # ## # # # ## ## ###### ######## ###### */ /* # # ## ### # ## ## # ### ################ */ /* # # # # ## # ## # ### ########## ## ##### */ /* ## # # ## # ## ## #### ######### ############# */ /* # # ### # ###### ### ## ##### #### ######### */ /* ## # ## ###### # ## # #### ### # ################ */ /* */ /* */ /* avec la contrainte ('$xiio/MIRE') suivante : */ /* */ /* */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* ................::::::::--------++++++++oooooooo********####### */ /* */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(genere_p,SINT(Irandom_positions_variable_____niveau_des_points_probables,NIVEAU_DES_POINTS_PROBABLES))); /* Introduit le 20140807100850 par symetrie avec 'Irandom_positions(...)'. */ #define SEUIL_VARIABLE_DU_GENERATEUR_ALEATOIRE \ MUL2(facteur_des_niveaux \ ,______NORMALISE_NIVEAU(load_point(image_de_contrainte,X,Y)) \ ) \ /* De facon a passer d'un niveau dans l'image de contrainte du generateur aleatoire a un */ \ /* seuil dans [0,1]. */ DEFV(Common,DEFV(FonctionP,POINTERp(Irandom_positions_variable(imageR ,graine ,facteur_des_niveaux ,image_de_contrainte ) ) ) ) DEFV(Argument,DEFV(image,imageR)); /* Image Resultat, telle que : imageR[X][Y]=un point {X,Y} si la probabilite est favorable. */ DEFV(Argument,DEFV(Int,graine)); /* Graine arbitraire dont depend la generation. */ DEFV(Argument,DEFV(Float,facteur_des_niveaux)); /* Pour calculer le seuil de generation aleatoire a partir d'un niveau. */ DEFV(Argument,DEFV(image,image_de_contrainte)); /* Image contraignant le generateur aleatoire : plus un niveau est proche de 'NOIR', moins */ /* il y a de chance de generer quelque chose, alors que plus il est proche de 'BLANC', plus */ /* on a de chance ; notons que cela est a relativiser en fonction de 'facteur_des_niveaux'. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(borne_inferieure,PROBABILITE_NULLE)); /* Borne inferieure du generateur, */ DEFV(Float,INIT(borne_superieure,PROBABILITE_UNITE)); /* Borne superieure du generateur. */ DEFV(pointI_2D,point_courant); /* Point (entier) courant. */ /*..............................................................................................................................*/ INITIALISATION_POINT_2D(point_courant,Xmin,Ymin); CALS(rdnI2D(ADRESSE(point_courant),UNDEF,RDN_INIT,borne_inferieure,borne_superieure)); /* Initialisation du generateur aleatoire. */ begin_image Bblock INITIALISATION_POINT_2D(point_courant,X,Y); Test(IFLE(rdnI2D(ADRESSE(point_courant),graine,RDN_GENERE,FLOT__ARGUMENT_ABSENT,FLOT__ARGUMENT_ABSENT) ,SEUIL_VARIABLE_DU_GENERATEUR_ALEATOIRE ) ) Bblock /* Deux cas se prsentent : */ /* */ /* rdn(X,Y) <= seuil : on genere un point en {X,Y}, */ /* rdn(X,Y) > seuil : on laisse le point {X,Y} inchange. */ /* */ store_point(Irandom_positions_variable_____niveau_des_points_probables,imageR,X,Y,FVARIABLE); /* Generation du point courant {X,Y}, lorsque la probabilite est favorable... */ Eblock ATes Bblock Eblock ETes Eblock end_image RETI(imageR); Eblock #undef SEUIL_VARIABLE_DU_GENERATEUR_ALEATOIRE EFonctionP _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " S H U F F L I N G " D I R E C T D ' U N E I M A G E */ /* C O N S E R V A N T L E N O M B R E D E P O I N T S D E N I V E A U D O N N E : */ /* */ /*************************************************************************************************************************************/ /* 'Ishuffling_direct(...)' a ete deplace vers 'v $xiii/di_image$FON' le 20081008115932 */ /* a cause de 'Iegalisation_d_histogrammme_plat(...)' qui l'utilise alors. Du coup, tous */ /* les '$K' qui referencent 'image_image_DI_IMAGE_EXT' (c'est-a-dire tous...) demandaient */ /* aussi 'image_image_ALEATOIRES_1_EXT'. Pour ne pas avoir a tout recompiler, la fonction */ /* 'Ishuffling_direct(...)' a donc ete deplacee... */ _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " S H U F F L I N G " " I N V E R S E " D ' U N E I M A G E */ /* N E C O N S E R V A N T P A S L E N O M B R E D E P O I N T S D E N I V E A U D O N N E : */ /* */ /*************************************************************************************************************************************/ BFonctionP DEFV(Common,DEFV(Logical,SINT(Ishuffling_inverse_____compatibilite_20040106,FAUX))); /* Permet de generer des images suivant la methode anterieure au 20040106133459 en */ /* ce qui concerne la modification de la graine en fonction des coordonnees {X,Y}. */ /* Anterieurement au 20040106133459 cette facon de modifier la graine faisait que pour */ /* les points de la droite Y=X la graine etait modifiee identiquement pour les deux */ /* coordonnees 'X' et 'Y'. A compter de cette date, la pertubation apportee a la graine */ /* passe donc de {+X,+Y} a {-X,+Y} ce qui, etant donne que les coordonnees sont positives, */ /* ne peut jamais donner la meme graine "effective" : 'graine-X' et 'graine+Y' ne peuvent */ /* etre egaux puisque l'on ne peut avoir Y=-X... */ DEFV(Common,DEFV(FonctionP,POINTERp(Ishuffling_inverse(imageR,imageA,graine,force_le_long_de_OX,force_le_long_de_OY)))) DEFV(Argument,DEFV(image,imageR)); /* Image Resultat, telle que : imageR[X][Y]=imageA[X+rdn(X,Y)][Y+rdn(X,Y)]. */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument a "shuffliser"... */ DEFV(Argument,DEFV(Int,graine)); /* Graine arbitraire dont depend la generation. */ DEFV(Argument,DEFV(Float,force_le_long_de_OX)); DEFV(Argument,DEFV(Float,force_le_long_de_OY)); /* Force de la "shufflisation" dans [0,1] le long des axes 'OX' et 'OY' respectivement ; les */ /* valeurs suivantes donnent : */ /* */ /* force{X,Y}=0 : (imageR)=(imageA) (pas de "shufflisation"), */ /* force{X,Y}=1 : la "shufflisation" est maximale... */ /* */ /* Evidemment, lorsque ces deux parametres sont egaux, la force est "isotrope"... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(pointI_2D,point_courant); /* Point (entier) courant. */ SPIRALE_DEFINITION /* Donnees de generation d'une spirale de parcours d'une image. */ /*..............................................................................................................................*/ SPIRALE_VALIDATION; /* Validation des pas de parcours (pasX,pasY) des images. */ CALS(Inoir(imageR)); /* Initialisation du resultat. */ INITIALISATION_POINT_2D(point_courant,Xmin,Ymin); CALS(rdnI2D(ADRESSE(point_courant) ,UNDEF ,RDN_INIT ,FLOT(NEGA(PLUS_PETITE_IMAGE_CARREE_CIRCONSCRITE)) ,FLOT(PLUS_PETITE_IMAGE_CARREE_CIRCONSCRITE) ) ); /* Initialisation du generateur aleatoire. */ begin_image Bblock SPIRALE_REINITIALISATION_BRAS; /* Reinitialisation de la spirale en son centre, sans reinitialiser la direction */ /* et le sens du bras courant... */ INITIALISATION_POINT_2D(point_courant ,ADD2(X ,INTE(MUL2(force_le_long_de_OX ,rdnI2D(ADRESSE(point_courant) ,COND(IL_FAUT(Ishuffling_inverse_____compatibilite_20040106) ,ADD2(graine,X) ,ADD2(graine,NEGA(X)) ) ,RDN_GENERE ,FLOT__ARGUMENT_ABSENT ,FLOT__ARGUMENT_ABSENT ) ) ) ) ,ADD2(Y ,INTE(MUL2(force_le_long_de_OY ,rdnI2D(ADRESSE(point_courant) ,COND(IL_FAUT(Ishuffling_inverse_____compatibilite_20040106) ,ADD2(graine,Y) ,ADD2(graine,NEUT(Y)) ) ,RDN_GENERE ,FLOT__ARGUMENT_ABSENT ,FLOT__ARGUMENT_ABSENT ) ) ) ) ); /* Ainsi, on deplace aleatoirement le point courant {X,Y} ; la modification */ /* de "graine" par 'X' puis 'Y' est destinee a produire deux valeurs aleatoires */ /* differentes pour les abscisses et les ordonnees. */ Tant(TEST_HORS_IMAGE(ASD1(point_courant,x),ASD1(point_courant,y))) Bblock /* Ainsi, on cherche "en spirale" le premier point qui soit dans l'image... */ SPIRALE_INITIALISATION; /* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'. */ SPIRALE_DEPLACEMENT(ASD1(point_courant,x),ASD1(point_courant,y)); /* Deplacement du point courant de la spirale... */ /* ATTENTION : on n'utilise pas 'SPIRALE_DEPLACEMENT_ET_PARCOURS(...)' afin de garantir la */ /* terminaison du processus 'Tant(...)'. */ SPIRALE_PARCOURS; /* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant... */ Eblock ETan store_point(load_point(imageA,ASD1(point_courant,x),ASD1(point_courant,y)),imageR,X,Y,FVARIABLE); /* Ainsi, on deplace aleatoirement le point courant {X,Y}, */ /* */ /* ATTENTION : en procedant ainsi, on notera que plusieurs points {X,Y} differents peuvent */ /* etre positionnes avec un meme 'point_courant' ; cela fait donc que le nombre de points */ /* de niveau donne n'est pas conserve en passant de 'imageA' a 'imageR' (au passage, ce */ /* nombre augmente a priori...). C'est la la difference fondamentale avec la fonction */ /* 'Ishuffling_direct(...)'. */ Eblock end_image RETI(imageR); Eblock EFonctionP _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N T I O N S U T I L E S A L A D I S P E R S I O N D ' U N E I M A G E F L O T T A N T E : */ /* */ /*************************************************************************************************************************************/ #define GRAINE_COURANTE \ ADD2(graine,INCR(increment_de_la_graine,I)) \ /* Graine courante a utiliser, fonction de l'instruction courante... */ #define VERIFICATIONS_DE_LA_DISPERSION_ALEATOIRE_D_UNE_IMAGE \ Bblock \ Test(IZLE(nombre_de_points_du_nuage)) \ Bblock \ PRINT_ATTENTION("le nombre de points du nuage doit etre strictement positif"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFLT(dispersion_superieure_des_X,dispersion_inferieure_des_X)) \ Bblock \ PRINT_ATTENTION("la dispersion des coordonnees 'X' est mal definie"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFLT(dispersion_superieure_des_Y,dispersion_inferieure_des_Y)) \ Bblock \ PRINT_ATTENTION("la dispersion des coordonnees 'Y' est mal definie"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFLT(dispersion_superieure_des_niveaux,dispersion_inferieure_des_niveaux)) \ Bblock \ PRINT_ATTENTION("la dispersion des niveaux est mal definie"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock #define DISPERSION_ALEATOIRE_D_UN_POINT_D_UNE_IMAGE \ Bblock \ DEFV(genere_Float,INIT(niveau_courant,loadF_point(imageA,X,Y))); \ /* Niveau du point courant {X,Y} a disperser... */ \ DEFV(Int,INIT(increment_de_la_graine,ZERO)); \ /* Afin de faire varier la graine a chaque appel du generateur aleatoire. */ \ \ DEFV(pointI_2D,point_courant); \ INITIALISATION_POINT_2D(point_courant,X,Y); \ /* Point (entier) courant destine a parametrer le generateur aleatoire. */ \ \ Repe(nombre_de_points_du_nuage) \ Bblock \ DEFV(genere_Float,INIT(niveau_courant_dispersee,FLOT__NIVEAU_UNDEF)); \ DEFV(Int,INIT(coordonnee_X_dispersee,UNDEF)); \ DEFV(Int,INIT(coordonnee_Y_dispersee,UNDEF)); \ /* Definition du point "dispersee" courant. */ \ DEFV(genere_Float,INIT(niveau_anterieur,FLOT__NIVEAU_UNDEF)); \ /* Niveau anterieur du point de coordonnees "dispersees". */ \ \ EGAL(coordonnee_X_dispersee \ ,rdnI2D(ADRESSE(point_courant) \ ,GRAINE_COURANTE \ ,RDN_INIT_AND_GENERE \ ,FLOT(ADD2(X,dispersion_inferieure_des_X)) \ ,FLOT(ADD2(X,dispersion_superieure_des_X)) \ ) \ ); \ EGAL(coordonnee_Y_dispersee \ ,rdnI2D(ADRESSE(point_courant) \ ,GRAINE_COURANTE \ ,RDN_INIT_AND_GENERE \ ,FLOT(ADD2(Y,dispersion_inferieure_des_Y)) \ ,FLOT(ADD2(Y,dispersion_superieure_des_Y)) \ ) \ ); \ /* "Dispersion" des coordonnees {X,Y}. */ \ \ Test(TEST_DANS_L_IMAGE(coordonnee_X_dispersee,coordonnee_Y_dispersee)) \ Bblock \ /* Cas ou la dispersion nous maintient dans l'image : */ \ DEFV(pointF_2D,point_courant_flottant); \ TRANSFERT_POINT_2D(point_courant_flottant,point_courant); \ /* Introduit le 20040618134003 car manquait alors... */ \ \ EGAL(niveau_courant_dispersee \ ,rdnF2D(ADRESSE(point_courant_flottant) \ ,GRAINE_COURANTE \ ,RDN_INIT_AND_GENERE \ ,ADD2(niveau_courant,dispersion_inferieure_des_niveaux) \ ,ADD2(niveau_courant,dispersion_superieure_des_niveaux) \ ) \ ); \ /* "Dispersion" des coordonnees {X,Y}. */ \ \ EGAL(niveau_anterieur,loadF_point(imageR,coordonnee_X_dispersee,coordonnee_Y_dispersee)); \ /* Niveau anterieur du point de coordonnees "dispersees". */ \ \ storeF_point(COND(IL_FAUT(prendre_le_maximum) \ ,MAX2(niveau_anterieur,niveau_courant_dispersee) \ ,ADD2(niveau_anterieur,niveau_courant_dispersee) \ ) \ ,imageR \ ,coordonnee_X_dispersee,coordonnee_Y_dispersee \ ); \ /* Et dispersion... */ \ Eblock \ ATes \ Bblock \ /* Cas ou la dispersion nous fait sortir de l'image : rien a faire... */ \ Eblock \ ETes \ Eblock \ ERep \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I S P E R S I O N ( " S P R A Y " ) D ' U N E I M A G E F L O T T A N T E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,POINTERF(IFdispersion_aleatoire(imageR,imageA ,graine ,nombre_de_points_du_nuage ,dispersion_inferieure_des_X,dispersion_superieure_des_X ,dispersion_inferieure_des_Y,dispersion_superieure_des_Y ,dispersion_inferieure_des_niveaux,dispersion_superieure_des_niveaux ,prendre_le_maximum ) ) ) ) DEFV(Argument,DEFV(imageF,imageR)); /* Image Resultat, telle que : imageR[X][Y]=imageA[X][Y] "traduit" en un nuage de points. */ DEFV(Argument,DEFV(imageF,imageA)); /* Image Argument. */ DEFV(Argument,DEFV(Int,graine)); /* Graine arbitraire dont depend la generation. */ DEFV(Argument,DEFV(Int,nombre_de_points_du_nuage)); /* Nombre de points du nuage a generer. */ DEFV(Argument,DEFV(Int,dispersion_inferieure_des_X)); DEFV(Argument,DEFV(Int,dispersion_superieure_des_X)); /* Definition de la dispersion des coordonees 'X'. */ DEFV(Argument,DEFV(Int,dispersion_inferieure_des_Y)); DEFV(Argument,DEFV(Int,dispersion_superieure_des_Y)); /* Definition de la dispersion des coordonees 'Y'. */ DEFV(Argument,DEFV(Float,dispersion_inferieure_des_niveaux)); DEFV(Argument,DEFV(Float,dispersion_superieure_des_niveaux)); /* Definition de la dispersion des niveaux. */ /* */ /* Le 20100423100442 la dispersion des niveaux est passee de 'Int' a 'Float' plus logique */ /* puisque les images sont de type 'imageF'... */ DEFV(Argument,DEFV(Logical,prendre_le_maximum)); /* Indique s'il faut prendre le maximum entre la valeur courante et la valeur anterieure */ /* ('VRAI') ou proceder a un cumul arithmetique ('FAUX'). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ VERIFICATIONS_DE_LA_DISPERSION_ALEATOIRE_D_UNE_IMAGE; /* Introduit sous cette forme le 20170402094945... */ begin_image_AvecEditionProgression /* Le 20170523174309 "_AvecEditionProgression" a ete introduit pour des tests "symetriques" */ /* avec ceux de 'IFdispersion_aleatoire_back(...)'... */ Bblock DISPERSION_ALEATOIRE_D_UN_POINT_D_UNE_IMAGE; /* Introduit sous cette forme le 20170402094945... */ Eblock end_image_AvecEditionProgression /* Le 20170523174309 "_AvecEditionProgression" a ete introduit pour des tests "symetriques" */ /* avec ceux de 'IFdispersion_aleatoire_back(...)'... */ RETIF(imageR); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I S P E R S I O N " B A C K " ( " S P R A Y " ) D ' U N E I M A G E F L O T T A N T E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,POINTERF(IFdispersion_aleatoire_back(imageR,imageA ,graine ,nombre_de_points_du_nuage ,dispersion_inferieure_des_X,dispersion_superieure_des_X ,dispersion_inferieure_des_Y,dispersion_superieure_des_Y ,dispersion_inferieure_des_niveaux,dispersion_superieure_des_niveaux ,prendre_le_maximum ) ) ) ) /* Fonction introduite le 20170402100346 uniquement pour tester 'PROGRESSION_DES_BEGIN_END' */ /* dans le cas {begin_image_back,end_image_back}... */ DEFV(Argument,DEFV(imageF,imageR)); /* Image Resultat, telle que : imageR[X][Y]=imageA[X][Y] "traduit" en un nuage de points. */ DEFV(Argument,DEFV(imageF,imageA)); /* Image Argument. */ DEFV(Argument,DEFV(Int,graine)); /* Graine arbitraire dont depend la generation. */ DEFV(Argument,DEFV(Int,nombre_de_points_du_nuage)); /* Nombre de points du nuage a generer. */ DEFV(Argument,DEFV(Int,dispersion_inferieure_des_X)); DEFV(Argument,DEFV(Int,dispersion_superieure_des_X)); /* Definition de la dispersion des coordonees 'X'. */ DEFV(Argument,DEFV(Int,dispersion_inferieure_des_Y)); DEFV(Argument,DEFV(Int,dispersion_superieure_des_Y)); /* Definition de la dispersion des coordonees 'Y'. */ DEFV(Argument,DEFV(Float,dispersion_inferieure_des_niveaux)); DEFV(Argument,DEFV(Float,dispersion_superieure_des_niveaux)); /* Definition de la dispersion des niveaux. */ DEFV(Argument,DEFV(Logical,prendre_le_maximum)); /* Indique s'il faut prendre le maximum entre la valeur courante et la valeur anterieure */ /* ('VRAI') ou proceder a un cumul arithmetique ('FAUX'). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ VERIFICATIONS_DE_LA_DISPERSION_ALEATOIRE_D_UNE_IMAGE; begin_image_back_AvecEditionProgression /* Le 20170523173621 "_AvecEditionProgression" a ete introduit pour le tester dans cette */ /* fonction dont le role est precisemment de tester 'PROGRESSION_DES_BEGIN_END'... */ Bblock DISPERSION_ALEATOIRE_D_UN_POINT_D_UNE_IMAGE; Eblock end_image_back_AvecEditionProgression /* Le 20170523173621 "_AvecEditionProgression" a ete introduit pour le tester dans cette */ /* fonction dont le role est precisemment de tester 'PROGRESSION_DES_BEGIN_END'... */ RETIF(imageR); Eblock EFonctionF #undef VERIFICATIONS_DE_LA_DISPERSION_ALEATOIRE_D_UNE_IMAGE #undef DISPERSION_ALEATOIRE_D_UN_POINT_D_UNE_IMAGE #undef GRAINE_COURANTE _______________________________________________________________________________________________________________________________________