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