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