/*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E B A S E A D E U X I M A G E S : */ /* */ /* */ /* Definition : */ /* */ /* Ce fichier contient toutes les definitions */ /* de base de gestion et de manipulation d'une */ /* image raster, quelle que soit la definition. */ /* */ /* */ /* Author of '$xiii/di_image$DEF' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19880000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E P L A C E M E N T D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define iMOVE(imageR,imageA) \ Bblock \ begin_image \ Bblock \ store_point(load_point(imageA,X,Y),imageR,X,Y,FVARIABLE); \ Eblock \ end_image \ Eblock \ /* Deplacement d'une image (le plus simple possible). ATTENTION, cette procedure a ete */ \ /* introduite car en effet, autrefois dans le meme bloc '$a' que la fonction 'Imove(...)', */ \ /* on trouvait aussi 'Itransformation_image(...)' et 'Itransformation_inverse_image(...)' */ \ /* (ces deux dernieres utilisant la premiere). Or le bloc '$a' correspondant faisait alors */ \ /* pas loin de 900000 octets. Ainsi, tout programme demandant 'Imove(...)', c'est-a-dire */ \ /* pratiquement tous, voyait sa taille augmenter demesurement. D'ou la solution de creer */ \ /* cette procedure. On notera qu'elle est placee dans '$xiii/di_image$DEF' et non pas dans */ \ /* '$xiii/di_image$FON' afin d'eviter une imbrication illogique entre les limiteurs de blocs */ \ /* independants et les couples {#define,#undef}... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S L A T I O N D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gItranslation(les_images_sont_standards,imageR,FimageR,imageA,FimageA,translation,tore_horizontal,tore_vertical) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Itranslation(imageR,imageA,translation,tore_horizontal,tore_vertical) \ ,IFtranslation(FimageR,FimageA,translation,tore_horizontal,tore_vertical) \ ) \ /* Translation d'une image quelconque ("standard" ou "flottante"). Ceci a ete introduit */ \ /* le 20041111155919. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E P L A C E M E N T D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gImove(les_images_sont_standards,imageR,FimageR,imageA,FimageA) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Imove(imageR,imageA) \ ,IFmove(FimageR,FimageA) \ ) \ /* Deplacement d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R O N C A T I O N D E S N I V E A U X D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gItroncation(les_images_sont_standards,imageR,FimageR,imageA,FimageA,seuil_inf,Fseuil_inf,seuil_sup,Fseuil_sup) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Itroncation(imageR,imageA,seuil_inf,seuil_sup) \ ,IFtroncation(FimageR,FimageA,Fseuil_inf,Fseuil_sup) \ ) \ /* Troncation d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O D U L O D E S N I V E A U X D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gImodulo(les_images_sont_standards,imageR,FimageR,imageA,FimageA,seuil_inf,Fseuil_inf,seuil_sup,Fseuil_sup) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Imodulo(imageR,imageA,seuil_inf,seuil_sup) \ ,IFmodulo(FimageR,FimageA,Fseuil_inf,Fseuil_sup) \ ) \ /* Modulo d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M A T I O N " S I G M O I D E " D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gIsigmoide(les_images_sont_standards,imageR,FimageR,imageA,FimageA,echelle,Fechelle) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Isigmoide(imageR,imageA,echelle) \ ,IFsigmoide(FimageR,FimageA,Fechelle) \ ) \ /* Sigmoide d'une image quelconque ("standard" ou "flottante") introduit le 20240703081806. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E P L A C E M E N T D ' U N E I M A G E Q U E L C O N Q U E */ /* A V E C M A R Q U A G E D ' U N P O I N T V A L I D E : */ /* */ /*************************************************************************************************************************************/ #define gImove_avec_store_point_valide(les_images_sont_standards,imageR,FimageR,imageA,FimageA,niv_p,niv_float,abscisse,ordonnee) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Imove_avec_store_point_valide(imageR,imageA,niv_p,abscisse,ordonnee) \ ,IFmove_avec_store_point_valide(FimageR,FimageA,niv_float,abscisse,ordonnee) \ ) \ /* Deplacement d'une image quelconque ("standard" ou "flottante"). Cette procedure a ete */ \ /* introduite le 20050920123926 pour 'v $xci/S_point$K gImove_avec_store_point_valide'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E P L A C E M E N T D ' U N E I M A G E " F L O T T A N T E " A V E C S U B S T I T U T I O N : */ /* */ /*************************************************************************************************************************************/ #define NOMBRE_DE_PASSES_DE_LISSAGE_DANS_IFmove_avec_substitution \ UN \ /* Indique le nombre de passes de lissage par defaut ("plus on lisse, plus c'est lisse..."). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N P S E U D O - H I S T O G R A M M E " P L A T " : */ /* */ /*************************************************************************************************************************************/ #define GENERATION_D_UN_PSEUDO_HISTOGRAMME_PLAT(histogramme_plat) \ Bblock \ Test(EST_INVALIDE(Iegalisation_d_histogrammme_plat_____etat_de_l_histogramme_plat)) \ Bblock \ DEFV(Float,INIT(nombre_de_points_par_niveau,DIVI(FLOT(dimXY),FLOT(COULEURS)))); \ /* Nombre de points par niveau pour un histogramme "plat"... */ \ DEFV(Positive,INIT(nombre_de_points,ZERO)); \ /* Nombre de points apres la premiere passe de construction de l'histogramme "plat"... */ \ DEFV(Positive,INIT(nombre_de_points_manquants,UNDEF)); \ /* Nombre de points manquants apres la premiere passe de construction de l'histogramme */ \ /* "plat"... */ \ \ BoIn(niveau,NOIR,BLANC,PAS_COULEURS) \ Bblock \ EGAL(ITb1(histogramme_plat,INDX(niveau,NOIR)),INTE(nombre_de_points_par_niveau)); \ /* Premiere passe de construction de l'histogramme "plat"... */ \ INCR(nombre_de_points,ITb1(histogramme_plat,INDX(niveau,NOIR))); \ /* Nombre de points apres la premiere passe de construction de l'histogramme "plat"... */ \ Eblock \ EBoI \ \ EGAL(nombre_de_points_manquants,SOUS(dimXY,nombre_de_points)); \ CLIR(nombre_de_points); \ \ BoIn(niveau,NOIR,BLANC,PAS_COULEURS) \ Bblock \ Test(IFLT(NIVR(niveau),nombre_de_points_manquants)) \ Bblock \ INCR(ITb1(histogramme_plat,INDX(niveau,NOIR)),I); \ /* Seconde passe de construction de l'histogramme "plat" par ajout des points manquants, ce */ \ /* qui fait qu'a priori au debut de l'histogramme "plat" chaque niveau aura une population */ \ /* de 'nombre_de_points_par_niveau+1' et a la fin seulement 'nombre_de_points_par_niveau'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INCR(nombre_de_points,ITb1(histogramme_plat,INDX(niveau,NOIR))); \ /* Nombre de points apres la seconde passe de construction de l'histogramme "plat"... */ \ Eblock \ EBoI \ \ Test(IFNE(nombre_de_points,dimXY)) \ Bblock \ PRINT_ERREUR("probleme de generation d'un histogramme 'plat'"); \ CAL1(Prer1("(NombreDePoints=%d)\n",nombre_de_points)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(Iegalisation_d_histogrammme_plat_____etat_de_l_histogramme_plat,VALIDE); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure introduite le 20081008091631... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N P S E U D O - H I S T O G R A M M E */ /* A P A R T I R D ' U N E L I S T E D E S U B S T I T U T I O N : */ /* */ /*************************************************************************************************************************************/ #define CONVERSION_D_UNE_LISTE_DE_SUBSTITUTION_EN_UN_HISTOGRAMME(L_SUBSTITUTION_XX,histogramme_de_substitution) \ Bblock \ DEFV(Positive,INIT(cumul_de_L_SUBSTITUTION_XX,ZERO)); \ /* Cumul de la liste de substitution courante... */ \ /* "plat"... */ \ DEFV(Float,INIT(facteur_de_conversion,FLOT__UNDEF)); \ /* Facteur de passage de la liste de substitution courante a l'histogramme... */ \ DEFV(Positive,INIT(nombre_de_points,ZERO)); \ /* Nombre de points contenu dans l'histogramme dit "de substitution"... */ \ DEFV(Positive,INIT(nombre_de_points_manquants,UNDEF)); \ /* Nombre de points manquants apres la premiere passe de construction de l'histogramme */ \ /* dit "de substitution"... */ \ \ BoIn(niveau,NOIR,BLANC,PAS_COULEURS) \ Bblock \ INCR(cumul_de_L_SUBSTITUTION_XX,ACCES_listes_de_substitution(L_SUBSTITUTION_XX,niveau)); \ /* Nombre "fictif" de points dans la liste de substitution ("fictif" parce qu'une liste */ \ /* de substitution n'est pas un histogramme...). */ \ Eblock \ EBoI \ \ EGAL(facteur_de_conversion,DIVI(FLOT(dimXY),FLOT(cumul_de_L_SUBSTITUTION_XX))); \ \ BoIn(niveau,NOIR,BLANC,PAS_COULEURS) \ Bblock \ EGAL(ITb1(histogramme_de_substitution,INDX(niveau,NOIR)) \ ,INTE(MUL2(facteur_de_conversion,FLOT(ACCES_listes_de_substitution(L_SUBSTITUTION_XX,niveau)))) \ ); \ /* Premiere passe de construction de l'histogramme dit "de substitution"... */ \ INCR(nombre_de_points,ITb1(histogramme_de_substitution,INDX(niveau,NOIR))); \ /* Nombre de points apres la premiere passe de construction de l'histogramme dit */ \ /* "de substitution"... */ \ Eblock \ EBoI \ \ EGAL(nombre_de_points_manquants,SOUS(dimXY,nombre_de_points)); \ \ Tant(IZGT(nombre_de_points_manquants)) \ Bblock \ BoIn(niveau,NOIR,BLANC,PAS_COULEURS) \ Bblock \ Test(IZGT(nombre_de_points_manquants)) \ Bblock \ INCR(ITb1(histogramme_de_substitution,INDX(niveau,NOIR)),I); \ /* Seconde passe de construction de l'histogramme dit "de substitution" par ajout progressif */ \ /* des points manquants... */ \ DECR(nombre_de_points_manquants,I); \ INCR(nombre_de_points,I); \ /* Compte et decompte des points... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EBoI \ Eblock \ ETan \ \ Test(IFNE(nombre_de_points,dimXY)) \ Bblock \ PRINT_ERREUR("probleme de generation d'un histogramme dit 'de substitution'"); \ CAL1(Prer1("(NombreDePoints=%d)\n",nombre_de_points)); \ Eblock \ ATes \ Bblock \ Test(aIFID(histogramme_de_substitution,histogramme_plat)) \ Bblock \ EGAL(Iegalisation_d_histogrammme_plat_____etat_de_l_histogramme_plat,VALIDE); \ /* Introduit le 20081008163223... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ /* Procedure introduite le 20081008152514... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E G A L I S A T I O N D ' H I S T O G R A M M E D ' U N E U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define gIegalisation_d_histogrammme(les_images_sont_standards,imageR,FimageR,imageA,FimageA) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Iegalisation_d_histogrammme(imageR,imageA) \ ,IFegalisation_d_histogrammme(FimageR,FimageA) \ ) \ /* Egalisation de l'histogramme d'une image quelconque ("standard" ou "flottante"). Cette */ \ /* procedure a ete introduite le 20081001165943... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E E C H A N T I L L O N N A G E D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define LE_FORMAT_RESULTAT_EST_DIFFERENT_DU_FORMAT_ARGUMENT(XminR,XmaxR,YminR,YmaxR,XminA,XmaxA,YminA,YmaxA) \ /* Les arguments ont ete introduits le 20170316095821... */ \ IFOU(IFOU(IFNE(XminR,XminA) \ ,IFNE(XmaxR,XmaxA) \ ) \ ,IFOU(IFNE(YminR,YminA) \ ,IFNE(YmaxR,YmaxA) \ ) \ ) \ /* Procedure introduite le 20170315183858 et mise ici le 20170316080639... */ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) # define ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_01 \ /* Ceci a ete introduit le 20030829234243. Cette definition inutile pour le module */ \ /* 'v $xiii/di_image$FON ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_01' */ \ /* ne sert qu'a simplifier la programmation de la commande */ \ /* 'v $xci/deforme.01$K ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_01' */ \ /* afin de ne pas avoir a y tester 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_0?'... */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # nodefine ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_01 \ /* Utilisation de 'load_point_valide(...)' et 'loadF_point_valide(...)'... */ # define ACCES_AUX_POINTS_LORS_D_UN_ECHANTILLONNAGE_DE_L_IMAGE_VERSION_02 \ /* Utilisation de 'Fload_point(...)' et 'FFload_point(...)' (version du 20030826102734). */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) DenumeT13(REECHANTILLONNAGE_PAR_REPLICATION_ET_DESTRUCTION ,REECHANTILLONNAGE_PAR_INTERPOLATION_BILINEAIRE ,REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE /* ATTENTION, dans '$Fdivers' est definie la variable suivante : */ /* */ /* setenv MdefRedim 2 */ /* */ /* il est donc imperatif que 'REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE' vaille aussi */ /* la valeur 2 puisque '$MdefRedim' correspond a la meilleure methode definie... */ ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_DANS_LE_COIN_BAS_GAUCHE ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_DANS_LE_COIN_BAS_DROITE ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_DANS_LE_COIN_HAUT_DROITE ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_DANS_LE_COIN_HAUT_GAUCHE ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_AU_CENTRE ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_POSITIONNEMENT_QUELCONQUE ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_COINCIDENCE_DES_MILIEUX_INFERIEURS ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_COINCIDENCE_DES_MILIEUX_DROITES ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_COINCIDENCE_DES_MILIEUX_SUPERIEURS ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_COINCIDENCE_DES_MILIEUX_GAUCHES ,types_de_methode_de_redimensionnement ) /* Liste des methodes disponibles : */ /* */ /* 0 = par replication (ou destruction suivant le rapport des tailles imageR/imageA), */ /* 1 = par interpolation bilineaire (sur 4 voisins), */ /* 2 = par interpolation bicubique (sur 12 voisins), */ /* 3 = par mise en coincidence des coins "bas-gauche" des images Argument et */ /* Resultat, et en rajoutant du 'NOIR' s'il manque des points, ou en en */ /* supprimant s'il y en a trop, */ /* 4 = par mise en coincidence des coins "bas-droite" des images Argument et */ /* Resultat, et en rajoutant du 'NOIR' s'il manque des points, ou en en */ /* supprimant s'il y en a trop, */ /* 5 = par mise en coincidence des coins "haut-droite" des images Argument et */ /* Resultat, et en rajoutant du 'NOIR' s'il manque des points, ou en en */ /* supprimant s'il y en a trop, */ /* 6 = par mise en coincidence des coins "haut-gauche" des images Argument et */ /* Resultat, et en rajoutant du 'NOIR' s'il manque des points, ou en en */ /* supprimant s'il y en a trop, */ /* 7 = par mise en coincidence des centres des images Argument et Resultat, et en */ /* rajoutant du 'NOIR' s'il manque des points, ou en en supprimant s'il y en */ /* trop, */ /* 8 = par translation quelconque de l'images Argument dans l'image Resultat, et en */ /* rajoutant du 'NOIR' s'il manque des points, ou en en supprimant s'il y en */ /* trop, */ /* 9 = par mise en coincidence des mlieux des cotes inferieurs, */ /* 10 = par mise en coincidence des mlieux des cotes droites, */ /* 11 = par mise en coincidence des mlieux des cotes superieurs, */ /* 12 = par mise en coincidence des mlieux des cotes gauches. */ /* */ /* ('NOIR' etant en fait 'REECHANTILLONNAGE_GENERAL_____niveau_manquant', ce niveau de */ /* "compensation" etant donc variable...). */ /* */ /* Nota : ces definitions ne sont pas liees a 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02' */ /* afin de simplifier les commandes qui les utilisent... */ /* */ /* De plus, on notera que theoriquement seul est utile 'BAS_GAUCHE' (par exemple), les */ /* trois autres s'en deduisant par une combinaison astucieuse de symetries ; ainsi : */ /* */ /* BAS_DROITE(...) == Sy(BAS_GAUCHE(Sy(...))) */ /* HAUT_DROITE(...) == Sx(Sy(BAS_GAUCHE(Sy(Sx(...))))) */ /* HAUT_GAUCHE(...) == Sx(BAS_GAUCHE(Sx(...))) */ /* */ /* mais, en definissant les quatre possibilites, on simplifie son utilisation dans la */ /* commande '$xci/display_RVB$K'... */ /* */ /* Les 4 methodes de mise en coincidence des milieux des cotes ont ete introduites le */ /* 20240527145236, sans changer le numero des methodes plus anciennes afin de garantir la */ /* compatibilite anterieure... */ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # define NIVEAU_MANQUANT_POUR_LE_REECHANTILLONNAGE \ NOIR \ /* Niveau utilise par 'REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_DANS_UN_COIN' et */ \ /* par 'REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_AU_CENTRE' lorsqu'il n'y a pas */ \ /* assez de point dans l'image Argument pour generer l'image Resultat. */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #define METHODE_IMPLICITE_DE_REECHANTILLONNAGE \ REECHANTILLONNAGE_PAR_INTERPOLATION_BILINEAIRE \ /* Choix de la methode implicite de reechantillonnage des images. C'est l'interpolation */ \ /* bilineaire qui est choisie car, en effet, elle est un bon compromis entre la qualite */ \ /* et le temps de calcul (sachant que les temps d'execution des trois methodes sont */ \ /* approximativement dans le "rapport" {1,2,8} ainsi que le montre '$xci/display_RVB$X'). */ \ /* */ \ /* Nota : cette definition n'est pas liee a 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02' */ \ /* afin de simplifier les commandes qui les utilisent... */ /* Les definitions qui suivent ont ete deplacees depuis 'v $xiii/di_image$FON' le */ /* 20041107192647... */ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # define X_apres_reechantillonnage \ X # define Y_apres_reechantillonnage \ Y /* Coordonnees {X,Y} apres le reechantillonnage... */ # define DONNEES_UTILES_AUX_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(type_du_niveau,niveau_indefini) \ DEFV(Float,INIT(Xf_avant_reechantillonnage,FLOT__UNDEF)); \ DEFV(Float,INIT(Yf_avant_reechantillonnage,FLOT__UNDEF)); \ /* Coordonnees {X,Y} avant le reechantillonnage avec toute la precision, */ \ DEFV(Int,INIT(X_approche_avant_reechantillonnage,UNDEF)); \ DEFV(Int,INIT(Y_approche_avant_reechantillonnage,UNDEF)); \ /* Et leur valeurs approchees sur une grille entiere... */ \ DEFV(type_du_niveau,INIT(niveau_interpole_avant_le_reechantillonnage,niveau_indefini)); \ /* Et le niveau en ce point {X,Y}... */ \ \ DEFV(Float,INIT(Xf_apres_reechantillonnage,_____cNORMALISE_OX(X_apres_reechantillonnage))); \ DEFV(Float,INIT(Yf_apres_reechantillonnage,_____cNORMALISE_OY(Y_apres_reechantillonnage))); \ /* Coordonnees {X,Y} apres le reechantillonnage et dans [0,1[... */ \ \ /* Donnees utiles aux operations... */ # define gINITIALISATION_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(Xf_apres_r,Yf_apres_r,tX,tY,utiliser_pasX_pasY,pas_X,pas_Y) \ /* Les arguments {tX,tY} ont ete introduits le 20030825110246. */ \ Bblock \ /* ATTENTION, l'absence de 'Eblock' a la fin est due au 'PUSH_ECHANTILLONNAGE' qui suit... */ \ \ EGAL(Xf_avant_reechantillonnage,SOUS(F__cDENORMALISE_OX(Xf_apres_r),tX)); \ EGAL(Yf_avant_reechantillonnage,SOUS(F__cDENORMALISE_OY(Yf_apres_r),tY)); \ /* Afin d'evaluer les coordonnees {X,Y} avant le reechantillonnage et en gardant toute */ \ /* la precision... */ \ /* */ \ /* Le 20030826102734, je suis passe de 'ADD2(...)' a 'SOUS(...)' ci-dessus ce qui est plus */ \ /* logique. En effet, en faisant l'hypothese que {tX,tY} sont positifs, avec 'ADD2(...)' */ \ /* on va chercher un point qui est a droite et en haut du point courant, ce qui donc en */ \ /* quelque sorte va provoquer un mouvement vers le bas et a gauche de ce dernier, ce qui */ \ /* est un peu en contradiction avec les habitudes de translations {tX,tY} positives... */ \ \ Test(IL_FAUT(gINITIALISATION_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE_____compatibilite_20090225)) \ Bblock \ EGAL(X_approche_avant_reechantillonnage,ENTE(Xf_avant_reechantillonnage)); \ EGAL(Y_approche_avant_reechantillonnage,ENTE(Yf_avant_reechantillonnage)); \ Eblock \ ATes \ Bblock \ EGAL(X_approche_avant_reechantillonnage,ANTE(Xf_avant_reechantillonnage)); \ EGAL(Y_approche_avant_reechantillonnage,ANTE(Yf_avant_reechantillonnage)); \ Eblock \ ETes \ /* Et leur approximation sur une grille "entiere"... */ \ /* */ \ /* Le 20030825162845 il a fallu remplacer 'INTE(...)' par 'ENTE(...)' (suite a */ \ /* l'introduction des arguments {tX,tY} le 20030825110246) car, en effet, a partir de cette */ \ /* date les {Xf_avant_reechantillonnage,Yf_avant_reechantillonnage} peuvent etre negatifs... */ \ /* */ \ /* Le 20090225114137 il a fallu remplacer 'ENTE(...)' par 'ANTE(...)' pour garantir que : */ \ /* */ \ /* Pal */ \ /* */ \ /* $xci/lineaire$X \ */ \ /* A=1 B=0 C=0 \ */ \ /* standard=FAUX \ */ \ /* $formatI | \ */ \ /* $xci/normalise.01$X \ */ \ /* R=$xTV/DEFORMATION$COORD_X \ */ \ /* $formatI */ \ /* */ \ /* $xci/lineaire$X \ */ \ /* A=0 B=1 C=0 \ */ \ /* standard=FAUX \ */ \ /* $formatI | \ */ \ /* $xci/normalise.01$X \ */ \ /* R=$xTV/DEFORMATION$COORD_Y \ */ \ /* $formatI */ \ /* */ \ /* $xci/deformi.01$X \ */ \ /* A=... \ */ \ /* DX=$xTV/DEFORMATION$COORD_X \ */ \ /* DY=$xTV/DEFORMATION$COORD_Y \ */ \ /* interpoler=FAUX \ */ \ /* R=... \ */ \ /* $formatI */ \ /* */ \ /* donne une image Resultat identique a l'image Argument... */ \ \ PUSH_ECHANTILLONNAGE; \ SET_ECHANTILLONNAGE(COND(IL_FAUT(utiliser_pasX_pasY) \ ,pasX \ ,pas_X \ ) \ ,COND(IL_FAUT(utiliser_pasX_pasY) \ ,pasY \ ,pas_Y \ ) \ ); \ /* Mise en place des pas d'echantillonnage... */ \ \ /* ATTENTION, l'absence de 'Eblock' est due au 'PUSH_ECHANTILLONNAGE' qui precede... */ \ \ /* Initialisation des operations et definition des donnees utiles... */ # define TOUJOURS_MARQUER_A_LA_FIN_DES_INTERPOLATIONS_LINEAIRE_BILINEAIRE_ET_BICUBIQUE \ VRAI \ /* A la fin des "vraies" interpolations, on marque toujours les points... */ # define FIN_DES_INTERPOLATIONS_LINEAIRE_BILINEAIRE_ET_BICUBIQUE(niveau_interpole,marquer_le_point) \ Bblock \ Test(IL_FAUT(marquer_le_point)) \ Bblock \ RANGEMENT_DU_NIVEAU_INTERPOLE(niveau_interpole \ ,imageR \ ,X_apres_reechantillonnage,Y_apres_reechantillonnage \ ); \ /* Renvoi du niveau interpole... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Fin generale des operations avec en particulier le renvoi du niveau interpole... */ # define FIN_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(niveau_interpole,marquer_le_point) \ \ /* ATTENTION, l'absence de 'Bblock' est due au 'PULL_ECHANTILLONNAGE' qui suit... */ \ \ PULL_ECHANTILLONNAGE; \ /* Restauration des pas d'echantillonnage... */ \ \ FIN_DES_INTERPOLATIONS_LINEAIRE_BILINEAIRE_ET_BICUBIQUE(niveau_interpole,marquer_le_point); \ Eblock \ /* Fin des operations avec en particulier le renvoi du niveau interpole... */ # define NE_PAS_BLOQUER_L_INTERPOLATION_X \ FU # define NE_PAS_BLOQUER_L_INTERPOLATION_Y \ FU # define NE_PAS_BLOQUER_L_INTERPOLATION_Z \ FU /* Afin de parametrer 'X_barycentrique(...)' et 'Y_barycentrique(...)'. On notera le */ /* 'NE_PAS_BLOQUER_L_INTERPOLATION_Z' a priori inutile (ici), mais utilise dans */ /* 'v $xiipf/fonction.2$FON NE_PAS_BLOQUER_L_INTERPOLATION_.'... */ # define BLOQUER_L_INTERPOLATION_X \ FZERO # define BLOQUER_L_INTERPOLATION_Y \ FZERO # define BLOQUER_L_INTERPOLATION_Z \ FZERO /* Introduit le 20081001093101 par symetrie avec 'NE_PAS_BLOQUER_L_INTERPOLATION_?'... */ # define X_barycentrique(facteur,operateur) \ MUL2(facteur,SOUS(Xf_avant_reechantillonnage,FLOT(operateur(X_approche_avant_reechantillonnage)))) # define Y_barycentrique(facteur,operateur) \ MUL2(facteur,SOUS(Yf_avant_reechantillonnage,FLOT(operateur(Y_approche_avant_reechantillonnage)))) /* Coordonnees {X,Y} barycentriques... */ /* */ /* Le 20080930162107 fut introduit 'facteur' afin de pouvoir controler independemment */ /* les interpolations selon 'X' et 'Y'... */ /* */ /* Le 20081001085829 fut introduit 'operateur' afin de permettre d'utiliser ces deux */ /* definitions dans 'VOISINAGE_POINT_BILINEAIRE(...)' et ainsi de pouvoir y controler */ /* independemment les interpolations selon 'X' et 'Y'... */ # define DERIVATION_NUMERIQUE_POUR_L_INTERPOLATION_BICUBIQUE(fonction_origine,fonction_extremite,pas_du_maillage) \ MUL2(VOISINAGE_POINT_BICUBIQUE_____facteur_des_derivees_numeriques \ ,DERIVATION_PARTIELLE(fonction_origine \ ,fonction_extremite \ ,pas_du_maillage \ ) \ ) \ /* Calcul de la derivee numerique d'une fonction. */ # define VOISINAGE_POINT_SIMPLE(FXf_apres_reechantillonnage,FYf_apres_reechantillonnage,Savant,Sapres,Tn,Ni,tX,tY,gG) \ Bblock \ DONNEES_UTILES_AUX_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(Tn,Ni) \ /* ATTENTION, a la fin de 'DONNEES_UTILES_AUX_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE' il */ \ /* n'y a pas de ";" au cas ou d'autres donnees devraient suivre... */ \ DEFV(Float,INIT(niveau_avant_correction,FLOT__UNDEF)); \ /* Niveau apres interpolation et avant la correction destinee a prendre en compte les */ \ /* problemes d'arrondi... */ \ \ BLOC(Savant); \ /* Mise en place du dimensionnement de l'image Argument. */ \ \ INITIALISATION_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(FXf_apres_reechantillonnage \ ,FYf_apres_reechantillonnage \ ,tX \ ,tY \ ); \ /* Debut des operations avec en particulier definition des donnees utiles... */ \ \ EGAL(niveau_avant_correction \ ,ECHANTILLONNAGE_DENORMALISE_DE_L_IMAGE(X_approche_avant_reechantillonnage \ ,Y_approche_avant_reechantillonnage \ ) \ ); \ /* Niveau au point {X,Y} sans interpolation... */ \ \ EGAL(niveau_interpole_avant_le_reechantillonnage,gG(niveau_avant_correction)); \ /* Puis corrige afin de prendre en compte les erreurs d'arrondi... */ \ \ BLOC(Sapres); \ /* Remise en place du dimensionnement de l'image Resultat. */ \ \ FIN_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE \ (niveau_interpole_avant_le_reechantillonnage \ ,TOUJOURS_MARQUER_A_LA_FIN_DES_INTERPOLATIONS_LINEAIRE_BILINEAIRE_ET_BICUBIQUE \ ); \ /* Fin des operations, avec rangement du niveau interpole en particulier... */ \ Eblock \ /* Reechantillonnage sans reechantillonnage (dit "simple") introduit le 20080926133046. */ # define VOISINAGE_POINT_BILINEAIRE(FXf_apres_reechantillonnage,FYf_apres_reechantillonnage,Savant,Sapres,Tn,Ni,tX,tY,gG,kX,kY) \ Bblock \ DONNEES_UTILES_AUX_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(Tn,Ni) \ /* ATTENTION, a la fin de 'DONNEES_UTILES_AUX_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE' il */ \ /* n'y a pas de ";" au cas ou d'autres donnees devraient suivre... */ \ DEFV(Float,INIT(coefficient_NEUT_NEUT,FLOT__UNDEF)); \ DEFV(Float,INIT(coefficient_SUCX_NEUT,FLOT__UNDEF)); \ DEFV(Float,INIT(coefficient_SUCX_SUCY,FLOT__UNDEF)); \ DEFV(Float,INIT(coefficient_NEUT_SUCY,FLOT__UNDEF)); \ /* Coefficients de l'interpolation bilineaire. Chacun d'eux est en fait egal a l'aire du */ \ /* rectangle "complementaire" dans le pave [0,1[x[0,1[ courant ; le terme "complementaire" */ \ /* designe le rectangle "oppose par le sommet" constitue par le point courant. Enfin, on */ \ /* notera que la somme de ces quatre coefficients est egale a 1 exactement... */ \ DEFV(Float,INIT(niveau_avant_correction,FLOT__UNDEF)); \ /* Niveau apres interpolation et avant la correction destinee a prendre en compte les */ \ /* problemes d'arrondi... */ \ BLOC(Savant); \ /* Mise en place du dimensionnement de l'image Argument. */ \ \ INITIALISATION_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(FXf_apres_reechantillonnage \ ,FYf_apres_reechantillonnage \ ,tX \ ,tY \ ); \ /* Debut des operations avec en particulier definition des donnees utiles... */ \ \ BSaveModifyVariable(Int \ ,pasX \ ,VOISINAGE_POINT_BILINEAIRE_____pasX \ ); \ BSaveModifyVariable(Int \ ,pasY \ ,VOISINAGE_POINT_BILINEAIRE_____pasY \ ); \ /* La possible modification de {pasX,pasY} a ete introduite le 20160329120845... */ \ \ EGAL(coefficient_NEUT_NEUT \ ,MUL2(COMP(DIVI(NEUT(X_barycentrique(kX,NEUT)) \ ,FLOT(pasX) \ ) \ ) \ ,COMP(DIVI(NEUT(Y_barycentrique(kY,NEUT)) \ ,FLOT(pasY) \ ) \ ) \ ) \ ); \ EGAL(coefficient_SUCX_NEUT \ ,MUL2(COMP(DIVI(ABSO(X_barycentrique(kX,SUCX)) \ ,FLOT(pasX) \ ) \ ) \ ,COMP(DIVI(NEUT(Y_barycentrique(kY,NEUT)) \ ,FLOT(pasY) \ ) \ ) \ ) \ ); \ EGAL(coefficient_SUCX_SUCY \ ,MUL2(COMP(DIVI(ABSO(X_barycentrique(kX,SUCX)) \ ,FLOT(pasX) \ ) \ ) \ ,COMP(DIVI(ABSO(Y_barycentrique(kY,SUCY)) \ ,FLOT(pasY) \ ) \ ) \ ) \ ); \ EGAL(coefficient_NEUT_SUCY \ ,MUL2(COMP(DIVI(NEUT(X_barycentrique(kX,NEUT)) \ ,FLOT(pasX) \ ) \ ) \ ,COMP(DIVI(ABSO(Y_barycentrique(kY,SUCY)) \ ,FLOT(pasY) \ ) \ ) \ ) \ ); \ /* Calcul des coefficients de l'interpolation bilineaire. */ \ /* */ \ /* Rappelons que : */ \ /* */ \ /* [(1-u)*(1-v)] */ \ /* +[u*(1-v)] */ \ /* +[u*v] */ \ /* +[(1-u)*v] = 1. */ \ /* */ \ /* {u,v} designant les coordonnees barycentriques du point {Xf_effective,Yf_effective} */ \ /* dans le carre courant. */ \ \ EGAL(niveau_avant_correction \ ,NIVA(LIZ4(coefficient_NEUT_NEUT \ ,ECHANTILLONNAGE_DENORMALISE_DE_L_IMAGE(NEUT(X_approche_avant_reechantillonnage) \ ,NEUT(Y_approche_avant_reechantillonnage) \ ) \ ,coefficient_SUCX_NEUT \ ,ECHANTILLONNAGE_DENORMALISE_DE_L_IMAGE(SUCX(X_approche_avant_reechantillonnage) \ ,NEUT(Y_approche_avant_reechantillonnage) \ ) \ ,coefficient_SUCX_SUCY \ ,ECHANTILLONNAGE_DENORMALISE_DE_L_IMAGE(SUCX(X_approche_avant_reechantillonnage) \ ,SUCY(Y_approche_avant_reechantillonnage) \ ) \ ,coefficient_NEUT_SUCY \ ,ECHANTILLONNAGE_DENORMALISE_DE_L_IMAGE(NEUT(X_approche_avant_reechantillonnage) \ ,SUCY(Y_approche_avant_reechantillonnage) \ ) \ ) \ ) \ ); \ /* Et le niveau en ce point interpole aux quatre plus proches voisins entiers... */ \ /* */ \ /* Le 20160329132750, lors de la mise de l'image 'v $xiirC/OBJC.I19__1_______.11' au */ \ /* format 'Sud', je note que le resultat est une image toute noire. En effet, la methode */ \ /* precedente revient, pour calculer 'niveau_avant_correction', a selectionner des points */ \ /* regulierement repartis aux noeuds d'une grille 4x4 (4=1204/256=Sdu/Sud) et par */ \ /* malchance tous ces points tombent dans les zones noires de la courbe de Hilbert... */ \ /* Les pas {VOISINAGE_POINT_BILINEAIRE_____pasX,VOISINAGE_POINT_BILINEAIRE_____pasY} */ \ /* specifiques introduits a cette occasion n'ont evidemment rien change puisqu'en effet */ \ /* 256 divise exactement 1024... */ \ EGAL(niveau_interpole_avant_le_reechantillonnage,gG(niveau_avant_correction)); \ /* Puis corrige afin de prendre en compte les erreurs d'arrondi... */ \ \ ESaveModifyVariable(Int \ ,pasY \ ); \ ESaveModifyVariable(Int \ ,pasX \ ); \ /* La possible modification de {pasX,pasY} a ete introduite le 20160329120845... */ \ \ BLOC(Sapres); \ /* Remise en place du dimensionnement de l'image Resultat. */ \ FIN_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE \ (niveau_interpole_avant_le_reechantillonnage \ ,TOUJOURS_MARQUER_A_LA_FIN_DES_INTERPOLATIONS_LINEAIRE_BILINEAIRE_ET_BICUBIQUE \ ); \ /* Fin des operations, avec rangement du niveau interpole en particulier... */ \ Eblock \ /* Reechantillonnage bilineaire du point courant {X,Y} introduit le 20050322111532, */ # define VOISINAGE_POINT_BICUBIQUE(FXf_apres_reechantillonnage,FYf_apres_reechantillonnage,Savant,Sapres,Tn,Ni,tX,tY,kX,kY) \ /* Les arguments {tX,tY} ont ete introduits le 20030825110246. */ \ /* */ \ /* On notera le 20050313175632 le changement des noms de deux parametres 'Ty,In' en 'Tn,Ni' */ \ /* plus logiques mnemoniquement ("Tn" pour "Type Niveau" et "Ni" pour "Niveau Indefini"...). */ \ /* */ \ /* Le 20080930162107 furent introduits {kX,kY} afin de controler independemment, si besoin */ \ /* est, les interpolations selon 'X' et 'Y'... */ \ \ /* On notera que ce code est tres inspire de celui de la fonction 'Ifractal_2D(...)' de */ \ /* 'v $xiii/aleat.2$vv$FON'. */ \ Bblock \ DEFV(Float,INIT(fonction___au_point_entier_u0v0,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=0,v=0), */ \ DEFV(Float,INIT(fonction___au_point_entier_u1v0,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=+1,v=0), */ \ DEFV(Float,INIT(fonction___au_point_entier_u0v1,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=0,v=+1), */ \ DEFV(Float,INIT(fonction___au_point_entier_u1v1,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=+1,v=+1). */ \ \ DEFV(Float,INIT(fonction___au_point_entier_u9v0,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=-1,v=0), */ \ DEFV(Float,INIT(fonction___au_point_entier_u2v0,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=+2,v=0), */ \ DEFV(Float,INIT(fonction___au_point_entier_u9v1,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=-1,v=+1), */ \ DEFV(Float,INIT(fonction___au_point_entier_u2v1,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=+2,v=+1). */ \ DEFV(Float,INIT(fonction___au_point_entier_u0v9,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=0,v=-1), */ \ DEFV(Float,INIT(fonction___au_point_entier_u1v9,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=+1,v=-1), */ \ DEFV(Float,INIT(fonction___au_point_entier_u0v2,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=0,v=+2), */ \ DEFV(Float,INIT(fonction___au_point_entier_u1v2,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=+1,v=+2). */ \ DEFV(Float,INIT(fonction___au_point_uUv0,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=U,v=0), */ \ DEFV(Float,INIT(fonction___au_point_uUv1,FLOT__UNDEF)); \ /* Valeur de la fonction au point "entier" (u=U,v=+1). */ \ DEFV(Float,INIT(fonction___au_point_uUvV,FLOT__UNDEF)); \ /* Valeur de la fonction aleatoire au noeud (u=U,v=V). */ \ \ DEFV(Float,INIT(derivee_Du_au_point_entier_u0v0,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'u' de la fonction au point "entier" (u=0,v=0), */ \ DEFV(Float,INIT(derivee_Du_au_point_entier_u1v0,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'u' de la fonction au point "entier" (u=+1,v=0), */ \ DEFV(Float,INIT(derivee_Du_au_point_entier_u0v1,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'u' de la fonction au point "entier" (u=0,v=+1), */ \ DEFV(Float,INIT(derivee_Du_au_point_entier_u1v1,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'u' de la fonction au point "entier" (u=+1,v=+1). */ \ DEFV(Float,INIT(derivee_Dv_au_point_entier_u0v0,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'v' de la fonction au point "entier" (u=0,v=0), */ \ DEFV(Float,INIT(derivee_Dv_au_point_entier_u1v0,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'v' de la fonction au point "entier" (u=+1,v=0), */ \ DEFV(Float,INIT(derivee_Dv_au_point_entier_u0v1,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'v' de la fonction au point "entier" (u=0,v=+1), */ \ DEFV(Float,INIT(derivee_Dv_au_point_entier_u1v1,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'v' de la fonction au point "entier" (u=+1,v=+1). */ \ DEFV(Float,INIT(derivee_Dv_au_point_uUv0,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'v' de la fonction au point (u=U,v=0), */ \ DEFV(Float,INIT(derivee_Dv_au_point_uUv1,FLOT__UNDEF)); \ /* Valeur de la derivee partielle en 'v' de la fonction au point (u=U,v=+1). */ \ \ DONNEES_UTILES_AUX_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(Tn,Ni) \ /* ATTENTION, a la fin de 'DONNEES_UTILES_AUX_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE' il */ \ /* n'y a pas de ";" au cas ou d'autres donnees devraient suivre... */ \ \ BLOC(Savant); \ /* Mise en place du dimensionnement de l'image Argument. */ \ \ INITIALISATION_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(FXf_apres_reechantillonnage \ ,FYf_apres_reechantillonnage \ ,tX \ ,tY \ ); \ /* Debut des operations avec en particulier definition des donnees utiles... */ \ \ BSaveModifyVariable(Int \ ,pasX \ ,VOISINAGE_POINT_BICUBIQUE_____pasX \ ); \ BSaveModifyVariable(Int \ ,pasY \ ,VOISINAGE_POINT_BICUBIQUE_____pasY \ ); \ /* La possible modification de {pasX,pasY} a ete introduite le 20160329120845... */ \ \ EGAL(fonction___au_point_entier_u0v0 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(NEUT(X_approche_avant_reechantillonnage)) \ ,NEUT(NEUT(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u1v0 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(SUCX(X_approche_avant_reechantillonnage)) \ ,NEUT(NEUT(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u1v1 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(SUCX(X_approche_avant_reechantillonnage)) \ ,NEUT(SUCY(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u0v1 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(NEUT(X_approche_avant_reechantillonnage)) \ ,NEUT(SUCY(Y_approche_avant_reechantillonnage)) \ ) \ ); \ \ EGAL(fonction___au_point_entier_u9v0 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(PREX(X_approche_avant_reechantillonnage)) \ ,NEUT(NEUT(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u0v9 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(NEUT(X_approche_avant_reechantillonnage)) \ ,NEUT(PREY(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u1v9 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(SUCX(X_approche_avant_reechantillonnage)) \ ,NEUT(PREY(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u2v0 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(SUCX(SUCX(X_approche_avant_reechantillonnage)) \ ,NEUT(NEUT(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u2v1 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(SUCX(SUCX(X_approche_avant_reechantillonnage)) \ ,NEUT(SUCY(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u1v2 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(SUCX(X_approche_avant_reechantillonnage)) \ ,SUCY(SUCY(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u0v2 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(NEUT(X_approche_avant_reechantillonnage)) \ ,SUCY(SUCY(Y_approche_avant_reechantillonnage)) \ ) \ ); \ EGAL(fonction___au_point_entier_u9v1 \ ,ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(NEUT(PREX(X_approche_avant_reechantillonnage)) \ ,NEUT(SUCY(Y_approche_avant_reechantillonnage)) \ ) \ ); \ /* Calcul des valeurs de la fonction aux noeuds entourant le carre de base, afin de pouvoir */ \ /* calculer ci-apres les derivees partielles en chacun de ses noeuds par des differences */ \ /* finies... */ \ \ EGAL(derivee_Du_au_point_entier_u0v0 \ ,DERIVATION_NUMERIQUE_POUR_L_INTERPOLATION_BICUBIQUE(fonction___au_point_entier_u9v0 \ ,fonction___au_point_entier_u1v0 \ ,FLOT(DOUB(pasX)) \ ) \ ); \ EGAL(derivee_Du_au_point_entier_u1v0 \ ,DERIVATION_NUMERIQUE_POUR_L_INTERPOLATION_BICUBIQUE(fonction___au_point_entier_u0v0 \ ,fonction___au_point_entier_u2v0 \ ,FLOT(DOUB(pasX)) \ ) \ ); \ EGAL(derivee_Du_au_point_entier_u1v1 \ ,DERIVATION_NUMERIQUE_POUR_L_INTERPOLATION_BICUBIQUE(fonction___au_point_entier_u0v1 \ ,fonction___au_point_entier_u2v1 \ ,FLOT(DOUB(pasX)) \ ) \ ); \ EGAL(derivee_Du_au_point_entier_u0v1 \ ,DERIVATION_NUMERIQUE_POUR_L_INTERPOLATION_BICUBIQUE(fonction___au_point_entier_u9v1 \ ,fonction___au_point_entier_u1v1 \ ,FLOT(DOUB(pasX)) \ ) \ ); \ EGAL(derivee_Dv_au_point_entier_u0v0 \ ,DERIVATION_NUMERIQUE_POUR_L_INTERPOLATION_BICUBIQUE(fonction___au_point_entier_u0v9 \ ,fonction___au_point_entier_u0v1 \ ,FLOT(DOUB(pasY)) \ ) \ ); \ EGAL(derivee_Dv_au_point_entier_u1v0 \ ,DERIVATION_NUMERIQUE_POUR_L_INTERPOLATION_BICUBIQUE(fonction___au_point_entier_u1v9 \ ,fonction___au_point_entier_u1v1 \ ,FLOT(DOUB(pasY)) \ ) \ ); \ EGAL(derivee_Dv_au_point_entier_u1v1 \ ,DERIVATION_NUMERIQUE_POUR_L_INTERPOLATION_BICUBIQUE(fonction___au_point_entier_u1v0 \ ,fonction___au_point_entier_u1v2 \ ,FLOT(DOUB(pasY)) \ ) \ ); \ EGAL(derivee_Dv_au_point_entier_u0v1 \ ,DERIVATION_NUMERIQUE_POUR_L_INTERPOLATION_BICUBIQUE(fonction___au_point_entier_u0v0 \ ,fonction___au_point_entier_u0v2 \ ,FLOT(DOUB(pasY)) \ ) \ ); \ /* Calcul des derivees partielles en 'u' et 'v' aux noeuds du carre de base par des */ \ /* differences finies a l'aide des differentes valeurs aux noeuds du maillage... */ \ EGAL(derivee_Dv_au_point_uUv0 \ ,INTERPOLATION_LINEAIRE(derivee_Dv_au_point_entier_u0v0 \ ,derivee_Dv_au_point_entier_u1v0 \ ,X_barycentrique(kX,NEUT) \ ) \ ); \ EGAL(derivee_Dv_au_point_uUv1 \ ,INTERPOLATION_LINEAIRE(derivee_Dv_au_point_entier_u0v1 \ ,derivee_Dv_au_point_entier_u1v1 \ ,X_barycentrique(kX,NEUT) \ ) \ ); \ /* Calcul des derivees partielles en 'u' et 'v' sur les aretes horizontales du carre de */ \ /* base par des interpolations lineaires a partir des sommets voisins (on notera que l'on */ \ /* ne peut utiliser d'interpolation cubique, puisqu'on ne connait pas encore les derivees). */ \ \ EGAL(fonction___au_point_uUv0 \ ,INTERPOLATION_CUBIQUE(fonction___au_point_entier_u0v0 \ ,derivee_Du_au_point_entier_u0v0 \ ,fonction___au_point_entier_u1v0 \ ,derivee_Du_au_point_entier_u1v0 \ ,X_barycentrique(kX,NEUT) \ ) \ ); \ EGAL(fonction___au_point_uUv1 \ ,INTERPOLATION_CUBIQUE(fonction___au_point_entier_u0v1 \ ,derivee_Du_au_point_entier_u0v1 \ ,fonction___au_point_entier_u1v1 \ ,derivee_Du_au_point_entier_u1v1 \ ,X_barycentrique(kX,NEUT) \ ) \ ); \ /* Calcul de la valeur de la fonction sur les aretes horizontales du carre de base... */ \ EGAL(fonction___au_point_uUvV \ ,INTERPOLATION_CUBIQUE(fonction___au_point_uUv0 \ ,derivee_Dv_au_point_uUv0 \ ,fonction___au_point_uUv1 \ ,derivee_Dv_au_point_uUv1 \ ,Y_barycentrique(kY,NEUT) \ ) \ ); \ /* Ordre des interpolations cubiques ('-1' est note '9') : */ \ /* */ \ /* */ \ /* v=2 (0,2) - - - - - - (1,2) */ \ /* /| |\ */ \ /* / \ */ \ /* / | | \ */ \ /* / \ */ \ /* / | | \ */ \ /* / \ */ \ /* / | | \ */ \ /* / [1] \ */ \ /* / | | \ */ \ /* v=1 (9,1) - - - - - - (0,1)------(U,1)--(1,1) - - - - - - (2,1) */ \ /* | | . | | */ \ /* | . | */ \ /* | | . | | */ \ /* | . | */ \ /* | | . | | */ \ /* | [2] (U,V) | */ \ /* | | . | | */ \ /* | . | */ \ /* | | . | | */ \ /* v=0 (9,0) - - -<- - - (0,0)------(U,0)--(1,0) - - - - - - (2,0) */ \ /* \ | | / */ \ /* \ [1] / */ \ /* \ | | / */ \ /* \ / */ \ /* \ | | / */ \ /* \ / */ \ /* \ | | / */ \ /* \ / */ \ /* \| |/ */ \ /* v=-1 (0,9) - - - - - - (1,9) */ \ /* */ \ /* u=-1 u=0 u=1 u=2 */ \ /* */ \ /* */ \ /* v ^ */ \ /* | */ \ /* | */ \ /* o----> */ \ /* u */ \ /* */ \ \ EGAL(niveau_interpole_avant_le_reechantillonnage \ ,__DENORMALISE_DU_NIVEAU_INTERPOLE(fonction___au_point_uUvV) \ ); \ /* Et le niveau en ce point interpole aux douze plus proches voisins entiers... */ \ \ ESaveModifyVariable(Int \ ,pasY \ ); \ ESaveModifyVariable(Int \ ,pasX \ ); \ /* La possible modification de {pasX,pasY} a ete introduite le 20160329120845... */ \ \ BLOC(Sapres); \ /* Remise en place du dimensionnement de l'image Resultat. */ \ \ FIN_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE \ (niveau_interpole_avant_le_reechantillonnage \ ,TOUJOURS_MARQUER_A_LA_FIN_DES_INTERPOLATIONS_LINEAIRE_BILINEAIRE_ET_BICUBIQUE \ ); \ /* Fin des operations, avec rangement du niveau interpole en particulier... */ \ Eblock \ /* Reechantillonnage bicubique du point courant {X,Y}. */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S F O R M A T I O N D ' U N E I M A G E P A R D E P L A C E M E N T */ /* D E S C O O R D O N N E E S V I A D E U X A U T R E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #define gIdistorsion_par_un_champ(les_images_sont_standards \ ,imageR,FimageR \ ,imageA,FimageA \ ,facteurX,imageX,FimageX,anti_translationX,Fanti_translationX \ ,facteurY,imageY,FimageY,anti_translationY,Fanti_translationY \ ,methode \ ) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Idistorsion_par_un_champ(imageR \ ,imageA \ ,facteurX,imageX,anti_translationX \ ,facteurY,imageY,anti_translationY \ ,methode \ ) \ ,IFdistorsion_par_un_champ(FimageR \ ,FimageA \ ,facteurX,FimageX,Fanti_translationX \ ,facteurY,FimageY,Fanti_translationY \ ,methode \ ) \ ) \ /* Distorsion d'une image quelconque ("standard" ou "flottante") a l'aide de deux autres */ \ /* images (procedure introduite le 20210603103206). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E M O N T E E D U N I V E A U D E N O I R D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define FACTEUR_D_ECHELLE_POUR_LA_REMONTEE_DU_NIVEAU_DE_NOIR(niveau_de_NOIR_remonte) \ DIVI(SOUS(FLOT(NIVR(BLANC)),FLOT(NIVR(niveau_de_NOIR_remonte))) \ ,SOUS(FLOT(NIVR(BLANC)),FLOT(NIVR(NOIR))) \ ) \ /* Facteur d'echelle pour remonter le niveau de NOIR. */ #define FACTEUR_DE_TRANSLATION_POUR_LA_REMONTEE_DU_NIVEAU_DE_NOIR(niveau_de_NOIR_remonte) \ MUL2(DIVI(SOUS(FLOT(NIVR(niveau_de_NOIR_remonte)),FLOT(NIVR(NOIR))) \ ,SOUS(FLOT(NIVR(BLANC)),FLOT(NIVR(NOIR))) \ ) \ ,FLOT(NIVR(BLANC)) \ ) \ /* Facteur de translation pour remonter le niveau de NOIR. */ #define REMONTEE_D_UN_NIVEAU_EN_FONCTION_DU_NIVEAU_DE_NOIR(niveau,niveau_de_NOIR_remonte) \ TRNF(AXPB(FACTEUR_D_ECHELLE_POUR_LA_REMONTEE_DU_NIVEAU_DE_NOIR(niveau_de_NOIR_remonte) \ ,FLOT(niveau) \ ,FACTEUR_DE_TRANSLATION_POUR_LA_REMONTEE_DU_NIVEAU_DE_NOIR(niveau_de_NOIR_remonte) \ ) \ ) \ /* Remontee d'un niveau en fonction d'un nouveau niveau de NOIR (dit "remonte"). */ #define REMONTEE_DU_NIVEAU_DE_NOIR(imageR,imageA,niveau_de_NOIR_remonte) \ Bblock \ VALIDATION_NIVEAU(niveau_de_NOIR_remonte \ ,BLOC(VIDE;) \ ,BLOC(PRINT_ERREUR("le 'niveau de NOIR remonte' demande est inexistant"); \ CAL1(Prer1("ce NIVEAU est %08X\n",niveau_de_NOIR_remonte)); \ ) \ ); \ Test(IFNE(niveau_de_NOIR_remonte,NOIR)) \ Bblock \ CALS(Iscale(imageR \ ,FACTEUR_D_ECHELLE_POUR_LA_REMONTEE_DU_NIVEAU_DE_NOIR(niveau_de_NOIR_remonte) \ ,imageA \ ,FACTEUR_DE_TRANSLATION_POUR_LA_REMONTEE_DU_NIVEAU_DE_NOIR(niveau_de_NOIR_remonte) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Remontee du niveau de NOIR d'une image : */ \ /* */ \ /* B - N N - N */ \ /* 2 2 1 */ \ /* y = --------.x + ---------.B */ \ /* B - N B - N */ \ /* 1 1 */ \ /* */ \ /* ou : */ \ /* */ \ /* N designe le vrai NOIR, */ \ /* 1 */ \ /* */ \ /* N designe le NOIR remonte, */ \ /* 2 */ \ /* */ \ /* B designe le BLANC, */ \ /* x un niveau Argument, */ \ /* y un niveau Resultat. */ \ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S Y M E T R I E D ' A X E H O R I Z O N T A L ( O X ) D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gIx_symetrie(les_images_sont_standards,imageR,FimageR,imageA,FimageA) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Ix_symetrie(imageR,imageA) \ ,IFx_symetrie(FimageR,FimageA) \ ) \ /* Symetrie d'axe horizontal d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S Y M E T R I E D ' A X E V E R T I C A L ( O Y ) D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gIy_symetrie(les_images_sont_standards,imageR,FimageR,imageA,FimageA) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Iy_symetrie(imageR,imageA) \ ,IFy_symetrie(FimageR,FimageA) \ ) \ /* Symetrie d'axe vertical d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P E R I O D I S A T I O N D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gIperiodisation(les_images_sont_standards,imageR,FimageR,imageA,FimageA) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Iperiodisation(imageR,imageA) \ ,IFperiodisation(FimageR,FimageA) \ ) \ /* Symetrie d'axe vertical d'une image quelconque ("standard" ou "flottante"). Ceci fut */ /* introduit le 20150603150137... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N V E R S I O N ( A U S E N S G E O M E T R I Q U E D U T E R M E ) : */ /* */ /*************************************************************************************************************************************/ #define INVG(x,pole,puissance) \ AXPB(puissance,INVZ(SOUS(x,pole)),pole) \ /* Inversion de 'x' suivant le pole 'pole' et la puissance 'puissance' (introduit le */ \ /* 20060425163759) suivant la definition : */ \ /* */ \ /* (X1 - pole)x(X2 - pole) = puissance */ \ /* */ \ /* soit : */ \ /* */ \ /* puissance */ \ /* X2 = ----------- + pole */ \ /* X1 - pole */ \ /* */ \ /* ce qui correspond a la definition de l'inversion geometrique... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O M P L E M E N T A T I O N D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gIcomplementation(les_images_sont_standards,imageR,FimageR,imageA,FimageA) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Icomplementation(imageR,imageA) \ ,IFcomplementation(FimageR,FimageA) \ ) \ /* Complementation d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M I S E A L ' E C H E L L E D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gIscale(les_images_sont_standards,imageR,FimageR,facteur_d_echelle,imageA,FimageA,facteur_de_translation) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Iscale(imageR,facteur_d_echelle,imageA,facteur_de_translation) \ ,IFscale(FimageR,facteur_d_echelle,FimageA,facteur_de_translation) \ ) \ /* Mise a l'echelle d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O R M A L I S A T I O N D ' U N E I M A G E F L O T T A N T E : */ /* */ /*************************************************************************************************************************************/ #define EPSILON_DE_SEUILLAGE_INFERIEUR_PAR_RAPPORT_AU_NIVEAU_ORIGINE_POUR_IFnormalisation \ D_EPSILON \ /* Pour eviter des "underflows" dans 'IFnormalisation(...)' via un 'NORM(...)' (introduit */ \ /* le 20001003175237 en s'inspirant du probleme 'v $xiii/conversion$FON 20000929102058'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I L T R A G E P A S S E _ B A N D E D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define NIVEAU_PASSE_BANDE_INFERIEUR \ NOIR \ /* Niveau a attribuer eventuellement aux points de niveaux inferieurs a la bande, et ce */ \ /* par valeur inferieure. */ #define NIVEAU_PASSE_BANDE_SUPERIEUR \ NOIR \ /* Niveau a attribuer eventuellement aux points de niveaux inferieurs a la bande, et ce */ \ /* par valeur superieure. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I L T R A G E C O U P E _ B A N D E D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define NIVEAU_COUPE_BANDE \ NOIR \ /* Niveau a attribuer eventuellement aux points de niveaux compris dans la bande. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S P O S I T I O N D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gItransposition(les_images_sont_standards,imageR,FimageR,imageA,FimageA) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Itransposition(imageR,imageA) \ ,IFtransposition(FimageR,FimageA) \ ) \ /* Transposition d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O D I F I C A T I O N D ' U N E I M A G E P A R U N E F O N C T I O N : */ /* */ /*************************************************************************************************************************************/ #define MODIFICATION_D_UN_CHAMP(amplificateur_fonction,Acces,Fonction,translateur_fonction,niveau,x,y,ASID1,trans_champ,scale) \ AXPB(amplificateur_fonction \ ,Acces(Fonction)(niveau \ ,ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D(x,y,Zf_ARGUMENT_INUTILE,Tf_ARGUMENT_INUTILE \ ,ASID1 \ ,trans_champ,scale \ ) \ ,ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D(x,y,Zf_ARGUMENT_INUTILE,Tf_ARGUMENT_INUTILE \ ,ASID1 \ ,trans_champ,scale \ ) \ ) \ ,translateur_fonction \ ) \ /* Macro de modification d'un point donne {x,y} d'un champ suivant une translation definie */ \ /* par 'trans_champ' accedee par 'ASID1' ('ASI1' ou 'ASD1'). La fonction modifiant */ \ /* le champ est definie par 'Fonction' et accedee par 'Acces' ('RIEN' ou 'fPOINTEUR'). On */ \ /* notera le 'SCAL(...,dimY,dimX)' destine a faire que les axes soient orthonormes, meme si */ \ /* l'image generee n'est pas carree (voir par exemple 'Pal')... */ \ /* */ \ /* L'usage de 'ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D(...)' fut introduit le 20060627120850. */ \ /* On notera au passage que la coordonnee 'Z' (representee par 'FLOT(Zmin)') ne sert en fait */ \ /* a rien. Le 20100209095945 fut introduite la coordonnee 'T' ('Tf_ARGUMENT_INUTILE' la */ \ /* representant, 'Zf_ARGUMENT_INUTILE' ayant remplace 'FLOT(Zmin)' a cette occasion...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V O L U T I O N D ' U N P O I N T P A R U N N O Y A U : */ /* */ /*************************************************************************************************************************************/ #define EDITER_LES_MESSAGES_DU_CALCUL_D_UN_NOYAU_DE_CONVOLUTION_VARIABLE \ VRAI #define NE_PAS_EDITER_LES_MESSAGES_DU_CALCUL_D_UN_NOYAU_DE_CONVOLUTION_VARIABLE \ NOTL(EDITER_LES_MESSAGES_DU_CALCUL_D_UN_NOYAU_DE_CONVOLUTION_VARIABLE) /* Afin de savoir s'il faut editer ou pas les messages d'erreur de generation d'un */ /* noyau de convolution variable... */ #define TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION \ MUL2(KK___dimX,KK___dimY) \ /* Taille maximale d'un noyau de convolution ; on notera la definition a partir du couple */ \ /* ('KK___dimX','KK___dimY') et non pas a partir de ('dimX','dimY') afin de ne pas avoir de */ \ /* probleme de syntaxe lors de la definition des noyaux de convolution... */ #if ( (defined(BUG_SYSTEME_APC_GCC_tableaux_statiques_trop_volumineux_1)) \ || (defined(BUG_SYSTEME_APC_GCC_too_large_stack_frames)) \ ) # undef TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION # define TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION \ FRA4(FRA4(MUL2(KK___dimX,KK___dimY))) \ /* Taille maximale d'un noyau de convolution ; on notera la definition a partir du couple */ \ /* ('KK___dimX','KK___dimY') et non pas a partir de ('dimX','dimY') afin de ne pas avoir de */ \ /* probleme de syntaxe lors de la definition des noyaux de convolution... */ #Aif ( (defined(BUG_SYSTEME_APC_GCC_tableaux_statiques_trop_volumineux_1)) \ || (defined(BUG_SYSTEME_APC_GCC_too_large_stack_frames)) \ ) #Eif ( (defined(BUG_SYSTEME_APC_GCC_tableaux_statiques_trop_volumineux_1)) \ || (defined(BUG_SYSTEME_APC_GCC_too_large_stack_frames)) \ ) #if ( (defined(BUG_SYSTEME_DECALPHA_OSF1_CC_large_stack_frames_not_yet_supported)) \ ) # undef TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION # define TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION \ FRA16(FRA16(MUL2(KK___dimX,KK___dimY))) \ /* Taille maximale d'un noyau de convolution ; on notera la definition a partir du couple */ \ /* ('KK___dimX','KK___dimY') et non pas a partir de ('dimX','dimY') afin de ne pas avoir de */ \ /* probleme de syntaxe lors de la definition des noyaux de convolution... */ #Aif ( (defined(BUG_SYSTEME_DECALPHA_OSF1_CC_large_stack_frames_not_yet_supported)) \ ) #Eif ( (defined(BUG_SYSTEME_DECALPHA_OSF1_CC_large_stack_frames_not_yet_supported)) \ ) #define PREMIER_POINT \ PREMIERE_ITERATION_D_UN_Komp \ /* Premier point d'une liste. Le 20001218141354, la definition anterieure (via un 'UN') a */ \ /* ete remplacee par 'PREMIERE_ITERATION_D_UN_Komp' afin d'etre sur du fonctionnement des */ \ /* procedures du type 'v $xrv/champs_5.11$I ACCES_LISTE.liste.index.'. */ #define POINT_INEXISTANT \ PRED(PREMIER_POINT) \ /* Introduit le 20210315114204 pour 'v $xiii/di_image$FON 20210315105035'... */ #define EXPOSANT_DE_LA_FONCTION_DE_TRANSFERT_UNITE_APRES_CONVOLUTION \ FU \ /* Lorsque le cumul est normalise apres calcul, il lui est applique une fonction de */ \ /* transfert "unite" a priori... */ #define NOMBRE_DE_POINTS_EFFECTIF_D_UN_NOYAU_DE_CONVOLUTION_PARCOURU_CIRCULAIREMENT(npn) \ COND(IL_NE_FAUT_PAS(Pconvolution_____adapter_le_nombre_de_points_lors_du_parcours_circulaire_des_spirales_carrees) \ ,npn \ ,COND(IL_FAUT(Pconvolution_____compatibilite_2014082110) \ ,INTE(SCAL(EXP2(DOUP(SUCC(ARRI(MOYS(RACX(SCAL(FLOT(npn),PI,FQUATRE)) \ ,FU \ ) \ ) \ ) \ ) \ ) \ ,FQUATRE \ ,PI \ ) \ ) \ ,DOUB(npn) \ ) \ ) \ /* Procedure introduite le 20070104110243 convertissant le nombre de points demandes 'npn' */ \ /* pour un noyau en le nombre (en general superieur) necessaire pour un parcours circulaire */ \ /* de ce noyau... */ \ /* */ \ /* Le 20140821104017, la formmule precedente a ete simplifiee. En effet, soit un cercle ; */ \ /* l'aire d'un carre qui lui est circonscrit est le double de l'aire d'un carre qui lui */ \ /* est inscrit, cela venant du racine de 2 qui permet de passer du cote d'un carre a sa */ \ /* diagonale, cette racine etant ensuite elevee au carre pour calculer l'aire... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V O L U T I O N D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define gIconvolution(les_images_sont_standards,imageR,FimageR,facteur,imageA,FimageA,traiter,cumuler,points,noyau,inhiber,renorm) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Iconvolution_avec_renormalisation(imageR \ ,facteur \ ,imageA \ ,traiter,cumuler \ ,points,noyau,inhiber \ ,renorm \ ) \ ,IFFconvolution(FimageR \ ,facteur \ ,FimageA \ ,points,noyau,inhiber \ ) \ ) \ /* Convolution d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V O L U T I O N D ' U N E I M A G E P A R U N N O Y A U V A R I A B L E : */ /* */ /*************************************************************************************************************************************/ #define gIconvolution_variable(les_images_sont_standards \ ,imageR,FimageR \ ,facteur \ ,imageA,FimageA \ ,niveaux_a_traiter,niveaux_cumulables \ ,facteur_du_nombre_de_points \ ,image_donnant_le_nombre_de_points_du_noyau \ ,image_definissant_la_valeur_du_noyau \ ,image_inhibant_la_valeur_du_noyau \ ,seuil_d_inhibition_du_noyau \ ) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Iconvolution_variable(imageR \ ,facteur_multiplicatif \ ,imageA \ ,niveaux_a_traiter,niveaux_cumulables \ ,facteur_du_nombre_de_points \ ,image_donnant_le_nombre_de_points_du_noyau \ ,image_definissant_la_valeur_du_noyau \ ,image_inhibant_la_valeur_du_noyau \ ,seuil_d_inhibition_du_noyau \ ) \ ,IFFconvolution_variable(imageR \ ,facteur_multiplicatif \ ,imageA \ ,niveaux_a_traiter,niveaux_cumulables \ ,facteur_du_nombre_de_points \ ,image_donnant_le_nombre_de_points_du_noyau \ ,image_definissant_la_valeur_du_noyau \ ,image_inhibant_la_valeur_du_noyau \ ,seuil_d_inhibition_du_noyau \ ) \ ) \ /* Convolution variable d'une image quelconque ("standard" ou "flottante") introduite */ \ /* le 20240826134210... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* L A P L A C I E N G E N E R A L I S E D ' U N E I M A G E */ /* */ /*************************************************************************************************************************************/ #define gIlaplacien_generalise(les_images_sont_standards,imageR,FimageR,fact,imageA,FimageA,traiter,cumuler,points,noyau,inhiber,ren) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Ilaplacien_generalise(imageR \ ,fact \ ,imageA \ ,traiter,cumuler \ ,points,noyau,inhiber \ ,ren \ ) \ ,IFlaplacien_generalise(FimageR \ ,fact \ ,FimageA \ ,traiter,cumuler \ ,points,noyau,inhiber \ ) \ ) \ /* Laplacien generalise d'une image quelconque ("standard" ou "flottante"). Ceci fut */ /* introduit le 20210225115942... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A S S A G E A U N E D Y N A M I Q U E L O G A R I T H M I Q U E */ /* P O U R U N E I M A G E F L O T T A N T E S A N S T R A N S L A T I O N D Y N A M I Q U E : */ /* */ /*************************************************************************************************************************************/ #define POUR_OBTENIR_UN_LOGARITHME_POSITIF \ EXPB(FZERO) \ /* Pour un obtenir un logarithme positif... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D E L ' I N E R T I E D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define CALCUL_GENERAL_DE_L_INERTIE_D_UNE_IMAGE(calculer,Ixx,Ixyx,Iyy,translation) \ Bblock \ EGAL(Pconvolution_____calculer_l_inertie,calculer); \ \ EGAL(Pconvolution_____coefficient_de_Ixx,Ixx); \ EGAL(Pconvolution_____coefficient_de_Ixyx,Ixyx); \ EGAL(Pconvolution_____coefficient_de_Iyy,Iyy); \ EGAL(Pconvolution_____translation_des_I,translation); \ Eblock \ /* Convolution d'une image sans ou avec calcul d'inertie... */ #define NE_PAS_CALCULER_L_INERTIE \ FZERO #define CALCULER_L_INERTIE \ FU /* Valeurs standards pour ne pas calculer (respectivement calculer) un des trois moments... */ #define CONVOLUER_UNE_IMAGE \ Bblock \ CALCUL_GENERAL_DE_L_INERTIE_D_UNE_IMAGE(FAUX \ ,NE_PAS_CALCULER_L_INERTIE \ ,NE_PAS_CALCULER_L_INERTIE \ ,NE_PAS_CALCULER_L_INERTIE \ ,CALCULER_L_INERTIE \ ); \ Eblock \ /* Convolution d'une image sans calcul d'inertie (correspond a l'etat implicite...). */ #define CALCUL_DE_L_INERTIE_Ixx_D_UNE_IMAGE \ Bblock \ CALCUL_GENERAL_DE_L_INERTIE_D_UNE_IMAGE(VRAI \ ,CALCULER_L_INERTIE \ ,NE_PAS_CALCULER_L_INERTIE \ ,NE_PAS_CALCULER_L_INERTIE \ ,NE_PAS_CALCULER_L_INERTIE \ ); \ Eblock \ /* Convolution d'une image avec le calcul d'inertie 'Ixx'. */ #define CALCUL_DE_L_INERTIE_Ixyx_D_UNE_IMAGE \ Bblock \ CALCUL_GENERAL_DE_L_INERTIE_D_UNE_IMAGE(VRAI \ ,NE_PAS_CALCULER_L_INERTIE \ ,CALCULER_L_INERTIE \ ,NE_PAS_CALCULER_L_INERTIE \ ,NE_PAS_CALCULER_L_INERTIE \ ); \ Eblock \ /* Convolution d'une image avec le calcul d'inertie 'Ixy'='Iyx'. */ #define CALCUL_DE_L_INERTIE_Iyy_D_UNE_IMAGE \ Bblock \ CALCUL_GENERAL_DE_L_INERTIE_D_UNE_IMAGE(VRAI \ ,NE_PAS_CALCULER_L_INERTIE \ ,NE_PAS_CALCULER_L_INERTIE \ ,CALCULER_L_INERTIE \ ,NE_PAS_CALCULER_L_INERTIE \ ); \ Eblock \ /* Convolution d'une image avec le calcul d'inertie 'Iyy'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I L T R A G E D E S P O I N T S I S O L E S D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gIfiltrage_des_points_isoles(les_images_sont_standards,imageR,FimageR,imageA,FimageA,nat,nc,npn,noyau,inhibition,seuil) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Ifiltrage_des_points_isoles(imageR \ ,imageA \ ,nat,nc \ ,npn \ ,noyau,inhibition \ ,seuil \ ) \ ,IFfiltrage_des_points_isoles(FimageR \ ,FimageA \ ,npn \ ,noyau,inhibition \ ,seuil \ ) \ ) \ /* Filtrage des points isoles d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E R O S I O N O U D I L A T A T I O N D ' U N E I M A G E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define gIerosion_ou_dilatation(les_images_sont_standards,imageR,FimageR,imageA,FimageA,nivoT,nivoC,npoints,noyau,inhibe,dilater) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Ierosion_ou_dilatation(imageR,imageA,nivoT,nivoC,npoints,noyau,inhibe,dilater) \ ,IFerosion_ou_dilatation(FimageR,FimageA,nivoT,nivoC,npoints,noyau,inhibe,dilater) \ ) \ /* Erosion ou dilatation d'une image quelconque ("standard" ou "flottante"). Ceci a ete */ \ /* introduit le 20101019141234. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* J E U D E L A V I E S T A N D A R D : */ /* */ /*************************************************************************************************************************************/ #define NOMBRE_MINIMAL_DE_VOISINS_DE_Ijeu_de_la_vie \ ZERO #define NOMBRE_MAXIMAL_DE_VOISINS_DE_Ijeu_de_la_vie \ INTE(SOUS(PUIX(TROIS,BI_DIMENSIONNEL),UN)) /* Nombre maximal de voisins (introduit le 20120229152112). */ #define CONSERVER_L_ETAT_D_UNE_CELLULE_DU_JEU_DE_LA_VIE \ K_0 #define CHANGER___L_ETAT_D_UNE_CELLULE_DU_JEU_DE_LA_VIE \ K_1 /* Caracteres utiles a la definition des listes de seuil (introduits le 20120229164142). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* J E U D E L A V I E G E N E R A L I S E : */ /* */ /*************************************************************************************************************************************/ #define gIjeu_de_la_vie_generalise(les_images_sont_standards,imageR,FimageR,imageA,FimageA) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Ijeu_de_la_vie_generalise(imageR,imageA) \ ,IFjeu_de_la_vie_generalise(FimageR,FimageA) \ ) \ /* Introduit le 20240826141916... */ #define gIjeu_de_la_vie_generalise_variable(les_images_sont_standards \ ,imageR,FimageR \ ,facteur_multiplicatif \ ,imageA,FimageA \ ,facteur_du_nombre_de_points \ ,image_donnant_le_nombre_de_points_du_noyau \ ,image_definissant_la_valeur_du_noyau \ ,image_inhibant_la_valeur_du_noyau \ ,seuil_d_inhibition_du_noyau \ ) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Ijeu_de_la_vie_generalise_variable(imageR \ ,facteur_multiplicatif \ ,imageA \ ,facteur_du_nombre_de_points \ ,image_donnant_le_nombre_de_points_du_noyau \ ,image_definissant_la_valeur_du_noyau \ ,image_inhibant_la_valeur_du_noyau \ ,seuil_d_inhibition_du_noyau \ ) \ ,IFjeu_de_la_vie_generalise_variable(FimageR \ ,facteur_multiplicatif \ ,FimageA \ ,facteur_du_nombre_de_points \ ,image_donnant_le_nombre_de_points_du_noyau \ ,image_definissant_la_valeur_du_noyau \ ,image_inhibant_la_valeur_du_noyau \ ,seuil_d_inhibition_du_noyau \ ) \ ) \ /* Introduit le 20240826141916... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O D E L E D E I S I N G B I D I M E N S I O N N E L : */ /* */ /*************************************************************************************************************************************/ #define VALEUR_ABSOLUE_DU_SPIN_DU_MODELE_D_ISING \ FDU \ /* Valeur absolue du spin pour le modele d'Ising bidimensionnel et tridimensionnel. */ /* */ /* Le 20050825111821, lors de la realisation de l'image 'v $xiirk/ISIN.91', j'ai note que */ /* la temperature critique liee a mon implementation valait : */ /* */ /* 1 */ /* Tc = ------------------- */ /* ___ */ /* 2.A.ln(1 + \/ N ) */ /* */ /* soit 0.2836481642766278 ce qui est une valeur quatre fois plus petite que la valeur */ /* habituellement utilisee. Cela vient de 'VALEUR_ABSOLUE_DU_SPIN_DU_MODELE_D_ISING' qui */ /* fait que (par defaut) mes spins sont {-1/2,+1/2} alors qu'en general, les autres */ /* utilisent des spins {-1,+1}. Etant donne que le calcul fait intervenir un produit de */ /* spins divise par une temperature ce qui revient a dire que la ou les autres ont 1/T, */ /* moi, j'ai 1/(4T) ; leurs temperatures sont donc egales a 4 fois les miennes. On notera */ /* que je pourrai changer cela, mais cela ferait perdre la compatibilite anterieure. Malgre */ /* tout, {Imodele_d_Ising_2D_____spin_negatif,Imodele_d_Ising_2D_____spin_positif} et */ /* {Amodele_d_Ising_3D_____spin_negatif,Amodele_d_Ising_3D_____spin_positif} sont */ /* accessibles et modifiables... */ #define DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D \ UN #define DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_Imodele_d_Ising_2D \ TROIS #define DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D \ SOIXANTE_QUATRE /* Demi-dimensions (arbitraire) du noyau de 'Imodele_d_Ising_2D(...)'. */ #define DimNo_Imodele_d_Ising_2D \ DOUP(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D) \ /* Dimension (arbitraire) du noyau "quelconque" de 'Imodele_d_Ising_2D(...)'. */ \ /* */ \ /* ATTENTION : le nom 'DIMENSION_DU_NOYAU_DANS_Imodele_d_Ising_2D' ne peut etre */ \ /* utilise (d'ou 'DimNo_Imodele_d_Ising_2D') a cause de la procedure '$xcg/gen.ext$Z' */ \ /* ('v $xiii/di_image$FON DimNo_Imodele_d_Ising_2D'). */ #define PONDERATION_D_UN_POINT_DANS_Imodele_d_Ising_2D \ FU \ /* Definition du facteur par defaut des points du voisinage du point courant {X,Y}. */ #define Imodele_d_Ising_2D_____XYmin \ NEGA(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D) #define Imodele_d_Ising_2D_____XYmax \ NEUT(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D) /* Dimension des axes {X,Y} necessaires a la lecture de fichiers contenant un noyau */ /* ('v $xci/Ising_2D.11$K Imodele_d_Ising_2D_____noyau'). */ #define Imodele_d_Ising_2D_____XYmin_effectif \ NEGA(Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau) #define Imodele_d_Ising_2D_____XYmax_effectif \ NEUT(Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau) /* Extremites effectives des axes {X,Y}. */ #define ACCES_NOYAU_DANS_Imodele_d_Ising_2D(x,y) \ ITb2(Imodele_d_Ising_2D_____noyau \ ,INDX(y,NEGA(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D)) \ ,INDX(x,NEGA(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D)) \ ) \ /* Acces a l'element {x,y} du noyau de 'Imodele_d_Ising_2D(...)'. ATTENTION a l'odre */ \ /* des deux coordonnees identique a celui de 'v $xiii/Images$DEF IMAGE.image.x.y.'. */ #define INITIALISATION_ELEMENT_NOYAU_DANS_Imodele_d_Ising_2D(x,y,valeur) \ Bblock \ EGAL(ACCES_NOYAU_DANS_Imodele_d_Ising_2D(x,y) \ ,valeur \ ); \ Eblock \ /* Initialisation de l'element {x,y}. */ #define INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_Imodele_d_Ising_2D \ Bblock \ Test(IL_FAUT(Imodele_d_Ising_2D_____utiliser_un_noyau)) \ Bblock \ Test(IFINff(Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau \ ,DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D \ ,DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D \ ) \ ) \ Bblock \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("les dimensions du noyau du modele d'Ising bidimensionnel sont incorrectes"); \ CAL1(Prer1("%d est demande\n",Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau)); \ CAL1(Prer2("alors que seul [%d,%d] est possible\n" \ ,DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D \ ,DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D \ ) \ ); \ \ EGAL(Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau \ ,DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_Imodele_d_Ising_2D \ ); \ \ CAL1(Prer1("%d est donc force\n",Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau)); \ Eblock \ ETes \ \ Test(IL_FAUT(Imodele_d_Ising_2D_____initialiser_le_noyau)) \ Bblock \ begin_imageQ(DoIn,Imodele_d_Ising_2D_____XYmin_effectif,Imodele_d_Ising_2D_____XYmax_effectif,PasY \ ,DoIn,Imodele_d_Ising_2D_____XYmin_effectif,Imodele_d_Ising_2D_____XYmax_effectif,PasX \ ) \ Bblock \ INITIALISATION_ELEMENT_NOYAU_DANS_Imodele_d_Ising_2D(X,Y \ ,PONDERATION_D_UN_POINT_DANS_Imodele_d_Ising_2D \ ); \ /* Initialisation de l'element courant {X,Y}. */ \ Eblock \ end_imageQ(EDoI,EDoI) \ \ EGAL(Imodele_d_Ising_2D_____initialiser_le_noyau,FAUX); \ /* Et l'initialisation n'est plus a faire (jusqu'a la prochaine fois...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Initialisation eventuelle du noyau de 'Imodele_d_Ising_2D(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I F F U S I O N B I D I M E N S I O N N E L L E A T E M P E R A T U R E L O C A L E : */ /* */ /*************************************************************************************************************************************/ #define Idiffusion_2D_a_temperatures_locales_____NIVEAU_DE_LA___MER \ GRIS_0 #define Idiffusion_2D_a_temperatures_locales_____MARQUEUR_DES_CASES_DE_LA___MER \ Idiffusion_2D_a_temperatures_locales_____NIVEAU_DE_LA___MER #define Idiffusion_2D_a_temperatures_locales_____NIVEAU_DE_LA___MER_NOUVELLE_NEE \ GRIS_1 #define Idiffusion_2D_a_temperatures_locales_____NIVEAU_DE_LA_TERRE_NOUVELLE_NEE \ GRIS_7 #define Idiffusion_2D_a_temperatures_locales_____NIVEAU_DE_LA_TERRE \ GRIS_8 /* Niveaux "speciaux" (introduits le 20070207151915, le 20070208151737 pour les */ /* "nouvelle nee"s et le 20070308093947 pour le marqueur de la mer...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O D E L E D E C O T E S B I D I M E N S I O N N E L A V E C E R O S I O N : */ /* */ /*************************************************************************************************************************************/ #nodefine LONGUEUR_DE_LA_COTE_D_ERODE______COTES_2D_VERSION_01 \ /* Cette facon de mesurer la longueur utilise 'IFFconvolution(...)'. Elle presente un */ \ /* gros defaut : en effet, le niveau convolue obtenu ne donne pas, comme je le croyais */ \ /* naivement initialement, la frontiere entre la "terre" et la "mer" car cela n'est vrai */ \ /* que si la repartition "terre"/"mer" et de 50%/50% dans le domaine de convolution (ce */ \ /* qui n'est qu'exceptionnellemnt vrai). Une nouvelle version ('VERSION_02') a donc ete */ \ /* introduite afin de travailler sur les extrema, en les seuillant de plus... */ #define LONGUEUR_DE_LA_COTE_D_ERODE______COTES_2D_VERSION_02 \ /* Cette facon de mesurer la longueur utilise 'IFFconvolution_de_seuillage(...)' ; elle */ \ /* a ete introduite le 20011214102608. */ #nodefine CONVOLUTION_DE_imageA_D_ERODE______COTES_2D_VERSION_01 \ /* Cette facon de convoluer 'imageA' n'utilise que 'imageA_convoluee_courante'. */ #define CONVOLUTION_DE_imageA_D_ERODE______COTES_2D_VERSION_02 \ /* Cette facon de convoluer 'imageA' utilise simultanement 'imageA_convoluee_courante' et */ \ /* 'Ierode__CoastLines_2D_____imageA_convoluee_initiale' (introduite le 20011218092742). */ #define NIVEAU_DE_LA___MER_DANS_Ierode__CoastLines_2D \ NEUT(FU) #define NIVEAU_DE_LA_TERRE_DANS_Ierode__CoastLines_2D \ NEGA(FU) /* Niveaux respectifs de la "mer" et de la "terre" a priori... */ #define DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D \ UN #define DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_Ierode__CoastLines_2D \ TROIS #define DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D \ SOIXANTE_QUATRE /* Demi-dimensions (arbitraire) du noyau de 'Ierode__CoastLines_2D(...)'. */ #define DimNo_Ierode__CoastLines_2D \ DOUP(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D) \ /* Dimension (arbitraire) du noyau "quelconque" de 'Ierode__CoastLines_2D(...)'. */ \ /* */ \ /* ATTENTION : le nom 'DIMENSION_DU_NOYAU_DANS_Ierode__CoastLines_2D' ne peut etre */ \ /* utilise (d'ou 'DimNo_Ierode__CoastLines_2D') a cause de la procedure '$xcg/gen.ext$Z' */ \ /* ('v $xiii/di_image$FON DimNo_Ierode__CoastLines_2D'). */ #define PONDERATION_D_UN_POINT_DANS_Ierode__CoastLines_2D \ FU \ /* Definition du facteur par defaut des points du voisinage du point courant {X,Y}. */ #define Ierode__CoastLines_2D_____XYmin \ NEGA(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D) #define Ierode__CoastLines_2D_____XYmax \ NEUT(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D) /* Dimension des axes {X,Y} necessaires a la lecture de fichiers contenant un noyau */ /* ('v $xci/CoastL_2D.11$K Ierode__CoastLines_2D_____noyau'). */ #define Ierode__CoastLines_2D_____XYmin_effectif \ NEGA(Ierode__CoastLines_2D_____demi_dimension_effective_du_noyau) #define Ierode__CoastLines_2D_____XYmax_effectif \ NEUT(Ierode__CoastLines_2D_____demi_dimension_effective_du_noyau) /* Extremites effectives des axes {X,Y}. */ #define ACCES_NOYAU_DANS_Ierode__CoastLines_2D(x,y) \ ITb2(Ierode__CoastLines_2D_____noyau \ ,INDX(y,NEGA(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D)) \ ,INDX(x,NEGA(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D)) \ ) \ /* Acces a l'element {x,y} du noyau de 'Ierode__CoastLines_2D(...)'. ATTENTION a l'odre */ \ /* des deux coordonnees identique a celui de 'v $xiii/Images$DEF IMAGE.image.x.y.'. */ #define INITIALISATION_ELEMENT_NOYAU_DANS_Ierode__CoastLines_2D(x,y,valeur) \ Bblock \ EGAL(ACCES_NOYAU_DANS_Ierode__CoastLines_2D(x,y) \ ,valeur \ ); \ Eblock \ /* Initialisation de l'element {x,y}. */ #define INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_Ierode__CoastLines_2D \ Bblock \ Test(IL_FAUT(Ierode__CoastLines_2D_____utiliser_un_noyau)) \ Bblock \ Test(IFINff(Ierode__CoastLines_2D_____demi_dimension_effective_du_noyau \ ,DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D \ ,DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D \ ) \ ) \ Bblock \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("les dimensions du noyau du modele de cotes bidimensionnel sont incorrectes"); \ CAL1(Prer1("%d est demande\n",Ierode__CoastLines_2D_____demi_dimension_effective_du_noyau)); \ CAL1(Prer2("alors que seul [%d,%d] est possible\n" \ ,DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D \ ,DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ierode__CoastLines_2D \ ) \ ); \ \ EGAL(Ierode__CoastLines_2D_____demi_dimension_effective_du_noyau \ ,DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_Ierode__CoastLines_2D \ ); \ \ CAL1(Prer1("%d est donc force\n",Ierode__CoastLines_2D_____demi_dimension_effective_du_noyau)); \ Eblock \ ETes \ \ Test(IL_FAUT(Ierode__CoastLines_2D_____initialiser_le_noyau)) \ Bblock \ begin_imageQ(DoIn \ ,Ierode__CoastLines_2D_____XYmin_effectif,Ierode__CoastLines_2D_____XYmax_effectif,PasY \ ,DoIn \ ,Ierode__CoastLines_2D_____XYmin_effectif,Ierode__CoastLines_2D_____XYmax_effectif,PasX \ ) \ Bblock \ INITIALISATION_ELEMENT_NOYAU_DANS_Ierode__CoastLines_2D \ (X,Y \ ,PONDERATION_D_UN_POINT_DANS_Ierode__CoastLines_2D \ ); \ /* Initialisation de l'element courant {X,Y}. */ \ Eblock \ end_imageQ(EDoI,EDoI) \ \ EGAL(Ierode__CoastLines_2D_____initialiser_le_noyau,FAUX); \ /* Et l'initialisation n'est plus a faire (jusqu'a la prochaine fois...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Initialisation eventuelle du noyau de 'Ierode__CoastLines_2D(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O D E L E D E C O T E S B I D I M E N S I O N N E L A V E C " E T C H I N G " : */ /* */ /*************************************************************************************************************************************/ #define NIVEAU_DE_LA___MER_DANS_Ietche__CoastLines_2D \ NEUT(FU) #define NIVEAU_DE_LA_TERRE_DANS_Ietche__CoastLines_2D \ NEGA(FU) /* Niveaux respectifs de la "mer" et de la "terre" a priori... */ #define DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D \ UN #define DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_Ietche__CoastLines_2D \ TROIS #define DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D \ SOIXANTE_QUATRE /* Demi-dimensions (arbitraire) du noyau de 'Ietche__CoastLines_2D(...)'. */ #define DimNo_Ietche__CoastLines_2D \ DOUP(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D) \ /* Dimension (arbitraire) du noyau "quelconque" de 'Ietche__CoastLines_2D(...)'. */ \ /* */ \ /* ATTENTION : le nom 'DIMENSION_DU_NOYAU_DANS_Ietche__CoastLines_2D' ne peut etre */ \ /* utilise (d'ou 'DimNo_Ietche__CoastLines_2D') a cause de la procedure '$xcg/gen.ext$Z' */ \ /* ('v $xiii/di_image$FON DimNo_Ietche__CoastLines_2D'). */ #define PONDERATION_D_UN_POINT_DANS_Ietche__CoastLines_2D \ FU \ /* Definition du facteur par defaut des points du voisinage du point courant {X,Y}. */ #define Ietche__CoastLines_2D_____XYmin \ NEGA(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D) #define Ietche__CoastLines_2D_____XYmax \ NEUT(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D) /* Dimension des axes {X,Y} necessaires a la lecture de fichiers contenant un noyau */ /* ('v $xci/CoastL_2D.11$K Ietche__CoastLines_2D_____noyau'). */ #define Ietche__CoastLines_2D_____XYmin_effectif \ NEGA(Ietche__CoastLines_2D_____demi_dimension_effective_du_noyau) #define Ietche__CoastLines_2D_____XYmax_effectif \ NEUT(Ietche__CoastLines_2D_____demi_dimension_effective_du_noyau) /* Extremites effectives des axes {X,Y}. */ #define ACCES_NOYAU_DANS_Ietche__CoastLines_2D(x,y) \ ITb2(Ietche__CoastLines_2D_____noyau \ ,INDX(y,NEGA(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D)) \ ,INDX(x,NEGA(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D)) \ ) \ /* Acces a l'element {x,y} du noyau de 'Ietche__CoastLines_2D(...)'. ATTENTION a l'odre */ \ /* des deux coordonnees identique a celui de 'v $xiii/Images$DEF IMAGE.image.x.y.'. */ #define INITIALISATION_ELEMENT_NOYAU_DANS_Ietche__CoastLines_2D(x,y,valeur) \ Bblock \ EGAL(ACCES_NOYAU_DANS_Ietche__CoastLines_2D(x,y) \ ,valeur \ ); \ Eblock \ /* Initialisation de l'element {x,y}. */ #define INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_Ietche__CoastLines_2D \ Bblock \ Test(IL_FAUT(Ietche__CoastLines_2D_____utiliser_un_noyau)) \ Bblock \ Test(IFINff(Ietche__CoastLines_2D_____demi_dimension_effective_du_noyau \ ,DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D \ ,DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D \ ) \ ) \ Bblock \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("les dimensions du noyau du modele de cotes bidimensionnel sont incorrectes"); \ CAL1(Prer1("%d est demande\n",Ietche__CoastLines_2D_____demi_dimension_effective_du_noyau)); \ CAL1(Prer2("alors que seul [%d,%d] est possible\n" \ ,DEMI_DIMENSION_MINIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D \ ,DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Ietche__CoastLines_2D \ ) \ ); \ \ EGAL(Ietche__CoastLines_2D_____demi_dimension_effective_du_noyau \ ,DEMI_DIMENSION_STANDARD_DU_NOYAU_DANS_Ietche__CoastLines_2D \ ); \ \ CAL1(Prer1("%d est donc force\n",Ietche__CoastLines_2D_____demi_dimension_effective_du_noyau)); \ Eblock \ ETes \ \ Test(IL_FAUT(Ietche__CoastLines_2D_____initialiser_le_noyau)) \ Bblock \ begin_imageQ(DoIn \ ,Ietche__CoastLines_2D_____XYmin_effectif,Ietche__CoastLines_2D_____XYmax_effectif,PasY \ ,DoIn \ ,Ietche__CoastLines_2D_____XYmin_effectif,Ietche__CoastLines_2D_____XYmax_effectif,PasX \ ) \ Bblock \ INITIALISATION_ELEMENT_NOYAU_DANS_Ietche__CoastLines_2D \ (X,Y \ ,PONDERATION_D_UN_POINT_DANS_Ietche__CoastLines_2D \ ); \ /* Initialisation de l'element courant {X,Y}. */ \ Eblock \ end_imageQ(EDoI,EDoI) \ \ EGAL(Ietche__CoastLines_2D_____initialiser_le_noyau,FAUX); \ /* Et l'initialisation n'est plus a faire (jusqu'a la prochaine fois...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Initialisation eventuelle du noyau de 'Ietche__CoastLines_2D(...)'. */ #define gTAUX_D_ETCHE______COTES_ND(concentration,frequence,fonction_energie_temperature) \ MUL3(concentration \ ,frequence \ ,fonction_energie_temperature \ ) \ /* Definition generale du taux d'"etching". */ #define MINIMUM_FONCTION_ENERGIE_TEMPERATURE_DE_TAUX_D_ETCHE______COTES_ND \ FZERO #define MAXIMUM_FONCTION_ENERGIE_TEMPERATURE_DE_TAUX_D_ETCHE______COTES_ND \ FU /* Extrema de 'fonction_energie_temperature' selon : */ /* */ /* 0 */ /* e = 1 (maximum), */ /* */ /* -infini */ /* e = 0 (minimum), */ /* */ #define TAUX_D_ETCHE______COTES_ND(concentration,frequence,energie_minimale,energie_maximale,lambda,Boltzmann,temperature) \ gTAUX_D_ETCHE______COTES_ND(concentration \ ,frequence \ ,EXPX(NEGA(DIVZ(BARY(energie_minimale,energie_maximale,lambda) \ ,MUL2(Boltzmann,temperature) \ ) \ ) \ ) \ ) \ /* Definition du taux d'"etching". On notera que le minimum de cette fonction est atteint */ \ /* pour : */ \ /* */ \ /* lambda = COORDONNEE_BARYCENTRIQUE_MAXIMALE ==> taux faible d'"etching", ce qui */ \ /* demande une energie d'activation */ \ /* 'energie_maximale', */ \ /* */ \ /* et le maximum pour : */ \ /* */ \ /* lambda = COORDONNEE_BARYCENTRIQUE_MINIMALE ==> taux eleve d'"etching", ce qui */ \ /* demande une energie d'activation */ \ /* 'energie_minimale', */ \ /* */ \ /* ce qui est du au fait que la fonction 'EXPX(NEGA(...))' est decroissante. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E D U C T I O N D E M O I T I E D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define DEMI_FENETRE_XY_TRANSLATIONS(demi_trans_OX,multiple_OX,demi_trans_OY,multiple_OY) \ /* ATTENTION : il ne faut pas de 'Bblock' puisqu'il ne peut pas y avoir de 'Eblock' */ \ /* puisque cette procedure definit les variables locales 'demi_translation' et */ \ /* 'dimensions_maximales' utilisees ailleurs (par exemple dans 'DEMI_FENETRE_XY(...)'. */ \ \ DEFV(deltaF_2D,demi_translation); \ /* Afin de positionner correctement les demi-images. */ \ DEFV(deltaI_2D,dimensions_maximales); \ /* Afin de ne pas deborder lorsque les dimensions sont "exotiques" (voir 'Pal'...). */ \ \ INITIALISATION_ACCROISSEMENT_2D(demi_translation \ ,_____lNORMALISE_OX(COND(IFEQ(multiple_OX \ ,ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ) \ ,demi_trans_OX \ ,MULD(demi_trans_OX,QUOD(dimX,multiple_OX)) \ ) \ ) \ ,_____lNORMALISE_OY(COND(IFEQ(multiple_OY \ ,ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ) \ ,demi_trans_OY \ ,MULD(demi_trans_OY,QUOD(dimY,multiple_OY)) \ ) \ ) \ ); \ INITIALISATION_ACCROISSEMENT_2D(dimensions_maximales \ ,MULD(dimX,multiple_OX) \ ,MULD(dimY,multiple_OY) \ ); \ /* ATTENTION : il ne faut pas de 'Eblock puisque cette procedure definit les variables */ \ /* locales 'demi_translation' et 'dimensions_maximales' utilisees ailleurs (par exemple */ \ /* dans 'DEMI_FENETRE_XY(...)'. */ \ \ /* Definition des translations d'un positionnement quelconque... */ #define DEMI_FENETRE_XY(imageR,imageA,demi_trans_OX,multiple_OX,demi_trans_OY,multiple_OY,calcul_moyenne,calcul_maximum,Freduction) \ Bblock \ DEMI_FENETRE_XY_TRANSLATIONS(demi_trans_OX,multiple_OX,demi_trans_OY,multiple_OY); \ /* Definition des translations necessaires a 'DEMI_FENETRE_XY(...)'. */ \ \ CALS(Freduction(imageR \ ,imageA \ ,ADRESSE(demi_translation) \ ,ADRESSE(dimensions_maximales) \ ,FAUX,FAUX \ ,calcul_moyenne,calcul_maximum \ ) \ ); \ /* La possibilite de choisir entre 'Ireduction_moitie(...)' et 'IFreduction_moitie(...)' a */ \ /* ete introduite le 20020116142836 (principalement pour 'v $xci/reduction_04$K standard'. */ \ Eblock \ /* Positionnement quelconque... */ #define CALCUL_DU_MAXIMUM_DANS_UNE_DEMI_FENETRE \ VRAI \ /* Valeur de l'argument 'calcul_du_maximum' de la fonction 'Ireduction_moitie(...)' qui */ \ /* permet de savoir, lorsque 'calcul_de_la_moyenne' est FAUX, si l'on prend le maximum */ \ /* ('VRAI') ou un point au hasard ('FAUX') qui est en fait le point courant (procede */ \ /* parfait lorsque l'on traite des images en vraies couleurs ; voir a ce propos les */ \ /* commentaires de 'v $xci/reduction$Z'). */ #define ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ UN \ /* Valeur a donner a 'multiple_OX' et 'multiple_OY' pour que le positionnement des fenetres */ \ /* ne se fasse pas sur des sous-multiples des dimensions 'dimX' et 'dimY'... */ #define MULTIPLICITE_2x2_POUR_LES_DEMI_FENETRES \ DEUX \ /* Valeur a donner a 'multiple_OX' et 'multiple_OY' pour des mosaiques d'images 2x2. */ #define MULTIPLICITE_4x4_POUR_LES_DEMI_FENETRES \ QUATRE \ /* Valeur a donner a 'multiple_OX' et 'multiple_OY' pour des mosaiques d'images 4x4. */ #define MULTIPLICITE_8x8_POUR_LES_DEMI_FENETRES \ HUIT \ /* Valeur a donner a 'multiple_OX' et 'multiple_OY' pour des mosaiques d'images 8x8. */ #define DEMI_FENETRE_BG_MULTIPLE(imageR,imageA,multiple_OX,multiple_OY,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(imageR,imageA \ ,COXR(Xmin),multiple_OX \ ,COYR(Ymin),multiple_OY \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,Ireduction_moitie \ ); \ Eblock \ /* Positionnement en bas a gauche en des "sous-multiples" de 'dimX' et 'dimY' ce qui permet */ \ /* d'eviter des problemes avec la fonction 'IXanimation(...)' de '$xiidX' lorsque les images */ \ /* n'ont pas comme dimension des puissances de 2 (cas de 'Pal' par exemple...). */ #define DEMI_FENETRE_BD_MULTIPLE(imageR,imageA,multiple_OX,multiple_OY,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(imageR,imageA \ ,COXR(Xcentre),multiple_OX \ ,COYR(Ymin),multiple_OY \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,Ireduction_moitie \ ); \ Eblock \ /* Positionnement en bas a droite en des "sous-multiples" de 'dimX' et 'dimY' ce qui permet */ \ /* d'eviter des problemes avec la fonction 'IXanimation(...)' de '$xiidX' lorsque les images */ \ /* n'ont pas comme dimension des puissances de 2 (cas de 'Pal' par exemple...). */ #define DEMI_FENETRE_HG_MULTIPLE(imageR,imageA,multiple_OX,multiple_OY,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(imageR,imageA \ ,COXR(Xmin),multiple_OX \ ,COYR(Ycentre),multiple_OY \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,Ireduction_moitie \ ); \ Eblock \ /* Positionnement en haut a gauche en des "sous-multiples" de 'dimX' et 'dimY' ce qui permet */ \ /* d'eviter des problemes avec la fonction 'IXanimation(...)' de '$xiidX' lorsque les images */ \ /* n'ont pas comme dimension des puissances de 2 (cas de 'Pal' par exemple...). */ #define DEMI_FENETRE_HD_MULTIPLE(imageR,imageA,multiple_OX,multiple_OY,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(imageR,imageA \ ,COXR(Xcentre),multiple_OX \ ,COYR(Ycentre),multiple_OY \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,Ireduction_moitie \ ); \ Eblock \ /* Positionnement en haut a droite en des "sous-multiples" de 'dimX' et 'dimY' ce qui permet */ \ /* d'eviter des problemes avec la fonction 'IXanimation(...)' de '$xiidX' lorsque les images */ \ /* n'ont pas comme dimension des puissances de 2 (cas de 'Pal' par exemple...). */ #define DEMI_FENETRE_BG(imageR,imageA,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(imageR,imageA \ ,COXR(Xmin),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,COYR(Ymin),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,Ireduction_moitie \ ); \ Eblock \ /* Positionnement en bas a gauche. */ #define DEMI_FENETRE_BD(imageR,imageA,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(imageR,imageA \ ,COXR(Xcentre),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,COYR(Ymin),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,Ireduction_moitie \ ); \ Eblock \ /* Positionnement en bas a droite. */ #define DEMI_FENETRE_HG(imageR,imageA,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(imageR,imageA \ ,COXR(Xmin),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,COYR(Ycentre),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,Ireduction_moitie \ ); \ Eblock \ /* Positionnement en haut a gauche. */ #define DEMI_FENETRE_HD(imageR,imageA,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(imageR,imageA \ ,COXR(Xcentre),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,COYR(Ycentre),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,Ireduction_moitie \ ); \ Eblock \ /* Positionnement en haut a droite. */ #define F_DEMI_FENETRE_BG_MULTIPLE(FimageR,FimageA,multiple_OX,multiple_OY,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(FimageR,FimageA \ ,COXR(Xmin),multiple_OX \ ,COYR(Ymin),multiple_OY \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,IFreduction_moitie \ ); \ Eblock \ /* Positionnement en bas a gauche en des "sous-multiples" de 'dimX' et 'dimY'. */ #define F_DEMI_FENETRE_BD_MULTIPLE(FimageR,FimageA,multiple_OX,multiple_OY,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(FimageR,FimageA \ ,COXR(Xcentre),multiple_OX \ ,COYR(Ymin),multiple_OY \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,IFreduction_moitie \ ); \ Eblock \ /* Positionnement en bas a droite en des "sous-multiples" de 'dimX' et 'dimY'. */ #define F_DEMI_FENETRE_HG_MULTIPLE(FimageR,FimageA,multiple_OX,multiple_OY,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(FimageR,FimageA \ ,COXR(Xmin),multiple_OX \ ,COYR(Ycentre),multiple_OY \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,IFreduction_moitie \ ); \ Eblock \ /* Positionnement en haut a gauche en des "sous-multiples" de 'dimX' et 'dimY'. */ #define F_DEMI_FENETRE_HD_MULTIPLE(FimageR,FimageA,multiple_OX,multiple_OY,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(FimageR,FimageA \ ,COXR(Xcentre),multiple_OX \ ,COYR(Ycentre),multiple_OY \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,IFreduction_moitie \ ); \ Eblock \ /* Positionnement en haut a droite en des "sous-multiples" de 'dimX' et 'dimY'. */ #define F_DEMI_FENETRE_BG(FimageR,FimageA,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(FimageR,FimageA \ ,COXR(Xmin),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,COYR(Ymin),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,IFreduction_moitie \ ); \ Eblock \ /* Positionnement en bas a gauche. */ #define F_DEMI_FENETRE_BD(FimageR,FimageA,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(FimageR,FimageA \ ,COXR(Xcentre),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,COYR(Ymin),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,IFreduction_moitie \ ); \ Eblock \ /* Positionnement en bas a droite. */ #define F_DEMI_FENETRE_HG(FimageR,FimageA,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(FimageR,FimageA \ ,COXR(Xmin),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,COYR(Ycentre),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,IFreduction_moitie \ ); \ Eblock \ /* Positionnement en haut a gauche. */ #define F_DEMI_FENETRE_HD(FimageR,FimageA,calcul_de_la_moyenne,calcul_du_maximum) \ Bblock \ DEMI_FENETRE_XY(FimageR,FimageA \ ,COXR(Xcentre),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,COYR(Ycentre),ABSENCE_DE_MULTIPLICITE_POUR_LES_DEMI_FENETRES \ ,calcul_de_la_moyenne,calcul_du_maximum \ ,IFreduction_moitie \ ); \ Eblock \ /* Positionnement en haut a droite. */ #define gIreduction_moitie(les_images_sont_standards,imageR,FimageR,imageA,FimageA,trans,dimensions,tore_h,tore_v,moyenne,maximum) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Ireduction_moitie(imageR \ ,imageA \ ,trans \ ,dimensions \ ,tore_h,tore_v \ ,moyenne \ ,maximum \ ) \ ,IFreduction_moitie(FimageR \ ,FimageA \ ,trans \ ,dimensions \ ,tore_h,tore_v \ ,moyenne \ ,maximum \ ) \ ) \ /* Reduction de moitie d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A G R A N D I S S E M E N T D ' U N E I M A G E P A R D O U B L E M E N T : */ /* */ /*************************************************************************************************************************************/ #define DOUBLE_FENETRE_XY(imageR,imageA,demi_translation_OX,demi_translation_OY,il_faut_interpoler) \ Bblock \ DEFV(deltaF_2D,demi_translation); \ /* Afin de positionner correctement les demi-images. */ \ \ INITIALISATION_ACCROISSEMENT_2D(demi_translation \ ,_____lNORMALISE_OX(demi_translation_OX) \ ,_____lNORMALISE_OY(demi_translation_OY) \ ); \ \ CALS(Iagrandissement_par_doublement(imageR \ ,imageA \ ,ADRESSE(demi_translation) \ ,FAUX,FAUX \ ,il_faut_interpoler \ ) \ ); \ Eblock \ /* Extraction quelconque... */ #define DOUBLE_FENETRE_BG(imageR,imageA,il_faut_interpoler) \ Bblock \ DOUBLE_FENETRE_XY(imageR,imageA \ ,COXR(Xmin) \ ,COYR(Ymin) \ ,il_faut_interpoler \ ); \ Eblock \ /* Extraction du bas a gauche. */ #define DOUBLE_FENETRE_BD(imageR,imageA,il_faut_interpoler) \ Bblock \ DOUBLE_FENETRE_XY(imageR,imageA \ ,COXR(Xcentre) \ ,COYR(Ymin) \ ,il_faut_interpoler \ ); \ Eblock \ /* Extraction du bas a droite. */ #define DOUBLE_FENETRE_HG(imageR,imageA,il_faut_interpoler) \ Bblock \ DOUBLE_FENETRE_XY(imageR,imageA \ ,COXR(Xmin) \ ,COYR(Ycentre) \ ,il_faut_interpoler \ ); \ Eblock \ /* Extraction du haut a gauche. */ #define DOUBLE_FENETRE_HD(imageR,imageA,il_faut_interpoler) \ Bblock \ DOUBLE_FENETRE_XY(imageR,imageA \ ,COXR(Xcentre) \ ,COYR(Ycentre) \ ,il_faut_interpoler \ ); \ Eblock \ /* Extraction du haut a droite. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R O T A T I O N D ' U N E I M A G E D E P L U S O U M O I N S P I S U R 2 : */ /* */ /*************************************************************************************************************************************/ #define gIrotation_de_plus_ou_moins_pi_sur_2(les_images_sont_standards,imageR,FimageR,imageA,FimageA,sens_trigonometrique) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Irotation_de_plus_ou_moins_pi_sur_2(imageR,imageA,sens_trigonometrique) \ ,IFrotation_de_plus_ou_moins_pi_sur_2(FimageR,FimageA,sens_trigonometrique) \ ) \ /* Rotation de plus ou moins pi sur 2 d'une image quelconque ("standard" ou "flottante"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R O T A T I O N D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define X_A_R_TRANSLATION_POUR_ROTATION \ MOIT(_____lNORMALISE_OX(dimX)) \ /* Amplitude de la translation horizontale standard, */ #define Y_A_R_TRANSLATION_POUR_ROTATION \ MOIT(_____lNORMALISE_OY(dimY)) \ /* Amplitude de la translation verticale standard. */ #define X_A_TRANSLATION_POUR_ROTATION \ X_A_R_TRANSLATION_POUR_ROTATION \ /* Amplitude de la translation horizontale standard de l'image Argument, */ #define Y_A_TRANSLATION_POUR_ROTATION \ Y_A_R_TRANSLATION_POUR_ROTATION \ /* Amplitude de la translation verticale standard de l'image Argument. */ #define X_RA_TRANSLATION_POUR_ROTATION \ X_A_R_TRANSLATION_POUR_ROTATION \ /* Amplitude de la translation horizontale standard de l'image Resultat lors de l'acces a */ \ /* a l'image Argument. */ #define Y_RA_TRANSLATION_POUR_ROTATION \ Y_A_R_TRANSLATION_POUR_ROTATION \ /* Amplitude de la translation verticale standard de l'image Resultat lors de l'acces a */ \ /* a l'image Argument. */ #define X_RR_TRANSLATION_POUR_ROTATION \ FZERO \ /* Amplitude de la translation horizontale standard de l'image Resultat, */ #define Y_RR_TRANSLATION_POUR_ROTATION \ FZERO \ /* Amplitude de la translation verticale standard de l'image Resultat. */ #define gIrotation_image(les_images_sont_standards,imageR,FimageR,imageA,FimageA,nettoyer,RRtrans,RAtrans,Atrans,angle,interpoler) \ gCALC(EST_VRAI(les_images_sont_standards) \ ,Irotation_image(imageR,imageA,nettoyer,RRtrans,RAtrans,Atrans,angle,interpoler) \ ,IFrotation_image(FimageR,FimageA,nettoyer,RRtrans,RAtrans,Atrans,angle,interpoler) \ ) \ /* Rotation d'un angle quelconque d'une image quelconque ("standard" ou "flottante"). Cette */ /* procedure a ete introduite le 20200123095816... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P E R M U T A T I O N D E R E G R O U P E M E N T */ /* D E S B I T S D E M E M E P O I D S D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define TAILLE_PAR_DEFAUT_DES_PAQUETS_DE_PERMUTATION_DES_BITS \ UN #define TRANSLATION_PAR_DEFAUT_DES_INDEX_DE_BITS \ ZERO /* Parametres par defaut des permutations directe et inverse des bits d'une image. Cela */ /* a ete transfere depuis 'v $xiii/di_image$FON 20130707181124' le 20130707181135... */