/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R O D U I T   G E N E R A L I S E   D E   D E U X   I M A G E S  :                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande genere une image                                                                                */
/*                  dont le nom est le premier argument                                                                              */
/*                  d'appel ; elle est le resultat du                                                                                */
/*                  produit generalise des deux images                                                                               */
/*                  Arguments a l'aide d'une table de                                                                                */
/*                  multiplication generalisee extraite                                                                              */
/*                  d'une troisieme image Argument.                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/multi_02.04$K' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1993??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   INVERSER_LE_PRODUIT_GENERALISE                                                                                                \
                    FAUX                                                                                                                \
                                        /* Faut-il inverser le produit ('VRAI') ou calculer le produit direct ('FAUX') ? Ceci a ete  */ \
                                        /* introduit le 20040203101948 uniquement si 'EST_VRAI(les_images_sont_standards)'...        */
#define   INVERSER_LE_PRODUIT_GENERALISE_AU_CENTRE                                                                                      \
                    FAUX                                                                                                                \
                                        /* L'inconnue est-elle 'T' ("centre"='VRAI') ou 'A1' ou 'A2' ("centre"='FAUX') ? Ceci a ete  */ \
                                        /* introduit le 20040205090947 uniquement si 'EST_VRAI(les_images_sont_standards)'...        */
#define   INVERSER_LE_PRODUIT_GENERALISE_A_DROITE                                                                                       \
                    VRAI                                                                                                                \
                                        /* L'inconnue est-elle 'A2' ("gauche"='VRAI') ou 'A1' ("droite"='FAUX') ? Ceci a ete         */ \
                                        /* introduit le 20040203121217 uniquement si 'EST_VRAI(les_images_sont_standards)'...        */

#define   X_COEFFICIENT                                                                                                                 \
                    DIVI(FLOT(k___dimX),FLOT(COULEURS))
#define   Y_COEFFICIENT                                                                                                                 \
                    DIVI(FLOT(k___dimY),FLOT(COULEURS))
                                        /* Facteur multiplicatif permettant de "dilater" l'image 'T' definissant la table de         */
                                        /* multiplication generalisee.                                                               */
                                        /*                                                                                           */
                                        /* ATTENTION : le 20021002173746 ont ete introduits les 'FLOT(...)' dans les definitions     */
                                        /* ci-dessus, d'ou des risques d'incompatibilite avec des generations anterieures...         */
#define   X_TRANSLATION                                                                                                                 \
                    FZERO
