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