/*************************************************************************************************************************************/ /* */ /* P R O D U I T H Y P E R - C O M P L E X E D E H U I T I M A G E S F L O T T A N T E S */ /* E T D O N C D E D E U X F A M I L L E S D E Q U A T E R N I O N S : */ /* */ /* */ /* Author of '$xci/multHC_02.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20060619160708). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 /* Introduit le 20061018094159... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_PENT_IMAGE_EXT #include image_image_GOOF_IMAGE_EXT /* Introduit le 20061018094159... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define LES_IMAGESA_SONT_STANDARDS \ FAUX #define LES_IMAGESR_SONT_STANDARDS \ FAUX /* Pour permettre de traiter aussi bien des images standards que non. Ceci fut introduit le */ /* 20060625120719... */ #define MINIMUM_FORCE \ COORDONNEE_BARYCENTRIQUE_MINIMALE #define MAXIMUM_FORCE \ COORDONNEE_BARYCENTRIQUE_MAXIMALE /* Definition de la normalisation des images standards (introduit le 20060625120719...). */ #define UTILISER_L_ARITHMETIQUE_ETENDUE \ FAUX \ /* Faut-il utiliser l'arithmetique etendue ('VRAI') ou pas ('FAUX') ? Ceci fut introduit */ \ /* le 20061018094159, la valeur par defaut assurant la compatibilite anterieure... */ #define PONDERATION_R_IMPLICITE \ FZERO #define PONDERATION_I_IMPLICITE \ FZERO #define PONDERATION_J_IMPLICITE \ FZERO #define PONDERATION_K_IMPLICITE \ FZERO #define PONDERATION_M_IMPLICITE \ FZERO #define PONDERATION_T_IMPLICITE \ FZERO #define PONDERATION_P_IMPLICITE \ FZERO #define PONDERATION_A_IMPLICITE \ FZERO /* Ponderation de selection des composantes des resultats apres le produit. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O D U I T H Y P E R - C O M P L E X E D E H U I T I M A G E S F L O T T A N T E S */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA_R_1),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA_I_1),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA_J_1),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA_K_1),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA_R_2),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA_I_2),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA_J_2),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA_K_2),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageP),NOM_PIPE)); DEFV(genere_Float,INIT(minimum_force,MINIMUM_FORCE)); DEFV(genere_Float,INIT(maximum_force,MAXIMUM_FORCE)); /* Definition de la normalisation des images standards (introduit le 20060625120719...). */ DEFV(Logical,INIT(utiliser_l_arithmetique_etendue,UTILISER_L_ARITHMETIQUE_ETENDUE)); /* Faut-il utiliser l'arithmetique etendue ('VRAI') ou pas ('FAUX') ? Ceci fut introduit */ /* le 20061018094159, la valeur par defaut assurant la compatibilite anterieure... */ DEFV(Float,INIT(ponderation_R,PONDERATION_R_IMPLICITE)); DEFV(Float,INIT(ponderation_I,PONDERATION_I_IMPLICITE)); DEFV(Float,INIT(ponderation_J,PONDERATION_J_IMPLICITE)); DEFV(Float,INIT(ponderation_K,PONDERATION_K_IMPLICITE)); DEFV(Float,INIT(ponderation_M,PONDERATION_M_IMPLICITE)); DEFV(Float,INIT(ponderation_T,PONDERATION_T_IMPLICITE)); DEFV(Float,INIT(ponderation_P,PONDERATION_P_IMPLICITE)); DEFV(Float,INIT(ponderation_A,PONDERATION_A_IMPLICITE)); /* Ponderation de selection des composantes des resultats apres le produit. */ /*..............................................................................................................................*/ EGAL(si_le_GooF_est_activable_utiliser_l_arithmetique_etendue_au_lieu_de_l_arithmetique_de_base,VRAI); /* A priori, l'utilisation de l'arithmetique etendue est forcee puisque l'option */ /* 'utiliser_l_arithmetique_etendue' peut etre activee et que cette derniere n'a */ /* evidemment d'interet qu'avec l'arithmetique etendue. Ce forcage a ete introduit */ /* le 20061018111609 parce que c'est evidemment le mode le plus interessant ici... */ EGAL(HC_____si_GooF_activable_arithmetique_etendue_au_lieu_arithmetique_de_base,VRAI); /* A priori, l'utilisation de l'arithmetique etendue dans les hyper-complexes est forcee */ /* parce que c'est evidemment le mode le plus interessant ici (introduit le 20070130094712). */ EGAL(les_imagesA_sont_standards,LES_IMAGESA_SONT_STANDARDS); EGAL(les_imagesR_sont_standards,LES_IMAGESR_SONT_STANDARDS); /* Pour permettre de traiter aussi bien des images standards que non. Ceci fut introduit le */ /* 20060625120719... */ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imageA_R_1=""AR1=",nom_imageA_R_1); GET_ARGUMENT_C("imageA_I_1=""AI1=",nom_imageA_I_1); GET_ARGUMENT_C("imageA_J_1=""AJ1=",nom_imageA_J_1); GET_ARGUMENT_C("imageA_K_1=""AK1=",nom_imageA_K_1); GET_ARGUMENT_C("imageA_R_2=""AR2=",nom_imageA_R_2); GET_ARGUMENT_C("imageA_I_2=""AI2=",nom_imageA_I_2); GET_ARGUMENT_C("imageA_J_2=""AJ2=",nom_imageA_J_2); GET_ARGUMENT_C("imageA_K_2=""AK2=",nom_imageA_K_2); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_L("standardA=",les_imagesA_sont_standards); GET_ARGUMENT_L("standardR=",les_imagesR_sont_standards); /* Introduit le 20060625120719... */ GET_ARGUMENT_F("minimum=""min=",minimum_force); GET_ARGUMENT_F("maximum=""max=",maximum_force); /* Introduit le 20060625120719... */ GET_ARGUMENT_L("arithmetique_etendue_produit=""ariep=",utiliser_l_arithmetique_etendue); /* Introduit le 20061018094159... */ /* */ /* On notera que ces parametres conditionnent la fonction 'IFproduit_...(...)' qui sera */ /* appelee ci-apres, alors que les parametres 'v $xig/fonct$vv$DEF arithmetique_etendue=', */ /* eux conditionnent le choix entre l'arithmetique de base et l'arithmetique etendue a son */ /* niveau le plus basique (et dans le cas present a l'interieur meme de la fonction */ /* 'IFproduit_hyper_complexe_etendu(...)' si c'est elle qui a ete choisie...). */ GET_ARGUMENT_L("multiplicatif=",IFproduit_hyper_complexe_____multiplicatif); GET_ARGUMENT_N("additif=",IFproduit_hyper_complexe_____multiplicatif); GET_ARGUMENT_L("direct=",IFproduit_hyper_complexe_____direct); GET_ARGUMENT_N("inverse=",IFproduit_hyper_complexe_____direct); GET_ARGUMENT_F("pcr=""pcR=""Pond1=",ponderation_R); GET_ARGUMENT_F("pci=""pcI=""Pond2=",ponderation_I); GET_ARGUMENT_F("pcj=""pcJ=""Pond3=",ponderation_J); GET_ARGUMENT_F("pck=""pcK=""Pond4=",ponderation_K); GET_ARGUMENT_F("pcm=""pcM=""Pond5=",ponderation_M); GET_ARGUMENT_F("pct=""pcT=""Pond6=""pca1=""pcA1=",ponderation_T); GET_ARGUMENT_F("pcp=""pcP=""Pond7=""pca2=""pcA2=",ponderation_P); GET_ARGUMENT_F("pca=""pcA=""Pond8=""pca3=""pcA3=",ponderation_A); /* Les arguments {"pca1=","pcA1=","pca2=","pcA2=",pca3=","pcA3="} ont ete introduits le */ /* 20110914092325 pour la compatibilite avec 'v $xci/multHHC_02.01$K pcA1'... */ CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_HYPER_COMPLEXES; /* Cette extension a ete introduite le 20070130105143. Mais je decouvre le 20100105180850 */ /* qu'il y avait ci-dessus : */ /* */ /* CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_COMPLEXES; */ /* */ /* de toute evidence par erreur... */ ) ); CALi(gInettoyage(les_imagesR_sont_standards,ImageR,IFmageR)); /* Initialisation de l'image Resultat. */ Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards ,ImageA1,IFmageA1 ,nom_imageA_R_1 ) ) ) ) Bblock Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards ,ImageA2,IFmageA2 ,nom_imageA_I_1 ) ) ) ) Bblock Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards ,ImageA3,IFmageA3 ,nom_imageA_J_1 ) ) ) ) Bblock Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards ,ImageA4,IFmageA4 ,nom_imageA_K_1 ) ) ) ) Bblock /* Chargement des images {R,I,J,K} Argument 1. */ Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards ,ImageA5,IFmageA5 ,nom_imageA_R_2 ) ) ) ) Bblock Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards ,ImageA6,IFmageA6 ,nom_imageA_I_2 ) ) ) ) Bblock Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards ,ImageA7,IFmageA7 ,nom_imageA_J_2 ) ) ) ) Bblock Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards ,ImageA8,IFmageA8 ,nom_imageA_K_2 ) ) ) ) Bblock /* Chargement des images {R,I,J,K} Argument 2. */ Test(EST_VRAI(les_imagesA_sont_standards)) Bblock CALS(Istd_float(IFmageA1,minimum_force,maximum_force,ImageA1)); CALS(Istd_float(IFmageA2,minimum_force,maximum_force,ImageA2)); CALS(Istd_float(IFmageA3,minimum_force,maximum_force,ImageA3)); CALS(Istd_float(IFmageA4,minimum_force,maximum_force,ImageA4)); CALS(Istd_float(IFmageA5,minimum_force,maximum_force,ImageA5)); CALS(Istd_float(IFmageA6,minimum_force,maximum_force,ImageA6)); CALS(Istd_float(IFmageA7,minimum_force,maximum_force,ImageA7)); CALS(Istd_float(IFmageA8,minimum_force,maximum_force,ImageA8)); /* Normalisation des images standards (introduit le 20060625115015...). */ Eblock ATes Bblock Eblock ETes Test(IL_NE_FAUT_PAS(utiliser_l_arithmetique_etendue)) /* Test introduit le 20061018093953... */ Bblock CALS(IFproduit_hyper_complexe(IFmageR ,ponderation_R ,ponderation_I ,ponderation_J ,ponderation_K ,ponderation_M ,ponderation_T ,ponderation_P ,ponderation_A ,IFmageA1,IFmageA2,IFmageA3,IFmageA4 ,IFmageA5,IFmageA6,IFmageA7,IFmageA8 ) ); /* Et produit "hyper-complexe" des quatre images Argument. */ /* */ /* Le 20060929095425, en faisant le produit des deux ensembles "quaternioniques" suivants : */ /* */ /* Q1 = {0,cX,cY,cZ} avec {cX,cY,cZ}='$xrs/project2D.01$Z tore.11 ...' */ /* Q2 = {0,cX,cY,cZ} avec {cX,cY,cZ}='$xrs/project2D.01$Z sphere.11 ...' */ /* */ /* j'observe que l'image non standard obtenue avec les ponderations (composante 'k') : */ /* */ /* pR=0 pI=0 pJ=0 pK=1 pM=0 pT=0 pP=0 pA=0 */ /* */ /* presente une apparence bruitee. En fait ses extremas sont tres petits (en valeur absolue) */ /* et sont de l'ordre de +2.22e-16. Pour verifier que le produit quaternionique fonctionne */ /* correctement, je fais le produit des deux images-quaternioniques suivantes : */ /* */ /* Q1 = {1,2,3,4} */ /* Q2 = {5,6,7,8} */ /* */ /* et le resultat obtenu fut : */ /* */ /* {-60,+12,+30,+24} */ /* */ /* ce qui est correct. Le probleme de bruit pourrait etre donc du au fait que l'on peut etre */ /* avec les 'Q1' et 'Q2' ci-dessus proche des limites de precision de la machine et qu'en */ /* fait, la composante 'k' devrait etre nulle... */ /* */ /* Au passage, les essais suivants ont ete faits : */ /* */ /* Q1 = {0,cY,cZ,cX} */ /* Q2 = {0,cY,cZ,cX} */ /* pR=0 pI=0 pJ=1 pK=0 pM=0 pT=0 pP=0 pA=0 */ /* */ /* et : */ /* */ /* Q1 = {0,cZ,cX,cY} */ /* Q2 = {0,cZ,cX,cY} */ /* pR=0 pI=1 pJ=0 pK=0 pM=0 pT=0 pP=0 pA=0 */ /* */ /* Ils ont donne des extremas du meme ordre de grandeur... */ Eblock ATes Bblock CALS(IFproduit_hyper_complexe_etendu(IFmageR ,ponderation_R ,ponderation_I ,ponderation_J ,ponderation_K ,ponderation_M ,ponderation_T ,ponderation_P ,ponderation_A ,IFmageA1,IFmageA2,IFmageA3,IFmageA4 ,IFmageA5,IFmageA6,IFmageA7,IFmageA8 ) ); /* Et produit "hyper-complexe" generalise des quatre images Argument (introduit le */ /* 20061018094159). */ Eblock ETes Test(EST_VRAI(les_imagesR_sont_standards)) Bblock CALS(Ifloat_std_avec_renormalisation(ImageR,IFmageR)); /* Denormalisation de l'image Resultat (introduit le 20060625115015...). */ Eblock ATes Bblock Eblock ETes CALi(gIupdate_image(les_imagesR_sont_standards,nom_imageR,ImageR,IFmageR)); 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 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