/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D U   S I G L E   " D E N I A U - C O N S E I L S "  :                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrd/Deniau.01$K' :                                                                                             */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1990??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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_CONTOURS_EXT
#include  maths_fonct_COURBES_1_EXT

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   TRES_PETITE_DIMENSION                                                                                                         \
                    UN                                                                                                                  \
                                        /* Tres petite dimension du sigle.                                                           */
#define   PETITE_DIMENSION                                                                                                              \
                    DOUB(TRES_PETITE_DIMENSION)                                                                                         \
                                        /* Petite dimension du sigle.                                                                */
#define   MOYENNE_DIMENSION                                                                                                             \
                    DOUB(PETITE_DIMENSION)                                                                                              \
                                        /* Moyenne dimension du sigle.                                                               */
#define   GRANDE_DIMENSION                                                                                                              \
                    DOUB(MOYENNE_DIMENSION)                                                                                             \
                                        /* Grande dimension du sigle.                                                                */
#define   REMPLIR(contexte,couleur)                                                                                                     \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(remplir_les_contours))                                                                                 \
                         Bblock                                                                                                         \
                         RCG(contexte);                                                                                                 \
                                        /* Recuperation du contexte associe au contour a remplir.                                    */ \
                         INITIALISATION_POINT_2D(point_de_depart,ASD1(vecteurs_____cursor_3D,x),ASD1(vecteurs_____cursor_3D,y));        \
                                        /* Positionnement du point de depart de remplissage du contour. On notera que l'on           */ \
                                        /* n'utilise pas 'TRANSFERT_POINT_2D(...)' car 'vecteurs_____cursor_3D' est tridimensionnel. */ \
                         INITIALISATION_POINT_2D(coin_inferieur_gauche,Xmin,Ymin);                                                      \
                                        /* Definition du coin inferieur gauche de remplissage,                                       */ \
                         INITIALISATION_POINT_2D(coin_superieur_droite,Xmax,Ymax);                                                      \
                                        /* Definition du coin superieur droite de remplissage.                                       */ \
                         CALS(Iremplissage(ImageR                                                                                       \
                                          ,ImageR                                                                                       \
                                          ,ADRESSE(point_de_depart)                                                                     \
                                          ,ADRESSE(coin_inferieur_gauche)                                                               \
                                          ,ADRESSE(coin_superieur_droite)                                                               \
                                          ,fond,bord                                                                                    \
                                          ,VRAI,VRAI,VRAI,VRAI                                                                          \
                                          ,FAUX,FAUX,FAUX,FAUX                                                                          \
                                          ,couleur                                                                                      \
                                           )                                                                                            \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Remplissage du contour repere par 'contexte' avec 'couleur' dans 'ImageR'.                */
#define   GET_POINT_COURANT                                                                                                             \
                    Bblock                                                                                                              \
                    GET_CURSOR(ASD1(pointF_courant,x),ASD1(pointF_courant,y),ASD1(pointF_courant,z));                                   \
                    Eblock                                                                                                              \
                                        /* Recuperation du curseur courant dans [0,1]...                                             */
#define   dZ0                                                                                                                           \
                    FZERO                                                                                                               \
                                        /* Pour contenir les arcs de courbe dans le plan (OX,OY).                                    */
#define   dZn                                                                                                                           \
                    FZERO                                                                                                               \
                                        /* Pour contenir les arcs de courbe dans le plan (OX,OY).                                    */
#define   SET_ORIGINE(dX0,dY0)                                                                                                          \
                    Bblock                                                                                                              \
                    GET_POINT_COURANT;                                                                                                  \
                    TRANSFERT_POINT_3D(pointF_origine,pointF_courant);                                                                  \
                    INITIALISATION_ACCROISSEMENT_3D(derivee_a_l_origine                                                                 \
                                                   ,MUL2(DELTA_AXE(vecteurs_____scale_OX,dX0),tension_des_arcs)                         \
                                                   ,MUL2(DELTA_AXE(vecteurs_____scale_OY,dY0),tension_des_arcs)                         \
                                                   ,MUL2(DELTA_AXE(vecteurs_____scale_OZ,dZ0),tension_des_arcs)                         \
                                                    );                                                                                  \
                    Eblock                                                                                                              \
                                        /* Definition du point origine.                                                              */
#define   SET_EXTREMITE(dXn,dYn)                                                                                                        \
                    Bblock                                                                                                              \
                    GET_POINT_COURANT;                                                                                                  \
                    TRANSFERT_POINT_3D(pointF_extremite,pointF_courant);                                                                \
                    INITIALISATION_ACCROISSEMENT_3D(derivee_a_l_extremite                                                               \
                                                   ,MUL2(DELTA_AXE(vecteurs_____scale_OX,dXn),tension_des_arcs)                         \
                                                   ,MUL2(DELTA_AXE(vecteurs_____scale_OY,dYn),tension_des_arcs)                         \
                                                   ,MUL2(DELTA_AXE(vecteurs_____scale_OZ,dZn),tension_des_arcs)                         \
                                                    );                                                                                  \
                    DRAW_CUBIQUE_2;                                                                                                     \
                    MOVE_ORIGINE;                                                                                                       \
                    Eblock                                                                                                              \
                                        /* Definition du point extremite et trace de l'arc (origine,extremite)...                    */
#define   MOVE_ORIGINE                                                                                                                  \
                    Bblock                                                                                                              \
                    TRANSFERT_POINT_3D(pointF_origine,pointF_extremite);                                                                \
                    TRANSFERT_ACCROISSEMENT_3D(derivee_a_l_origine,derivee_a_l_extremite);                                              \
                    Eblock                                                                                                              \
                                        /* Deplacement de l'origine sur l'extremite precedente.                                      */
#define   DRAW_CUBIQUE_2                                                                                                                \
                    Bblock                                                                                                              \
                    CALS(Ivisualisation_arc_de_cubique_2P2D(ImageG                                                                      \
                                                           ,ADRESSE(pointF_origine)                                                     \
                                                           ,ADRESSE(derivee_a_l_origine)                                                \
                                                           ,niveau_origine                                                              \
                                                           ,ADRESSE(pointF_extremite)                                                   \
                                                           ,ADRESSE(derivee_a_l_extremite)                                              \
                                                           ,niveau_extremite                                                            \
                                                           ,CHOI(_____lNORMALISE_OX(RAYON_DU_POINT)                                     \
                                                                ,_____lNORMALISE_OY(RAYON_DU_POINT)                                     \
                                                                 )                                                                      \
                                                           ,AFFAIBLISSEMENT_AU_BORD                                                     \
                                                           ,TRI_DIMENSIONNEL                                                            \
                                                            )                                                                           \
                         );                                                                                                             \
                    Eblock                                                                                                              \
                                        /* Trace de l'arc de cubique...                                                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   PENTE_DES_ARCS                                                                                                                \
                    FU                                                                                                                  \
                                        /* Pour definir les derivees a l'origine et a l'extremite.                                   */
#define   TENSION_DES_ARCS                                                                                                              \
                    FLOT(CINQ)                                                                                                          \
                                        /* Plus cette valeur est proche de 1 et plus les courbes sont tendues et proches de lignes   */ \
                                        /* droites. Plus cette valeur est grande, et plus, les courbes sont courbes...               */
#define   NIVEAU_DU_CONTOURS_DU_SIGLE                                                                                                   \
                    BLANC                                                                                                               \
                                        /* Niveau de trace des contours du sigle.                                                    */
#define   RAYON_DU_POINT                                                                                                                \
                    DEUX                                                                                                                \
                                        /* Rayon du point representatif.                                                             */
#define   AFFAIBLISSEMENT_AU_BORD                                                                                                       \
                    FU                                                                                                                  \
                                        /* Afin de faire un degrade du centre vers le bord...                                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D U   S I G L E   " D E N I A U - C O N S E I L S "  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
     DEFV(pointF_2D,point_de_depart);
                                        /* Point de depart du remplissage d'un contour.                                              */
     DEFV(pointF_2D,coin_inferieur_gauche);
                                        /* Coin inferieur gauche de la zone de remplissage,                                          */
     DEFV(pointF_2D,coin_superieur_droite);
                                        /* Coin superieur droite de la zone de remplissage.                                          */
     DEFV(Logical,DTb1(fond,COULEURS));
                                        /* Definition du "fond" de l'image,                                                          */
     DEFV(Logical,DTb1(bord,COULEURS));
                                        /* Definition du "bord" d'un contour.                                                        */
     DEFV(pointF_3D,pointF_courant);
                                        /* Definition du point courant.                                                              */
     DEFV(pointF_3D,pointF_origine);
     DEFV(pointF_3D,pointF_extremite);
                                        /* Definition des points origines et extremite de l'arc de cubique.                          */
     DEFV(deltaF_3D,derivee_a_l_origine);
     DEFV(deltaF_3D,derivee_a_l_extremite);
                                        /* Definition des vecteurs derivees a l'origine et a l'extremite.                            */
     DEFV(genere_p,INIT(niveau_origine,NIVEAU_UNDEF));
     DEFV(genere_p,INIT(niveau_extremite,NIVEAU_UNDEF));
                                        /* Niveaux origine et extremite du trace d'un arc de cubique...                              */
     DEFV(Logical,INIT(remplir_les_contours,VRAI));
                                        /* Indique s'il faut ('VRAI') ou pas ('FAUX') remplir les contours...                        */
     DEFV(Float,INIT(tension_des_arcs,TENSION_DES_ARCS));
                                        /* Definition de la tension des arcs de cubique ; plus cette valeur est proche de 1 et       */
                                        /* plus les courbes sont tendues et proches de lignes droites. Plus cette valeur est         */
                                        /* grande, et plus, les courbes sont courbes...                                              */
     /*..............................................................................................................................*/
     GET_ARGUMENTSv(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("SX_SY_SZ_____compatibilite_20070416=""compatibilite_20070416="
                                       ,SX_SY_SZ_____compatibilite_20070416
                                        );
                                        /* Parametre introduit le 20070416161448...                                                  */
                         GET_ARGUMENT_L("Ipoint_anti_aliase_segment_____compatibilite_20110420=""compatibilite_20110420="
                                       ,Ipoint_anti_aliase_segment_____compatibilite_20110420
                                        );
                                        /* Parametre introduit le 20110420145120...                                                  */

                         GET_ARGUMENT_C("imageR=""R=",nom_imageR);
                         GET_ARGUMENT_F("tension=""t=",tension_des_arcs);
                         GET_ARGUMENT_L("remplir=""r=",remplir_les_contours);
                         )
                    );

     CALi(Inoir(ImageR));
                                        /* R  : futur resultat.                                                                      */

     BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
          Bblock
          EGAL(ITb1(fond,INDX(niveau,NOIR)),FAUX);
          EGAL(ITb1(bord,INDX(niveau,NOIR)),VRAI);
          Eblock
     EBoI
     EGAL(ITb1(fond,INDX(NOIR,NOIR)),VRAI);
     EGAL(ITb1(bord,INDX(NOIR,NOIR)),FAUX);
                                        /* Initialisation du remplisseur de contour.                                                 */

     CALS(FgERASE());
                                        /* Clear...                                                                                  */
     SET_COULEURS(NOIR,BLANC);
     SET_ANTI_ALIASING(FAUX);
     SK(4);
                                        /* Definition de l'echelle globale.                                                          */
     SX(8);
                                        /* Definition de l'echelle sur l'axe des 'X'.                                                */
     SY(8);
                                        /* Definition de l'echelle sur l'axe des 'Y'.                                                */
     SZ(8);
                                        /* Definition de l'echelle sur l'axe des 'Z'.                                                */
     gA;DO(1,BLOC(g1;));gA;
     gA;DO(1,BLOC(g2;));gA;
                                        /* Positionnement au point de reference du sigle.                                            */
     SK(2);
                                        /* Definition de l'echelle globale.                                                          */
     SX(8);
                                        /* Definition de l'echelle sur l'axe des 'X'.                                                */
     SY(8);
                                        /* Definition de l'echelle sur l'axe des 'Y'.                                                */
     SZ(8);
                                        /* Definition de l'echelle sur l'axe des 'Z'.                                                */
     WCG(vecteurs_____Gcon_00);
                                        /* Point de reference general...                                                             */

     SET_COULEURS(NOIR,NIVEAU_DU_CONTOURS_DU_SIGLE);
                                        /* Choix de la couleur du contour du sigle.                                                  */
     EGAL(niveau_origine,NIVEAU_DU_CONTOURS_DU_SIGLE);
     EGAL(niveau_extremite,NIVEAU_DU_CONTOURS_DU_SIGLE);
                                        /* Niveaux origine et extremite du trace d'un arc de cubique...                              */

     SET_ORIGINE(PENTE_DES_ARCS,PENTE_DES_ARCS);
     gA;DO(GRANDE_DIMENSION,BLOC(g1;g2;));gA;
     SET_EXTREMITE(PENTE_DES_ARCS,PENTE_DES_ARCS);
     gA;DO(MOYENNE_DIMENSION,BLOC(g1;));gA;
     gA;DO(PETITE_DIMENSION,BLOC(g2;));gA;
     SET_EXTREMITE(PENTE_DES_ARCS,FZERO);
     gA;DO(MOYENNE_DIMENSION,BLOC(g1;g4;));gA;
     SET_EXTREMITE(FZERO,NEGA(PENTE_DES_ARCS));
     gA;DO(MOYENNE_DIMENSION,BLOC(g3;g4;));gA;
     SET_EXTREMITE(NEGA(PENTE_DES_ARCS),FZERO);
     gA;DO(MOYENNE_DIMENSION,BLOC(g3;g2;));gA;
     SET_EXTREMITE(FZERO,PENTE_DES_ARCS);
     gA;DO(GRANDE_DIMENSION,BLOC(g2;));gA;
     SET_EXTREMITE(FZERO,PENTE_DES_ARCS);
     gA;DO(PETITE_DIMENSION,BLOC(g3;g2;));gA;
     SET_EXTREMITE(NEGA(PENTE_DES_ARCS),FZERO);
     gA;DO(PETITE_DIMENSION,BLOC(g3;g4;));gA;
     SET_EXTREMITE(FZERO,NEGA(PENTE_DES_ARCS));
     gA;DO(PETITE_DIMENSION,BLOC(g1;));gA;
     gA;DO(TRES_PETITE_DIMENSION,BLOC(g4;));gA;
     SET_EXTREMITE(PENTE_DES_ARCS,FZERO);

     CALS(Imove(ImageR,ImageG));

     CALi(Iupdate_image(nom_imageR,ImageR));

     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.