/*************************************************************************************************************************************/
/* */
/* D E F O R M A T I O N " I N V E R S E " I N D I R E C T E D ' U N E I M A G E " F L O T T A N T E " : */
/* */
/* */
/* Author of '$xci/deformii.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20090508174012). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R F A C E ' listG ' : */
/* */
/* */
/* :Debut_listG: */
/* :Fin_listG: */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */
/* */
/*************************************************************************************************************************************/
#define GENERER_LES_GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_BASE
#include image_image_IMAGESF_EXT
#include image_image_QUAD_IMAGE_EXT
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define LA_DEFORMATION_INVERSE_INDIRECTE_EST_BIDIMENSIONNELLE \
VRAI \
/* La deformation est definie bidimensionnellement ('VRAI') ou bien tridimensionnellement */ \
/* ('FAUX'). */
#define LA_DEFORMATION_INVERSE_INDIRECTE_EST_DEFINIE_EN_COORDONNEES_CARTESIENNES \
VRAI \
/* La deformation est definie en coordonnees cartesiennes ('VRAI') ou bien en coordonnees */ \
/* polaires ('FAUX'). */
#define NOMBRE_D_ITERATIONS_DE_LA_DEFORMATION_INVERSE \
UN \
/* La deformation peut etre iteree. La valeur par defaut correspons a une seule iteration. */
#define ALPHA \
FU
#define BETA_ \
FZERO
/* Parametres d'interpolation (en general : alpha+beta=1). Les valeurs par defaut {1,0} */
/* assurent la non interpolation... */
/* */
/* On notera qu'en general, la logique demande : */
/* */
/* alpha >= beta (soit ponderationA >= ponderationR) */
/* */
/* pour simuler un effet Larsen... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define imageR \
IFmageR
#define imageA \
IFmageA
#define imageT \
IFmageA4
#define imageX_RHO_ \
IFmageA1
#define imageY_THETA \
IFmageA2
#define imageZ_PHI_ \
IFmageA3
#define image_indirecteX \
IFmageA5
#define image_indirecteY \
IFmageA6
/* On notera les associations : */
/* */
/* X --> RHO */
/* Y --> THETA */
/* Z --> PHI */
/* */
/* et non pas (comme les noms 'IFconversion_RPT_...' le laissent supposer) : */
/* */
/* X --> RHO */
/* Y --> PHI */
/* Z --> THETA */
/* */
/* afin de permettre un "recouvrement" des methodes bidimensionnelles (polaire avec Y=THETA) */
/* et tridimensionnelles (spherique avec Y=THETA et Z=PHI)... */
#define ITERATION_DE_LA_DEFORMATION_INVERSE(fonction_de_deformation) \
Bblock \
Repe(nombre_d_iterations_de_la_deformation_inverse) \
Bblock \
BLOC(fonction_de_deformation); \
\
Test(IFET(IFEQ(alpha,FU),IFEQ(beta_,FZERO))) \
Bblock \
CALS(IFmove(imageA,imageR)); \
Eblock \
ATes \
Bblock \
CALS(IFinterpolation(imageT,alpha,imageA,beta_,imageR)); \
CALS(IFmove(imageA,imageT)); \
Eblock \
ETes \
Eblock \
ERep \
\
CALS(IFmove(imageR,imageA)); \
Eblock \
/* Iteration de la deformation inverse destinee, par exemple, a simuler des effets Larsen... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F O R M A T I O N " I N V E R S E " I N D I R E C T E D ' U N E I M A G E " F L O T T A N T E " : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageDIX_RHO_),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageDIY_THETA),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageDIZ_PHI_),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_image_indirecteX),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_image_indirecteY),NOM_PIPE));
DEFV(Logical,INIT(la_deformation_inverse_indirecte_est_bidimensionnelle,LA_DEFORMATION_INVERSE_INDIRECTE_EST_BIDIMENSIONNELLE));
/* La deformation est definie bidimensionnellement ('VRAI') ou bien tridimensionnellement */
/* ('FAUX'). */
DEFV(Logical,INIT(la_deformation_inverse_indirecte_est_definie_en_coordonnees_cartesiennes
,LA_DEFORMATION_INVERSE_INDIRECTE_EST_DEFINIE_EN_COORDONNEES_CARTESIENNES
)
);
/* La deformation est definie en coordonnees cartesiennes ('VRAI') ou bien en coordonnees */
/* polaires ('FAUX'). */
DEFV(Positive,INIT(nombre_d_iterations_de_la_deformation_inverse,NOMBRE_D_ITERATIONS_DE_LA_DEFORMATION_INVERSE));
/* La deformation peut etre iteree. La valeur par defaut correspons a une seule iteration. */
DEFV(Float,INIT(alpha,ALPHA));
DEFV(Float,INIT(beta_,BETA_));
/* Parametres d'interpolation (en general : alpha+beta=1). Les valeurs par defaut {1,0} */
/* assurent la non interpolation... */
/* */
/* alpha : ponderation de 'imageA' */
/* beta : ponderation de 'imageR' */
/* */
/* Les valeurs par defaut {1,0} assurent la compatibilite anterieure. */
/* */
/* On notera qu'en general, la logique demande : */
/* */
/* alpha >= beta (soit ponderationA >= ponderationR) */
/* */
/* pour simuler un effet Larsen... */
/*..............................................................................................................................*/
#define IFdeformation_inverse_indirecte_bidimensionnelle_____nombre_d_iterations \
IFdeformation_inverse_indirecte_bidimensionnelle_____nombre_d_iterations_du_calcul_des_coordonnees
#define IFdeformation_inverse_indirecte_tridimensionnelle_____nombre_d_iterations \
IFdeformation_inverse_indirecte_tridimensionnelle_____nombre_d_iterations_du_calcul_des_coordonnees
/* Afin de raccourcir quelques lignes suivantes... */
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA);
/* On notera qu'il est souhaitable que 'imageA' soit un champ periodique en 'X' et en 'Y' */
/* pour generer des entrelacs 'imageR'... */
GET_ARGUMENT_C("imageDIX=""DIX=""imageDX=""DX=""imageDIR=""DIR=""imageDR=""DR=",nom_imageDIX_RHO_);
GET_ARGUMENT_C("imageDIY=""DIY=""imageDY=""DY=""imageDIT=""DIT=""imageDT=""DT=",nom_imageDIY_THETA);
GET_ARGUMENT_C("imageDIZ=""DIZ=""imageDZ=""DZ=""imageDIP=""DIP=""imageDP=""DP=",nom_imageDIZ_PHI_);
/* On notera qu'il est souhaitable que {imageDIX,imageDIY[,imageDIZ]} soient des champs */
/* periodiques en 'X' et en 'Y' lorsque l'option "matrice=VRAI" est demandee et que la */
/* matrice {{mxx,mxy,mxz},{myx,myy,myz},{mzx,mzy,mzz}} n'est pas unite... */
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_C("imageIIX=""IIX=""imageIX=""IX=",nom_image_indirecteX);
GET_ARGUMENT_C("imageIIY=""IIY=""imageIY=""IY=",nom_image_indirecteY);
GET_ARGUMENT_L("bidimensionnelle=""bidim=""2D=",la_deformation_inverse_indirecte_est_bidimensionnelle);
GET_ARGUMENT_N("tridimensionnelle=""tridim=""3D=",la_deformation_inverse_indirecte_est_bidimensionnelle);
GET_ARGUMENT_L("cartesiennes=""cartesienne=""cartesien="
,la_deformation_inverse_indirecte_est_definie_en_coordonnees_cartesiennes
);
GET_ARGUMENT_N("polaires=""polaire=""spheriques=""spherique="
,la_deformation_inverse_indirecte_est_definie_en_coordonnees_cartesiennes
);
GET_ARGUMENT_F("trx2D=",IFconversion_RT_X_____Post___Translation);
GET_ARGUMENT_F("try2D=",IFconversion_RT_Y_____Post___Translation);
GET_ARGUMENT_F("trx3D=",IFconversion_RPT_X_____Post___Translation);
GET_ARGUMENT_F("try3D=",IFconversion_RPT_Y_____Post___Translation);
GET_ARGUMENT_F("trz3D=",IFconversion_RPT_Z_____Post___Translation);
GET_ARGUMENT_L("ignorer_diX_diY=""idiXdiY="
,IFdeformation_inverse_indirecte_bidimensionnelle_____ignorer_un_couple_diX_diY
);
GET_ARGUMENT_F("ignorer_diX=""idiX="
,IFdeformation_inverse_indirecte_bidimensionnelle_____ignorer_cette_valeur_de_diX
);
GET_ARGUMENT_F("ignorer_diY=""idiY="
,IFdeformation_inverse_indirecte_bidimensionnelle_____ignorer_cette_valeur_de_diY
);
/* Parametres introduits le 20120620120555... */
GET_ARGUMENT_I("Xpave2D=""Xp2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____demi_taille_X_du_pave);
GET_ARGUMENT_I("Ypave2D=""Yp2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____demi_taille_Y_du_pave);
GET_ARGUMENT_I("Xpave3D=""Xp3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____demi_taille_X_du_pave);
GET_ARGUMENT_I("Ypave3D=""Yp3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____demi_taille_Y_du_pave);
GET_ARGUMENT_L("X_normalisees2D=""X_n2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____les_coordonnees_X_sont_normalisees
);
GET_ARGUMENT_N("X_denormalisees2D=""X_dn2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____les_coordonnees_X_sont_normalisees
);
GET_ARGUMENT_L("Y_normalisees2D=""Y_n2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____les_coordonnees_Y_sont_normalisees
);
GET_ARGUMENT_N("Y_denormalisees2D=""Y_dn2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____les_coordonnees_Y_sont_normalisees
);
GET_ARGUMENT_L("Z_normalisees2D=""Z_n2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____les_coordonnees_Z_sont_normalisees
);
GET_ARGUMENT_N("Z_denormalisees2D=""Z_dn2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____les_coordonnees_Z_sont_normalisees
);
GET_ARGUMENT_L("X_normalisees3D=""X_n3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____les_coordonnees_X_sont_normalisees
);
GET_ARGUMENT_N("X_denormalisees3D=""X_dn3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____les_coordonnees_X_sont_normalisees
);
GET_ARGUMENT_L("Y_normalisees3D=""Y_n3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____les_coordonnees_Y_sont_normalisees
);
GET_ARGUMENT_N("Y_denormalisees3D=""Y_dn3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____les_coordonnees_Y_sont_normalisees
);
GET_ARGUMENT_L("Z_normalisees3D=""Z_n3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____les_coordonnees_Z_sont_normalisees
);
GET_ARGUMENT_N("Z_denormalisees3D=""Z_dn3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____les_coordonnees_Z_sont_normalisees
);
GET_ARGUMENT_L("iterer2D=""i2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____iterer_le_calcul_des_coordonnees
);
GET_ARGUMENT_I("nombre_iterations2D=""n2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____nombre_d_iterations
);
GET_ARGUMENT_L("iterer3D=""i3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____iterer_le_calcul_des_coordonnees
);
GET_ARGUMENT_I("nombre_iterations3D=""n3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____nombre_d_iterations
);
GET_ARGUMENT_L("appliquer_une_matrice_de_transformation2D=""matrice2D=""transformation2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____appliquer_une_matrice_de_transformation_2D
);
/* On notera que pour cette option, contrairement a "matrice=VRAI", il n'est pas necessaire */
/* que les champs {imageDIX,imageDIY} soient periodiques en 'X' et en 'Y', et ce meme si la */
/* matrice {{mxx2D,mxy2D},{myx2D,myy2D}} n'est pas unite... */
GET_ARGUMENT_F("mxx2D=""mtxx2D="
,ASD2(IFdeformation_inverse_indirecte_bidimensionnelle_____matrice_de_transformation_2D,cx,cx)
);
GET_ARGUMENT_F("mxy2D=""mtxy2D="
,ASD2(IFdeformation_inverse_indirecte_bidimensionnelle_____matrice_de_transformation_2D,cx,cy)
);
GET_ARGUMENT_F("myx2D=""mtyx2D="
,ASD2(IFdeformation_inverse_indirecte_bidimensionnelle_____matrice_de_transformation_2D,cy,cx)
);
GET_ARGUMENT_F("myy2D=""mtyy2D="
,ASD2(IFdeformation_inverse_indirecte_bidimensionnelle_____matrice_de_transformation_2D,cy,cy)
);
GET_ARGUMENT_F("pre_atrx2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____PreAntiTranslation_Xf);
GET_ARGUMENT_F("post_trx2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____Post___Translation_Xf);
GET_ARGUMENT_F("pre_atry2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____PreAntiTranslation_Yf);
GET_ARGUMENT_F("post_try2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____Post___Translation_Yf);
GET_ARGUMENT_L("appliquer_une_matrice_de_transformation3D=""matrice3D=""transformation3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____appliquer_une_matrice_de_transformation_2D
);
/* On notera que pour cette option, contrairement a "matrice=VRAI", il n'est pas necessaire */
/* que les champs {imageDIX,imageDIY,imageDIZ} soient periodiques en 'X' et en 'Y', et ce */
/* meme si la matrice {{mxx3D,mxy3D},{myx3D,myy3D}} n'est pas unite... */
GET_ARGUMENT_F("mxx3D=""mtxx3D="
,ASD2(IFdeformation_inverse_indirecte_tridimensionnelle_____matrice_de_transformation_2D,cx,cx)
);
GET_ARGUMENT_F("mxy3D=""mtxy3D="
,ASD2(IFdeformation_inverse_indirecte_tridimensionnelle_____matrice_de_transformation_2D,cx,cy)
);
GET_ARGUMENT_F("myx3D=""mtyx3D="
,ASD2(IFdeformation_inverse_indirecte_tridimensionnelle_____matrice_de_transformation_2D,cy,cx)
);
GET_ARGUMENT_F("myy3D=""mtyy3D="
,ASD2(IFdeformation_inverse_indirecte_tridimensionnelle_____matrice_de_transformation_2D,cy,cy)
);
GET_ARGUMENT_F("pre_atrx3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____PreAntiTranslation_Xf);
GET_ARGUMENT_F("post_trx3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____Post___Translation_Xf);
GET_ARGUMENT_F("pre_atry3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____PreAntiTranslation_Yf);
GET_ARGUMENT_F("post_try3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____Post___Translation_Yf);
GET_ARGUMENT_L("iterer_indirection=""ii="
,FFload_point_coordonnees_01_indirectes_____iterer_l_indirection
);
GET_ARGUMENT_I("nombre_iterations_indirection=""nii="
,FFload_point_coordonnees_01_indirectes_____nombre_d_iterations_de_l_indirection
);
/* Parametres introduits le 20090510223734... */
/* */
/* Le 20200510103909, "__________nombre_d_iterations_de_l_indirection" incomprehensible a */
/* ete remplace par "_____nombre_d_iterations_de_l_indirection" plus "habituel"... */
GET_ARGUMENT_L("interpoler=""inter="
,FFload_point_coordonnees_01_indirectes_____interpoler_bilineairement_ou_bicubiquement_
);
GET_ARGUMENT_F("interpolerX=""interX="
,FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_X_
);
GET_ARGUMENT_F("interpolerY=""interY="
,FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_Y_
);
GET_ARGUMENT_L("lineaire=""bilineaire="
,FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_
);
GET_ARGUMENT_N("cubique=""bicubique="
,FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_
);
GET_ARGUMENT_L("appliquer_une_matrice_de_transformation=""matrice=""transformation="
,FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_
);
/* On notera que pour utiliser cette option, il est preferable d'utiliser des champs */
/* {imageDIX,imageDIY[,imageDIZ]} periodiques en 'X' et en 'Y' en particulier quand la */
/* matrice {{mxx,mxy,mxz},{myx,myy,myz},{mzx,mzy,mzz}} n'est pas unite... */
GET_ARGUMENT_F("mxx=""mtxx="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_,cx,cx)
);
GET_ARGUMENT_F("mxy=""mtxy="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_,cx,cy)
);
GET_ARGUMENT_F("mxz=""mtxz="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_,cx,cz)
);
GET_ARGUMENT_F("myx=""mtyx="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_,cy,cx)
);
GET_ARGUMENT_F("myy=""mtyy="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_,cy,cy)
);
GET_ARGUMENT_F("myz=""mtyz="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_,cy,cz)
);
GET_ARGUMENT_F("mzx=""mtzx="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_,cz,cx)
);
GET_ARGUMENT_F("mzy=""mtzy="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_,cz,cy)
);
GET_ARGUMENT_F("mzz=""mtzz="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_,cz,cz)
);
GET_ARGUMENT_F("z=""Z=""Zf=",FFload_point_coordonnees_01_indirectes_____Zf_);
GET_ARGUMENT_F("pre_atrx=",FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Xf_);
GET_ARGUMENT_F("post_trx=",FFload_point_coordonnees_01_indirectes_____Post___Translation_Xf_);
GET_ARGUMENT_F("pre_atry=",FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Yf_);
GET_ARGUMENT_F("post_try=",FFload_point_coordonnees_01_indirectes_____Post___Translation_Yf_);
GET_ARGUMENT_L("Xinterpoler=""Xinter="
,FFload_point_coordonnees_01_indirectes_____interpoler_bilineairement_ou_bicubiquement_imageAX
);
GET_ARGUMENT_F("XinterpolerX=""XinterX="
,FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_X_imageAX
);
GET_ARGUMENT_F("XinterpolerY=""XinterY="
,FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_Y_imageAX
);
GET_ARGUMENT_L("Xlineaire=""Xbilineaire="
,FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_imageAX
);
GET_ARGUMENT_N("Xcubique=""Xbicubique="
,FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_imageAX
);
GET_ARGUMENT_L("Xappliquer_une_matrice_de_transformation=""Xmatrice=""Xtransformation="
,FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_imageAX
);
/* On notera que pour utiliser cette option, il est preferable d'utiliser des champs */
/* {imageDIX,imageDIY[,imageDIZ]} periodiques en 'X' et en 'Y' en particulier quand la */
/* matrice {{mxx,mxy,mxz},{myx,myy,myz},{mzx,mzy,mzz}} n'est pas unite... */
GET_ARGUMENT_F("Xmxx=""Xmtxx="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX,cx,cx)
);
GET_ARGUMENT_F("Xmxy=""Xmtxy="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX,cx,cy)
);
GET_ARGUMENT_F("Xmxz=""Xmtxz="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX,cx,cz)
);
GET_ARGUMENT_F("Xmyx=""Xmtyx="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX,cy,cx)
);
GET_ARGUMENT_F("Xmyy=""Xmtyy="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX,cy,cy)
);
GET_ARGUMENT_F("Xmyz=""Xmtyz="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX,cy,cz)
);
GET_ARGUMENT_F("Xmzx=""Xmtzx="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX,cz,cx)
);
GET_ARGUMENT_F("Xmzy=""Xmtzy="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX,cz,cy)
);
GET_ARGUMENT_F("Xmzz=""Xmtzz="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX,cz,cz)
);
GET_ARGUMENT_F("Xz=""XZ=""XZf=",FFload_point_coordonnees_01_indirectes_____Zf_imageAX);
GET_ARGUMENT_F("Xpre_atrx=",FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Xf_imageAX);
GET_ARGUMENT_F("Xpost_trx=",FFload_point_coordonnees_01_indirectes_____Post___Translation_Xf_imageAX);
GET_ARGUMENT_F("Xpre_atry=",FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Yf_imageAX);
GET_ARGUMENT_F("Xpost_try=",FFload_point_coordonnees_01_indirectes_____Post___Translation_Yf_imageAX);
GET_ARGUMENT_L("Yinterpoler=""Yinter="
,FFload_point_coordonnees_01_indirectes_____interpoler_bilineairement_ou_bicubiquement_imageAY
);
GET_ARGUMENT_F("YinterpolerX=""YinterX="
,FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_X_imageAY
);
GET_ARGUMENT_F("YinterpolerY=""YinterY="
,FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_Y_imageAY
);
GET_ARGUMENT_L("Ylineaire=""Ybilineaire="
,FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_imageAY
);
GET_ARGUMENT_N("Ycubique=""Ybicubique="
,FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_imageAY
);
GET_ARGUMENT_L("Yappliquer_une_matrice_de_transformation=""Ymatrice=""Ytransformation="
,FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_imageAY
);
/* On notera que pour utiliser cette option, il est preferable d'utiliser des champs */
/* {imageDIX,imageDIY[,imageDIZ]} periodiques en 'X' et en 'Y' en particulier quand la */
/* matrice {{mxx,mxy,mxz},{myx,myy,myz},{mzx,mzy,mzz}} n'est pas unite... */
GET_ARGUMENT_F("Ymxx=""Ymtxx="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY,cx,cx)
);
GET_ARGUMENT_F("Ymxy=""Ymtxy="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY,cx,cy)
);
GET_ARGUMENT_F("Ymxz=""Ymtxz="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY,cx,cz)
);
GET_ARGUMENT_F("Ymyx=""Ymtyx="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY,cy,cx)
);
GET_ARGUMENT_F("Ymyy=""Ymtyy="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY,cy,cy)
);
GET_ARGUMENT_F("Ymyz=""Ymtyz="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY,cy,cz)
);
GET_ARGUMENT_F("Ymzx=""Ymtzx="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY,cz,cx)
);
GET_ARGUMENT_F("Ymzy=""Ymtzy="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY,cz,cy)
);
GET_ARGUMENT_F("Ymzz=""Ymtzz="
,ASD2(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY,cz,cz)
);
GET_ARGUMENT_F("Yz=""YZ=""YZf=",FFload_point_coordonnees_01_indirectes_____Zf_imageAY);
GET_ARGUMENT_F("Ypre_atrx=",FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Xf_imageAY);
GET_ARGUMENT_F("Ypost_trx=",FFload_point_coordonnees_01_indirectes_____Post___Translation_Xf_imageAY);
GET_ARGUMENT_F("Ypre_atry=",FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Yf_imageAY);
GET_ARGUMENT_F("Ypost_try=",FFload_point_coordonnees_01_indirectes_____Post___Translation_Yf_imageAY);
GET_ARGUMENT_L("periodiser_X2D=""per_X2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____periodiser_X);
GET_ARGUMENT_L("symetriser_X2D=""sym_X2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____symetriser_X);
GET_ARGUMENT_L("prolonger_X2D=""pro_X2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____prolonger_X);
GET_ARGUMENT_L("periodiser_Y2D=""per_Y2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____periodiser_Y);
GET_ARGUMENT_L("symetriser_Y2D=""sym_Y2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____symetriser_Y);
GET_ARGUMENT_L("prolonger_Y2D=""pro_Y2D=",IFdeformation_inverse_indirecte_bidimensionnelle_____prolonger_Y);
GET_ARGUMENT_F("niveau_hors_image2D=""nhi2D="
,IFdeformation_inverse_indirecte_bidimensionnelle_____niveau_flottant_hors_image
);
GET_ARGUMENT_L("periodiser_X3D=""per_X3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____periodiser_X);
GET_ARGUMENT_L("symetriser_X3D=""sym_X3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____symetriser_X);
GET_ARGUMENT_L("prolonger_X3D=""pro_X3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____prolonger_X);
GET_ARGUMENT_L("periodiser_Y3D=""per_Y3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____periodiser_Y);
GET_ARGUMENT_L("symetriser_Y3D=""sym_Y3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____symetriser_Y);
GET_ARGUMENT_L("prolonger_Y3D=""pro_Y3D=",IFdeformation_inverse_indirecte_tridimensionnelle_____prolonger_Y);
GET_ARGUMENT_F("niveau_hors_image3D=""nhi3D="
,IFdeformation_inverse_indirecte_tridimensionnelle_____niveau_flottant_hors_image
);
GET_ARGUMENT_I("nombre_iterations=""iterations=",nombre_d_iterations_de_la_deformation_inverse);
PROCESS_ARGUMENT_L("arithmetique_etendue_interpolation=""ariei="
,IFinterpolation____`use_arithmetique_etendue_et_non_basique
,BLOC(VIDE;)
,BLOC(Bblock
EGAL(si_le_GooF_est_activable`use_arithmetique_etendue_et_non_basique
,IFinterpolation____`use_arithmetique_etendue_et_non_basique
);
Eblock
)
);
PROCESS_ARGUMENT_N("arithmetique_de_base_interpolation=""aribi="
,IFinterpolation____`use_arithmetique_etendue_et_non_basique
,BLOC(VIDE;)
,BLOC(Bblock
EGAL(si_le_GooF_est_activable`use_arithmetique_etendue_et_non_basique
,NOTL(IFinterpolation____`use_arithmetique_etendue_et_non_basique)
);
/* Le 'NOTL(...)' est absolument necessaire a cause de 'PROCESS_ARGUMENT_N(...)' car, */
/* en effet, lorsque le 'EGAL(...)' est execute, le parametre logique en cours de traitement */
/* est alors inverse ('v $xig/fonct$vv$DEF NOTL.valeur_L_par_defaut'). */
Eblock
)
);
GET_ARGUMENT_F("alpha=""a=""ponderationA=""pA=",alpha);
GET_ARGUMENT_F("beta=""b=""ponderationR=""pR=",beta_);
/* On notera qu'en general, la logique demande : */
/* */
/* alpha >= beta (soit ponderationA >= ponderationR) */
/* */
/* pour simuler un effet Larsen... */
)
);
#undef IFdeformation_inverse_indirecte_tridimensionnelle_____nombre_d_iterations
#undef IFdeformation_inverse_indirecte_bidimensionnelle_____nombre_d_iterations
CALi(IFinitialisation(imageR,FZERO));
/* Initialisation de l'image Resultat. */
Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(imageA,nom_imageA))))
Bblock
Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(imageX_RHO_,nom_imageDIX_RHO_))))
/* Chargement de l'image des deformations "inverses" en 'X' (ou bien en 'RHO')... */
Bblock
Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(imageY_THETA,nom_imageDIY_THETA))))
/* Chargement de l'image des deformations "inverses" en 'Y' (ou bien en 'PHI')... */
Bblock
Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(image_indirecteX,nom_image_indirecteX))))
/* Chargement de l'image de l'indirection des coordonnees 'X'. */
Bblock
Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(image_indirecteY,nom_image_indirecteY))))
/* Chargement de l'image de l'indirection des coordonnees 'Y'. */
Bblock
Test(EST_FAUX(la_deformation_inverse_indirecte_est_bidimensionnelle))
Bblock
CALi(IFinitialisation(imageZ_PHI_,FZcentre_____));
/* A priori, la coordonnee 'Z' est nulle. */
Test(IFNE_chaine(nom_imageDIZ_PHI_,NOM_PIPE))
Bblock
Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(imageZ_PHI_,nom_imageDIZ_PHI_))))
/* Chargement de l'image des deformations "inverses" en 'Z'. */
Bblock
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
PRINT_ATTENTION("la deformation ne peut donc etre que bidimensionnelle");
EGAL(la_deformation_inverse_indirecte_est_bidimensionnelle,VRAI);
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(EST_VRAI(la_deformation_inverse_indirecte_est_bidimensionnelle))
Bblock
BDEFV(imageF,imageX);
BDEFV(imageF,imageY);
Test(EST_VRAI(la_deformation_inverse_indirecte_est_definie_en_coordonnees_cartesiennes))
Bblock
CALS(IFmove(imageX,imageX_RHO_));
CALS(IFmove(imageY,imageY_THETA));
Eblock
ATes
Bblock
CALS(IFconversion_RT_X(imageX,imageX_RHO_,imageY_THETA));
CALS(IFconversion_RT_Y(imageY,imageX_RHO_,imageY_THETA));
Eblock
ETes
ITERATION_DE_LA_DEFORMATION_INVERSE
(BLOC(
Bblock
CALS(IFdeformation_inverse_indirecte_bidimensionnelle(imageR
,imageA
,imageX
,imageY
,image_indirecteX
,image_indirecteY
)
);
Eblock
)
);
/* On notera le 20090510102334 que la commande : */
/* */
/* $xci/deformii.01$X \ */
/* IX=INDIRECTION$COORD_X \ */
/* IY=INDIRECTION$COORD_Y \ */
/* DX=DEFORMATION$COORD_X \ */
/* DY=DEFORMATION$COORD_Y \ */
/* A=ARGUMENT \ */
/* R=RESULTAT \ */
/* $formatI */
/* */
/* est a priori equivalente a : */
/* */
/* $xci/deformi.01$X \ */
/* DX=DEFORMATION$COORD_X \ */
/* DY=DEFORMATION$COORD_Y \ */
/* A=INDIRECTION$COORD_X \ */
/* R=DEFORMATION_INDIRECTE$COORD_X \ */
/* $formatI */
/* */
/* $xci/deformi.01$X \ */
/* DX=DEFORMATION$COORD_X \ */
/* DY=DEFORMATION$COORD_Y \ */
/* A=INDIRECTION$COORD_Y \ */
/* R=DEFORMATION_INDIRECTE$COORD_Y \ */
/* $formatI */
/* */
/* $xci/deformi.01$X \ */
/* DX=DEFORMATION_INDIRECTE$COORD_X \ */
/* DY=DEFORMATION_INDIRECTE$COORD_Y \ */
/* A=ARGUMENT \ */
/* R=RESULTAT \ */
/* $formatI */
/* */
/* mais est donc d'un usage plus simple (voir a ce sujet les commentaires suivants : */
/* 'v $xiii/di_image$FON Definition.des.deformations.inverses.indirectes'). */
/* */
/* ATTENTION, on remarquera que, par defaut, le parametre "bilineaire=" est 'FAUX' pour */
/* '$xci/deformi.01$K' alors qu'il est 'VRAI' pour '$xci/deformi.01$K'. */
EDEFV(imageF,imageY);
EDEFV(imageF,imageX);
Eblock
ATes
Bblock
BDEFV(imageF,imageX);
BDEFV(imageF,imageY);
BDEFV(imageF,imageZ);
Test(EST_VRAI(la_deformation_inverse_indirecte_est_definie_en_coordonnees_cartesiennes))
Bblock
CALS(IFmove(imageX,imageX_RHO_));
CALS(IFmove(imageY,imageY_THETA));
CALS(IFmove(imageZ,imageZ_PHI_));
Eblock
ATes
Bblock
CALS(IFconversion_RPT_X(imageX,imageX_RHO_,imageY_THETA,imageZ_PHI_));
CALS(IFconversion_RPT_Y(imageY,imageX_RHO_,imageY_THETA,imageZ_PHI_));
CALS(IFconversion_RPT_Z(imageZ,imageX_RHO_,imageY_THETA,imageZ_PHI_));
Eblock
ETes
ITERATION_DE_LA_DEFORMATION_INVERSE
(BLOC(
Bblock
CALS(IFdeformation_inverse_indirecte_tridimensionnelle(imageR
,imageA
,imageX
,imageY
,imageZ
,image_indirecteX
,image_indirecteY
)
);
Eblock
)
);
EDEFV(imageF,imageZ);
EDEFV(imageF,imageY);
EDEFV(imageF,imageX);
Eblock
ETes
CALi(IupdateF_image(nom_imageR,imageR));
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
RETU_Commande;
Eblock
ECommande