#define   Y_TRANSLATION                                                                                                                 \
                    FZERO
                                        /* Translation de l'image 'T' definissant la table de multiplication generalisee.            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R O D U I T   G E N E R A L I S E   D E   D E U X   I M A G E S  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(des_arguments_pour_les_images_non_standards,NEXIST));
                                        /* Introduit le 20050603150507 afin de savoir s'il y a des arguments qui ne sont utilies que */
                                        /* dans le cas 'EST_FAUX(les_images_sont_standards)'...                                      */

     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageA1),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageA2),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageT),NOM_PIPE));

     DEFV(Logical,INIT(inverser_le_produit_generalise_au_centre,INVERSER_LE_PRODUIT_GENERALISE_AU_CENTRE));
                                        /* L'inconnue est-elle 'T' ("centre"='VRAI') ou 'A1' ou 'A2' ("centre"='FAUX') ? Ceci a ete  */
                                        /* introduit le 20040205090947 uniquement si 'EST_VRAI(les_images_sont_standards)'...        */
     DEFV(Logical,INIT(inverser_le_produit_generalise,INVERSER_LE_PRODUIT_GENERALISE));
                                        /* Faut-il inverser le produit ('VRAI') ou calculer le produit direct ('FAUX'). Ceci a ete   */
                                        /* introduit le 20040203101948 uniquement si 'EST_VRAI(les_images_sont_standards)'...        */
     DEFV(Logical,INIT(inverser_le_produit_generalise_a_droite,INVERSER_LE_PRODUIT_GENERALISE_A_DROITE));
                                        /* L'inconnue est-elle 'A2' ("gauche"='VRAI') ou 'A1' ("droite"='FAUX') ? Ceci a ete         */
                                        /* introduit le 20040203121217 uniquement si 'EST_VRAI(les_images_sont_standards)'...        */
                                        /*                                                                                           */
                                        /* L'utilisation sera la suivante :                                                          */
                                        /*                                                                                           */
                                        /*                  inverse=FAUX                                                             */
                                        /*                                      T=$xTV/IMAGE.T           < . . . . . . . . . . . .   */
                                        /*                                      A1=$xTV/IMAGE.A1         < . . . . . . . . . .   .   */
                                        /*                                      A2=$xTV/IMAGE.A2         < . . . . . . .     .   .   */
                                        /*                                      R=$xTV/IMAGE.R           ----------    .     .   .   */
                                        /*                                                                         |   .     .   .   */
                                        /*                                                                         |   .     .   .   */
                                        /*                  inverse=VRAI centre=FAUX droite=VRAI                   |   .     .   .   */
                                        /*                                      A1=$xTV/IMAGE.A1                   |   .     .   .   */
                                        /*                                      A2_R=$xTV/IMAGE.R        <---------|   .     .   .   */
                                        /*                                      T=$xTV/IMAGE.T                     |   .     .   .   */
                                        /*                                      R_A2=$xTV/IMAGE.R_A2     . . . . . | . .     .   .   */
                                        /*                                                                         |         .   .   */
                                        /*                                                                         |         .   .   */
                                        /*                  inverse=VRAI centre=FAUX gauche=VRAI                   |         .   .   */
                                        /*                                      A1_R=$xTV/IMAGE.R        <---------|         .   .   */
                                        /*                                      A2=$xTV/IMAGE.A2                   |         .   .   */
                                        /*                                      T=$xTV/IMAGE.T                     |         .   .   */
                                        /*                                      R_A1=$xTV/IMAGE.R_A1     . . . . . | . . . . .   .   */
                                        /*                                                                         |             .   */
                                        /*                                                                         |             .   */
                                        /*                  inverse=VRAI centre=VRAI                               |             .   */
                                        /*                                      A1=$xTV/IMAGE.A1                   |             .   */
                                        /*                                      A2=$xTV/IMAGE.A2                   |             .   */
                                        /*                                      T_R=$xTV/IMAGE.R         <---------              .   */
                                        /*                                      R_T=$xTV/IMAGE.R_T       . . . . . . . . . . . . .   */
                                        /*                                                                                           */

     DEFV(coeffF_2D,coefficient);
                                        /* Facteur multiplicatif permettant de "dilater" l'image 'T' definissant la table de         */
                                        /* multiplication generalisee.                                                               */
                                        /*                                                                                           */
                                        /* ATTENTION : le 20021002173746 'coefficient' est passe de 'coeffI_2D' a 'coeffF_2D'        */
                                        /* ci-dessus, d'ou des risques d'incompatibilite avec des generations anterieures...         */
     DEFV(deltaF_2D,trans);
                                        /* Translation de l'image 'T' definissant la table de multiplication generalisee. On notera  */
                                        /* le nom 'trans' a la place de 'translation' du a des questions de mise en page lors de     */
                                        /* l'utilisation de 'INITIALISATION_QUELCONQUE_TABLE_DE_MULTIPLICATION(...)'...              */
     /*..............................................................................................................................*/
     INITIALISATION_COEFFICIENT_2D(coefficient,X_COEFFICIENT,Y_COEFFICIENT);
                                        /* Initialisation du facteur multiplicatif permettant de "dilater" l'image 'T' definissant   */
                                        /* la table de multiplication generalisee.                                                   */
     INITIALISATION_ACCROISSEMENT_2D(trans,X_TRANSLATION,Y_TRANSLATION);
                                        /* Initialisation de la translation de l'image 'T' definissant la table de multiplication    */
                                        /* generalisee.                                                                              */

     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_C("imageA1_R=""imageA1=""A1_R=""A1=",nom_imageA1);
                         GET_ARGUMENT_C("imageA2_R=""imageA2=""A2_R=""A2=",nom_imageA2);
                         GET_ARGUMENT_C("imageT_R=""imageTM=""imageT=""imageA3=""T_R=""TM=""T=""A3=",nom_imageT);
                         GET_ARGUMENT_C("imageR_TM=""imageR_T=""imageR_A2=""imageR_A1=""imageR=""R_TM=""R_A2=""R_A1=""R_T=""R="
                                       ,nom_imageR
                                        );
                         GET_ARGUMENT_L("standard=",les_images_sont_standards);

                         GET_ARGUMENT_F("Cx=",ASD1(coefficient,cx));
                         GET_ARGUMENT_F("Cy=",ASD1(coefficient,cy));
                         GET_ARGUMENT_F("Tx=",ASD1(trans,dx));
                         GET_ARGUMENT_F("Ty=",ASD1(trans,dy));

                         EGAL(cumul_logique_de_valeur_recherchee,NEXIST);
                                        /* Introduit le 20050603150507 afin de savoir si des arguments utiles uniquement dans le     */
                                        /* cas 'EST_FAUX(les_images_sont_standards)' ont ete rencontres...                           */

                         GET_ARGUMENT_L("drenormaliser=""dr="
                                       ,IFproduit_generalise_____faire_IFnormalisation_automatique_des_operandes
                                        );
                                        /* Parametre introduit le 20040129091816...                                                  */

                         GET_ARGUMENT_L("non_inversible=""avertir="
                                       ,IFproduit_generalise_____avertir_de_la_non_inversibilite_eventuelle
                                        );
                         GET_ARGUMENT_F("fx=""fX=",IFproduit_generalise_____facteur_des_coordonnees_X);
                         GET_ARGUMENT_I("trx=""trX=",IFproduit_generalise_____translateur_des_coordonnees_X);
                         GET_ARGUMENT_F("fy=""fY=",IFproduit_generalise_____facteur_des_coordonnees_Y);
                         GET_ARGUMENT_I("try=""trY=",IFproduit_generalise_____translateur_des_coordonnees_Y);
                                        /* Arguments introduits le 20040228091849...                                                 */
                         GET_ARGUMENT_F("pxn=""pXn=",IFproduit_generalise_____ponderation_des_coordonnees_X_n);
                         GET_ARGUMENT_F("pxx=""pXX=",IFproduit_generalise_____ponderation_des_coordonnees_X_X);
                         GET_ARGUMENT_F("pxy=""pXY=",IFproduit_generalise_____ponderation_des_coordonnees_X_Y);
                         GET_ARGUMENT_F("pyn=""pYn=",IFproduit_generalise_____ponderation_des_coordonnees_Y_n);
                         GET_ARGUMENT_F("pyx=""pYX=",IFproduit_generalise_____ponderation_des_coordonnees_Y_X);
                         GET_ARGUMENT_F("pyy=""pYY=",IFproduit_generalise_____ponderation_des_coordonnees_Y_Y);
                                        /* Arguments introduits le 20040831143514...                                                 */
                         GET_ARGUMENT_L("periodiser_X=""periodX=",IFproduit_generalise_____periodiser_X);
                         GET_ARGUMENT_L("periodiser_Y=""periodY=",IFproduit_generalise_____periodiser_Y);
                         GET_ARGUMENT_L("symetriser_X=""symetrX=",IFproduit_generalise_____symetriser_X);
                         GET_ARGUMENT_L("symetriser_Y=""symetrY=",IFproduit_generalise_____symetriser_Y);
                         GET_ARGUMENT_L("prolonger_X=""prolX=",IFproduit_generalise_____prolonger_X);
                         GET_ARGUMENT_L("prolonger_Y=""prolY=",IFproduit_generalise_____prolonger_Y);
                         GET_ARGUMENT_F("niveau_hors_image=""niveau=",IFproduit_generalise_____niveau_hors_image);
                                        /* Arguments introduits le 20040228091849...                                                 */

                         GET_ARGUMENT_L("inverser=""inverse=",inverser_le_produit_generalise);
                         GET_ARGUMENT_N("direct=",inverser_le_produit_generalise);
                         GET_ARGUMENT_L("centre=",inverser_le_produit_generalise_au_centre);
                         GET_ARGUMENT_L("droite=""d=",inverser_le_produit_generalise_a_droite);
                         GET_ARGUMENT_N("gauche=""g=",inverser_le_produit_generalise_a_droite);

                         GET_ARGUMENT_L("icrenormaliser=""icr="
                                       ,IFproduit_generalise_inverse_au_centre_T_____faire_IFnormalisation_automatique_des_operandes
                                        );
                         GET_ARGUMENT_L("igrenormaliser=""igr="
                                       ,IFproduit_generalise_inverse_a_gauche_A1_____faire_IFnormalisation_automatique_des_operandes
                                        );
                         GET_ARGUMENT_L("idrenormaliser=""idr="
                                       ,IFproduit_generalise_inverse_a_droite_A2_____faire_IFnormalisation_automatique_des_operandes
                                        );

                         GET_ARGUMENT_F("npnc=""niveau_des_points_non_calcules="
                                       ,IFproduit_generalise_inverse_au_centre_T_____niveau_des_points_non_calcules_de_imageR_T
                                        );
                                        /* Parametre introduit le 20040206091745.                                                    */

                         EGAL(des_arguments_pour_les_images_non_standards
                             ,OUIN(des_arguments_pour_les_images_non_standards
                                  ,cumul_logique_de_valeur_recherchee
                                   )
                              );
                                        /* Introduit le 20050603150507 afin de savoir si des arguments utiles uniquement dans le     */
                                        /* cas 'EST_FAUX(les_images_sont_standards)' ont ete rencontres...                           */
                         )
                    );

     CALi(gInettoyage(les_images_sont_standards,ImageR,IFmageR));
                                        /* Initialisation de l'image Resultat.                                                       */

     Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_images_sont_standards,ImageA1,IFmageA1,nom_imageA1))))
          Bblock
                                        /* Chargement de la premiere image Argument.                                                 */
          Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_images_sont_standards,ImageA2,IFmageA2,nom_imageA2))))
               Bblock
                                        /* Chargement de la deuxieme image Argument.                                                 */
               Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_images_sont_standards,ImageA3,IFmageA3,nom_imageT))))
                    Bblock
                                        /* Chargement de la troisieme image Argument.                                                */
                    Test(IL_NE_FAUT_PAS(inverser_le_produit_generalise))
                         Bblock
                         DEFV(table_de_multiplication_generalisee,table_de_multiplication);
                                        /* Table de multiplication generalisee...                                                    */
                                        /*                                                                                           */
                                        /* ATTENTION : la structure 'table_de_multiplication' doit etre declaree quel que soit la    */
                                        /* valeur de 'les_images_sont_standards' (que cela soit 'VRAI' ou 'FAUX') a cause de sa      */
                                        /* reference dans 'gIproduit_generalise(...)' qui est situe a l'exterieur du 'Test(...)'     */
                                        /* correspondant ci-apres...                                                                 */

                         Test(EST_VRAI(les_images_sont_standards))
                                        /* Cette possibilite a ete introduite le 20040127142617...                                   */
                              Bblock
                                        /* Cas d'une image 'image' :                                                                 */
                              Test(PRESENT(des_arguments_pour_les_images_non_standards))
                                   Bblock
                                   PRINT_ERREUR("les arguments presents relatifs aux images non 'standard's ne seront pas utilises");
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              INITIALISATION_QUELCONQUE_TABLE_DE_MULTIPLICATION
                                  (table_de_multiplication
                                  ,load_point_valide(ImageA3
                                                    ,COXA(INTE(AXPB(ASD1(coefficient,cx)
                                                                   ,NIVR(SE12(niveau1,niveau2))
                                                                   ,_lDENORMALISE_OX(ASD1(trans,dx))
                                                                    )
                                                               )
                                                          )
                                                    ,COYA(INTE(AXPB(ASD1(coefficient,cy)
                                                                   ,NIVR(SE22(niveau1,niveau2))
                                                                   ,_lDENORMALISE_OY(ASD1(trans,dy))
                                                                    )
                                                               )
                                                          )
                                                     )
                                   );
                                        /* Initialisation de la table de multiplication generalisee. Le 20021002141437, j'ai mis     */
                                        /* les procedures 'CO?A(...)' la ou il faut, alors qu'avant cette date, elles avaient        */
                                        /* comme arguments les 'NIVR(...)'.                                                          */
                              Eblock
                         ATes
                              Bblock
                                        /* Cas d'une image 'imageF' :                                                                */
                              Eblock
                         ETes

                         CALS(gIproduit_generalise(les_images_sont_standards
                                                  ,ImageR,IFmageR
                                                  ,ImageA1,IFmageA1
                                                  ,ImageA2,IFmageA2
                                                  ,table_de_multiplication,IFmageA3
                                                   )
                              );
                                        /* Produit des deux images arguments 'ImageA1' et 'ImageA2' via la table de multiplication   */
                                        /* 'ImageA3'.                                                                                */
                         Eblock
                    ATes
                         Bblock
                         Test(EST_VRAI(les_images_sont_standards))
                              Bblock
                                        /* Cas d'une image 'image' :                                                                 */
                              PRINT_ERREUR("l'inversion du produit generalise est impossible avec les images 'standard's");
                              Eblock
                         ATes
                              Bblock
                                        /* Cas d'une image 'imageF' :                                                                */
                              Test(IL_FAUT(inverser_le_produit_generalise_au_centre))
                                   Bblock
                                   CALS(IFproduit_generalise_inverse_au_centre_T(IFmageR
                                                                                ,IFmageA1
                                                                                ,IFmageA2
                                                                                ,IFmageA3
                                                                                 )
                                        );
                                        /* Inversion du produit a droite...                                                          */
                                   Eblock
                              ATes
                                   Bblock
                                   Test(IL_FAUT(inverser_le_produit_generalise_a_droite))
                                        Bblock
                                        CALS(IFproduit_generalise_inverse_a_droite_A2(IFmageR
                                                                                     ,IFmageA1
                                                                                     ,IFmageA2
                                                                                     ,IFmageA3
                                                                                      )
                                             );
                                        /* Inversion du produit a droite...                                                          */
                                        Eblock
                                   ATes
                                        Bblock
                                        CALS(IFproduit_generalise_inverse_a_gauche_A1(IFmageR
                                                                                     ,IFmageA1
                                                                                     ,IFmageA2
                                                                                     ,IFmageA3
                                                                                      )
                                             );
                                        /* Inversion du produit a gauche...                                                          */
                                        Eblock
                                   ETes
                                   Eblock
                              ETes
                              Eblock
                         ETes
                         Eblock
                    ETes

                    CALi(gIupdate_image(les_images_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

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.