_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   G R A P H I Q U E S  :                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Dans ce fichier se trouvent toutes                                                                             */
/*                  les fonctions et les macros utiles                                                                               */
/*                  pour tracer des vecteurs dans des images                                                                         */
/*                  raster.                                                                                                          */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiii/vecteurs$FON' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O M P A T I B I L I T E   A N T E R I E U R E  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(SX_SY_SZ_____compatibilite_20070416,FAUX)));
                                        /* Introduit le 20070416154721 a cause du probleme 'v $xiii/vecteurs$DEF 20070416150831'...  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O T I O N   D E   " C A D R E "  :                                                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    On appelle "cadre" courant, une                                                                                */
/*                  fenetre definie par (Xgauche,Xdroite,Yinferieur,Ysuperieur)                                                      */
/*                  dans l'espace [Xmin,Xmax][Ymin,Ymax]                                                                             */
/*                  initialisee telle qu'elle n'existe                                                                               */
/*                  pas. Il peut etre redefini                                                                                       */
/*                  a tout moment par 'SET_CADRE', mais                                                                              */
/*                  de plus, lors du marquage d'un point                                                                             */
/*                  appartenant a un vecteur 2D, on                                                                                  */
/*                  regarde si ses coordonnee {X,Y}                                                                                  */
/*                  sortent du cadre courant ; si oui,                                                                               */
/*                  on modifie ce dernier, afin qu'il                                                                                */
/*                  englobe ce nouveau point.                                                                                        */
/*                                                                                                                                   */
/*                    Ainsi, lorsque ces valeurs ont ete                                                                             */
/*                  prealablement correctement initialisees,                                                                         */
/*                  on peut savoir a l'interieur de quel                                                                             */
/*                  "cadre" se trouve un vecteur donne.                                                                              */
/*                                                                                                                                   */
/*                    L'initialisation correct de ce                                                                                 */
/*                  cadre se fait par :                                                                                              */
/*                                                                                                                                   */
/*                  INITIALISATION_CADRE;                                                                                            */
/*                                                                                                                                   */
/*                  et son positionnement par :                                                                                      */
/*                                                                                                                                   */
/*                  SET_CADRE(Xgauche,Xdroite,Yinferieur,Ysuperieur);                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Int,ZINT(Ipoint_segment_____cadre_Xgauche,X_gauche_implicite)));
                                        /* Definition de la gauche du "cadre",                                                       */
DEFV(Common,DEFV(Int,ZINT(Ipoint_segment_____cadre_Xdroite,X_droite_implicite)));
                                        /* Definition de la droite du "cadre",                                                       */
DEFV(Common,DEFV(Int,ZINT(Ipoint_segment_____cadre_Yinferieur,Y_inferieur_implicite)));
                                        /* Definition de l'inferieur du "cadre",                                                     */
DEFV(Common,DEFV(Int,ZINT(Ipoint_segment_____cadre_Ysuperieur,Y_superieur_implicite)));
                                        /* Definition du superieur du "cadre",                                                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O T I O N   D E   " D E P T H - C U E I N G "  :                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    le niveau lumineux impose a                                                                                    */
/*                  chaque point d'un vecteur peut                                                                                   */
/*                  etre module par la profondeur 'Z',                                                                               */
/*                  c'est le "depth-cueing".                                                                                         */
/*                    Il est controle par une va-                                                                                    */
/*                  riable 'Ipoint_segment_____taux_depth_cueing',                                                                   */
/*                  qui appartient a [0,1] ; la                                                                                      */
/*                  valeur '0' correspond a l'absence                                                                                */
/*                  de "depth-cueing", alors qu'avec                                                                                 */
/*                  la valeur '1', le phenomene est                                                                                  */
/*                  maximale.                                                                                                        */
/*                                                                                                                                   */
/*                  SET_DEPTH_CUEING(taux,Ipoint_segment_____Zed_min,Ipoint_segment_____Zed_max);                                    */
/*                                                                                                                                   */
/*                  permet de fixer le taux, ainsi que                                                                               */
/*                  les bornes de variation de la                                                                                    */
/*                  coordonnee 'Z'...                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Float,ZINT(Ipoint_segment_____Zed_min,MOIT(F_MOINS_L_INFINI))));
                                        /* Definition de la valeur minimale de 'Z'. On notera le 'MOIT(...)' destine a eviter        */
                                        /* des problemes du type :                                                                   */
                                        /*                                                                                           */
                                        /*                  Floating point exception                                                 */
                                        /*                                                                                           */
                                        /* lors du calcul de :                                                                       */
                                        /*                                                                                           */
                                        /*                  SOUS(Ipoint_segment_____Zed_max,Ipoint_segment_____Zed_min)              */
                                        /*                                                                                           */
                                        /* dans la procedure :                                                                       */
                                        /*                                                                                           */
                                        /*                  DEPTH_CUEING(niveau,profondeur)                                          */
                                        /*                                                                                           */
                                        /* ci-dessous...                                                                             */
                                        /*                                                                                           */
                                        /* ATTENTION, il y avait autrefois :                                                         */
                                        /*                                                                                           */
                                        /*        DEFV(Common,DEFV(Float,INIT(Ipoint_segment_____Zed_min,MOINS_L_INFINI)));          */
                                        /*                                                                                           */
                                        /* pour eviter simplement le probleme evoque ci-dessus...                                    */
DEFV(Common,DEFV(Float,ZINT(Ipoint_segment_____Zed_max,MOIT(F_INFINI))));
                                        /* Definition de la valeur maximale de 'Z'. On notera le 'MOIT(...)' destine a eviter        */
                                        /* des problemes du type :                                                                   */
                                        /*                                                                                           */
                                        /*                  Floating point exception                                                 */
                                        /*                                                                                           */
                                        /* lors du calcul de :                                                                       */
                                        /*                                                                                           */
                                        /*                  SOUS(Ipoint_segment_____Zed_max,Ipoint_segment_____Zed_min)              */
                                        /*                                                                                           */
                                        /* dans la procedure :                                                                       */
                                        /*                                                                                           */
                                        /*                  DEPTH_CUEING(niveau,profondeur)                                          */
                                        /*                                                                                           */
                                        /* ci-dessous...                                                                             */
                                        /*                                                                                           */
                                        /* ATTENTION, il y avait autrefois :                                                         */
                                        /*                                                                                           */
                                        /*                  DEFV(Common,DEFV(Float,INIT(Ipoint_segment_____Zed_max,INFINI)));        */
                                        /*                                                                                           */
                                        /* pour eviter simplement le probleme evoque ci-dessus...                                    */
                                        /*                                                                                           */
                                        /* On notera que 'Ipoint_segment_____Zed_min' et 'Ipoint_segment_____Zed_max' ne peuvent     */
                                        /* etre egales afin d'eviter des divisions par 0 la premiere fois que 'DEPTH_CUEING(...)'    */
                                        /* est utilisee...                                                                           */
DEFV(Common,DEFV(Float,ZINT(Ipoint_segment_____taux_depth_cueing,PAS_DE_DEPTH_CUEING)));
                                        /* Definition du taux de "depth-cueing" ; la valeur initiale est telle                       */
                                        /* qu'il n'y en aura pas...                                                                  */
                                        /* ATTENTION, nota important : la variable 'noir_plancher_des_vecteurs' (niveau minimal      */
                                        /* utilise lors du marquage des points d'un vecteur ; cette variable est introduite pour     */
                                        /* permettre une generation correcte des mires de barres) se situe dans le fichier           */
                                        /* '$xiii/Images$STR' et non pas dans '$xiii/vecteurs$FON' car en effet elle est referencee  */
                                        /* d'une part par 'SET_FILTRAGE(INACTIF)' et d'autre part par la fonction "incontournable"   */
                                        /* 'Nsubstitution(...)' via la procedure 'CAS_ACCES_LISTE_DE_SUBSTITUTION(...)' ; ainsi      */
                                        /* cette variable est positionnee meme si les fonctions vectorielles ne sont par utilisees.  */
#define   DEPTH_CUEING(niveau,profondeur)                                                                                               \
                    COND(IFEQ(niveau,NOIR)                                                                                              \
                        ,niveau                                                                                                         \
                        ,MAX2(MUL2(COMP(SCAL(Ipoint_segment_____taux_depth_cueing                                                       \
                                            ,SOUS(Ipoint_segment_____Zed_max,Ipoint_segment_____Zed_min)                                \
                                            ,SOUS(Ipoint_segment_____Zed_max                                                            \
                                                 ,COND(IFLT(profondeur,Ipoint_segment_____Zed_min)                                      \
                                                      ,Ipoint_segment_____Zed_min                                                       \
                                                      ,COND(IFGT(profondeur,Ipoint_segment_____Zed_max)                                 \
                                                           ,Ipoint_segment_____Zed_max                                                  \
                                                           ,FLOT(profondeur)                                                            \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                  ,niveau                                                                                               \
                                   )                                                                                                    \
                             ,noir_plancher_des_vecteurs                                                                                \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Modulation de 'niveau' par la 'profondeur' ; on notera que sauf si                        */ \
                                        /* le 'niveau' argument est 'NOIR', le niveau calcule apres "depth-                          */ \
                                        /* cueing" est seuille par 'noir_plancher_des_vecteurs'.                                     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A T T R I B U T S   V A R I A B L E S   D ' U N   V E C T E U R  :                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    A l'origine et a l'extremite                                                                                   */
/*                  d'un vecteur plan, on attache                                                                                    */
/*                  un attribut dit "origine" et                                                                                     */
/*                  "extremite" ; un coefficient                                                                                     */
/*                  barycentrique "lambda" varie                                                                                     */
/*                  dans [0,1] lors du balayage                                                                                      */
/*                  du vecteur. Ainsi, au point                                                                                      */
/*                  courant du vecteur est associe                                                                                   */
/*                  un attribut variable ayant pour                                                                                  */
/*                  valeur :                                                                                                         */
/*                                                                                                                                   */
/*                  BARY(origine,extremite,lambda),                                                                                  */
/*                                                                                                                                   */
/*                  avec comme application la gestion                                                                                */
/*                  de l'elimination des parties                                                                                     */
/*                  cachees pour les vecteurs 3D ;                                                                                   */
/*                  l'attribut est alors la troisieme                                                                                */
/*                  dimension 'Z'.                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Float,INIT(IIsegment_____attribut_origine,FLOT__UNDEF)));
                                        /* Valeur de l'attribut a l'origine d'un vecteur 2D,                                         */
DEFV(Common,DEFV(Float,INIT(IIsegment_____attribut_extremite,FLOT__UNDEF)));
                                        /* Valeur de l'attribut a l'extremite d'un vecteur 2D.                                       */
DEFV(Common,DEFV(Float,INIT(IIsegment_____attribut_intermediaire,FLOT__UNDEF)));
                                        /* Coefficient barycentrique de parcours de [origine,extremite].                             */
#define   coordonnee_Z                                                                                                                  \
                    BARY(IIsegment_____attribut_origine,IIsegment_____attribut_extremite,IIsegment_____attribut_intermediaire)          \
                                        /* Definition de la troisieme coordonnee.                                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D E S   C O O R D O N N E E S   B I D I M E N S I O N N E L L E S   E T   D U   N I V E A U  :             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_coordonnees_X_Y_et_les_niveaux,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_coordonnees_X_Y_en_entiers,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_points_hors_image,VRAI)));
                                        /* Introduit le 20230511092206 pour 'v $xci/message$K editer_les_coordonnees_X_Y' et         */
                                        /* modifie le 20230517092722 afin de pouvoir editer memes les points hors-image...           */
#define   EDITION_DES_VECTEURS_BIDIMENSIONNELS(editer,Xf,Yf,X,Y,niveau)                                                                 \
                                        /* Les arguments {Xf,Yf} ont ete introduits le 20230520102205 pour 'v $xiirv/PEAN.P1'...     */ \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_coordonnees_X_Y_et_les_niveaux))                   \
                                        /* Possibilite introduite le 20230511092206...                                               */ \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(editer))                                                                                          \
                                        /* Possibilite introduite le 20230517092722...                                               */ \
                              Bblock                                                                                                    \
                              Test(IL_FAUT(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_coordonnees_X_Y_en_entiers))             \
                                        /* Possibilite introduite le 20230520102205...                                               */ \
                                   Bblock                                                                                               \
                                   CAL3(Prme3("X=%d Y=%d N=%d\n",X,Y,niveau));                                                          \
                                        /* On notera que malheureusement ce sont les coordonnees bidimensionnelles entieres {X,Y}    */ \
                                        /* qui sont editees. En effet, il est impossible d'en faire de meme avec les coordonnees     */ \
                                        /* tridimensionnelles flottantes {Xf,Yf,Zf} car, en effet, ces dernieres ne sont utilisees   */ \
                                        /* que pour les extremites des vecteurs et non point pour les points interpoles entre elles. */ \
                                        /* L'interpolation porte sur les projections 'Projection_O?(...)' et donc sur des points     */ \
                                        /* bidimensionnels...                                                                        */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   CAL3(Prme3("X=%+.^^^ Y=%+.^^^ N=%d\n",Xf,Yf,niveau));                                                \
                                        /* L'edition flottante a ete introduite le 20230520102205 pour 'v $xiirv/PEAN.P1'...         */ \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition conditionnelle des points bidimensionnels et de leur niveau...                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E G R A D E   D E S   N I V E A U X   L E   L O N G   D ' U N   V E C T E U R  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(genere_p,ZINT(fonction_interpolation_degrade_des_vecteurs_____niveau_de_NOIR_du_degrade_d_un_vecteur,NOIR)));
                                        /* Niveau minimal utilise par la fonction 'fonction_interpolation_degrade_des_vecteurs()'.   */

#define   store_point_vector(valeur,imageR,Xf,Yf,X,Y,Vf)                                                                                \
                    Bblock                                                                                                              \
                    DEFV(genere_p,INIT(valeur_effective,APPLY(degrade_des_vecteurs,valeur)));                                           \
                                                                                                                                        \
                    EDITION_DES_VECTEURS_BIDIMENSIONNELS(NOTL(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_points_hors_image)    \
                                                        ,Xf,Yf                                                                          \
                                                        ,X,Y                                                                            \
                                                        ,valeur_effective                                                               \
                                                         );                                                                             \
                                                                                                                                        \
                    store_point_valide(valeur_effective,imageR,X,Y,Vf);                                                                 \
                    Eblock                                                                                                              \
                                        /* Rangement d'un point graphique avec application de l'apply de degrade.                    */

BFonctionP

DEFV(Common,DEFV(FonctionP,fAPPLY_____fonction_neutre_____degrade_des_vecteurs(niveau)))
                                        /* Le 20101222201837 "fAPPLY_____" a ete ajoute pour 'v $xcg/LArgTypFo$vv$Z 20101222210652'. */
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Niveau a laisser intact.                                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(NEUT(niveau));
     Eblock

EFonctionP

BFonctionP

DEFV(Common,DEFV(FonctionP,fAPPLY_____fonction_interpolation_____degrade_des_vecteurs(niveau)))
                                        /* Le 20101222201837 "fAPPLY_____" a ete ajoute pour 'v $xcg/LArgTypFo$vv$Z 20101222210652'. */
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Niveau maximum, l'interpolation ayant lieu entre 'NOIR' et 'niveau' suivant la            */
                                        /* coordonnee barycentrique 'IIsegment_____attribut_intermediaire'.                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(BARY(fonction_interpolation_degrade_des_vecteurs_____niveau_de_NOIR_du_degrade_d_un_vecteur
              ,niveau
              ,IIsegment_____attribut_intermediaire
               )
          );
     Eblock

EFonctionP

BPointeurFonctionP

DEFINITION_D_UN_APPLY(degrade_des_vecteurs,PointeurFonctionP,fonction_neutre);  /* Common,DEFV(Fonction,) : degrade des vecteurs.    */
                                        /* definition de l'apply relatif au degrade des vecteurs.                                    */
                                        /*                                                                                           */
                                        /* Le passage de 'genere_p' a 'FonctionP' a eu lieu le 20040619105717 afin de permettre, en  */
                                        /* 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', le traitement de           */
                                        /* l'argument d'une telle fonction par 'v $xcc/cpp$Z 20040618143320'.                        */
                                        /*                                                                                           */
                                        /* Le 20101222152407, "Common,DEFV(Fonction,) :" a remplace "Common :" errone...             */

EPointeurFonctionP

                                        /* Ceci a ete introduit le 20051125212447 ('v $xcc/cpp$Z .xccp.PASSE_4.NomF')...             */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M I S E   A   J O U R   D U   C A D R E  :                                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   mise_a_jour_du_cadre(x,y)                                                                                                     \
                    Bblock                                                                                                              \
                    EGAL(Ipoint_segment_____cadre_Xgauche,MIN2(Ipoint_segment_____cadre_Xgauche,x));                                    \
                    EGAL(Ipoint_segment_____cadre_Xdroite,MAX2(Ipoint_segment_____cadre_Xdroite,x));                                    \
                    EGAL(Ipoint_segment_____cadre_Yinferieur,MIN2(Ipoint_segment_____cadre_Yinferieur,y));                              \
                    EGAL(Ipoint_segment_____cadre_Ysuperieur,MAX2(Ipoint_segment_____cadre_Ysuperieur,y));                              \
                    Eblock                                                                                                              \
                                        /* Mise a jour du cadre courant pour le point {x,y}.                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A C E   D ' U N   P O I N T   A N T I _ A L I A S E   D ' U N   V E C T E U R   2 D   Q U E L C O N Q U E  :           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(Logical,SINT(Ipoint_anti_aliase_segment_____compatibilite_20110420,FAUX)));
                                        /* Permet de generer des images suivant la methode anterieure au 20110420120752 en           */
                                        /* ce qui concerne l'anti-aliasing...                                                        */

DEFV(Local,DEFV(FonctionI,Ipoint_anti_aliase_segment(intensite_minimale,intensite_maximale
                                                    ,amplitude_intensite
                                                    ,imageAR
                                                    ,Xf,Yf
                                                    ,X,Y
                                                    ,coefficient_de_pente
                                                     )
                )
     )
DEFV(Argument,DEFV(genere_p,intensite_minimale));
                                        /* Intensite lumineuse minimale du point lors d'un trace anti-aliasing,                      */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
                                        /* Intensite lumineuse du point s'il n'y a pas d'anti-aliasing de demande,                   */
                                        /* et sinon, intensite lumineuse maximale.                                                   */
DEFV(Argument,DEFV(Int,amplitude_intensite));
                                        /* Donne la difference intensite_maximale - intensite_minimale pour les                      */
                                        /* traces anti-aliasing.                                                                     */
DEFV(Argument,DEFV(image,imageAR));
                                        /* Image a la fois Argument et Resultat...                                                   */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
                                        /* Coordonnees flottantes 'Xf' et 'Yf' (introduites le 20230520102205).                      */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
                                        /* Coordonnees entieres 'X' et 'Y'.                                                          */
DEFV(Argument,DEFV(Float,coefficient_de_pente));
                                        /* Coefficient de ponderation des niveaux compris dans [0,1] permettant de                   */
                                        /* mettre en place des niveaux d'anti-aliasing.                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     DEFV(Float,INIT(niveau_du_point,ADD2(intensite_minimale,MUL2(coefficient_de_pente,amplitude_intensite))));
                                        /*  niveau provisoire a attribuer au point courant.                                          */
     DEFV(Float,INIT(niveau_anterieur,FLOT(loadS_point_valide(imageAR,X,Y))));
                                        /* Niveau present anterieurement au marquage demande.                                        */
     DEFV(Float,INIT(niveau_interpole,FLOT__NIVEAU_UNDEF));
     DEFV(genere_p,INIT(niveau_effectif,NIVEAU_UNDEF));
     /*..............................................................................................................................*/
     EGAL(niveau_interpole
         ,MUL2(COND(IFOU(IFET(IL_FAUT(Ipoint_anti_aliase_segment_____compatibilite_20110420)
                             ,IFEQ(niveau_anterieur,niveau_du_point)
                              )
                        ,IFET(IL_NE_FAUT_PAS(Ipoint_anti_aliase_segment_____compatibilite_20110420)
                             ,IFEQ_a_peu_pres_absolu(niveau_anterieur,niveau_du_point,UN_MOINS_EPSILON)
                              )
                         )
                   ,NOIR
                   ,niveau_anterieur
                    )
              ,COMP(coefficient_de_pente)
               )
          );
                                        /* Le 20110420120752 fut introduit le 'IFEQ_a_peu_pres_absolu(...)' car, en effet, le        */
                                        /* niveau 'niveau_du_point' est un nombre flottant qui peut avoir une partie decimale a      */
                                        /* cause du 'MUL2(...)', alors que 'niveau_anterieur' est un nombre flottant qui egal a      */
                                        /* un nombre entier puisqu'il vient de 'imageAR' qui est de type 'image'...                  */
     EGAL(niveau_effectif
         ,GENP(ARRO(COND(IFEQ(intensite_minimale,NOIR)
                         ,ADD2(niveau_interpole,niveau_du_point)
                         ,niveau_du_point
                          )
                     )
                )
          );

     EDITION_DES_VECTEURS_BIDIMENSIONNELS(NEUTL(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_points_hors_image)
                                         ,Xf,Yf
                                         ,X,Y
                                         ,niveau_effectif
                                          );
                                        /* L'introduction le 20230517092722 de la possibilite d'editer meme les points hors-image    */
                                        /* a contraint de sortir de 'TEST_Z_Buffer_(...)' la definition de 'niveau_interpole' et     */
                                        /* de 'niveau_effectif' ; ils sont donc calcules meme s'ils sony finalement inutiles...      */

     TEST_Z_Buffer_(X,Y,coordonnee_Z
                   ,BLOC(
                         mise_a_jour_du_cadre(X,Y);

                         store_point_vector(niveau_effectif
                                           ,imageAR
                                           ,Xf,Yf
                                           ,X,Y
                                           ,FVARIABLE
                                            );
                                        /* On notera que le niveau final du point {X,Y} est aux "COND(...)'s pres de la forme :      */
                                        /*                                                                                           */
                                        /*                  BARY(niveau_anterieur,intensite_maximale,coefficient_de_pente)           */
                                        /*                                                                                           */
                         )
                    );
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A C E   D ' U N   P O I N T   D ' U N   V E C T E U R   2 D   Q U E L C O N Q U E  :                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(Logical,SINT(Ipoint_segment_____si__anti_aliasing__entourer_meme_les_points_non_isoles,FAUX)));
                                        /* Ceci fut introduit le 20110501171130 pour 'v $xiia/ESCA.E1' afin de faire des points      */
                                        /* NOIRs en petit nombre qui apparaissaient...                                               */

#define   marque_point_anti_aliase(xf,yf,x,y,coefficient_de_pente)                                                                      \
                    Bblock                                                                                                              \
                    CALS(Ipoint_anti_aliase_segment(intensite_minimale,intensite_maximale                                               \
                                                   ,amplitude_intensite                                                                 \
                                                   ,imageAR                                                                             \
                                                   ,xf,yf                                                                               \
                                                   ,x,y                                                                                 \
                                                   ,coefficient_de_pente                                                                \
                                                    )                                                                                   \
                         );                                                                                                             \
                    Eblock

#define   pente_faible                                                                                                                  \
                    IZEQ(indicateur_de_pente)
#define   pente_forte                                                                                                                   \
                    IZGT(indicateur_de_pente)

DEFV(Local,DEFV(FonctionI,Ipoint_segment(intensite_minimale,intensite_maximale
                                        ,amplitude_intensite
                                        ,imageAR
                                        ,Xf,Yf
                                        ,point_isole
                                        ,pente,ordonnee_a_l_origine
                                        ,anti_aliasing
                                        ,ARGUMENT_POINTEUR(liste_des_vecteurs_____pointilles)
                                         )
                )
     )
DEFV(Argument,DEFV(genere_p,intensite_minimale));
                                        /* Intensite lumineuse minimale du point lors d'un trace anti-aliasing,                      */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
                                        /* Intensite lumineuse du point s'il n'y a pas d'anti-aliasing de demande,                   */
                                        /* et sinon, intensite lumineuse maximale.                                                   */
DEFV(Argument,DEFV(Int,amplitude_intensite));
                                        /* Donne la difference intensite_maximale - intensite_minimale pour les                      */
                                        /* traces anti-aliasing.                                                                     */
DEFV(Argument,DEFV(image,imageAR));
                                        /* Image a la fois Argument et Resultat...                                                   */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
                                        /* Coordonnees flottantes du point a marquer.                                                */
DEFV(Argument,DEFV(Logical,point_isole));
                                        /* Indique si le trace se reduit a un point isole ('VRAI') ou pas ('FAUX').                  */
DEFV(Argument,DEFV(Float,pente));
                                        /* Pente 'A' de la droite Y=A.X+B support du point a tracer,                                 */
DEFV(Argument,DEFV(Float,ordonnee_a_l_origine));
                                        /* Et son ordonnee a l'origine 'B'.                                                          */
DEFV(Argument,DEFV(Logical,anti_aliasing));
                                        /* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX').                    */
DEFV(Argument,DEFV(binaire,POINTEUR(liste_des_vecteurs_____pointilles)));
                                        /* Cette liste subit a chaque sortie de cette fonction un decalage circulaire                */
                                        /* apres le trace de chaque nouveau point ; le bit de signe correspond a chaque              */
                                        /* instant au point courant {X,Y} : lorsqu'il est a 1, le point est marque,                  */
                                        /* s'il est a 0, il est ignore. Ainsi, on peut faire des vecteurs_____pointilles de forme    */
                                        /* quelconque et de periode 'NBITMO'.                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     DEFV(Int,INIT(X,UNDEF));
     DEFV(Int,INIT(Y,UNDEF));
                                        /* Coordonnees entieres 'X' et 'Y'.                                                          */
     DEFV(Int,INIT(indicateur_de_pente,UNDEF));
                                        /* Cet indicateur indique, lorsqu'un trace anti-aliase est demande,                          */
                                        /* si la pente de la droite support du point est faible (=0), forte (>0)                     */
                                        /* ou enfin si elle est verticale (<0).                                                      */
     DEFV(Float,INIT(coefficient_de_pente,FLOT__UNDEF));
                                        /* Coefficient compris dans [0,1] permettant de ponderer les niveaux voisins.                */
     /*..............................................................................................................................*/
     Test(PRESENT(TBIT(INDIRECT(liste_des_vecteurs_____pointilles),BIT0)))
          Bblock
          Test(EST_VRAI(point_isole))
               Bblock
               EGAL(X,INTE(Xf));
               EGAL(Y,INTE(Yf));
               EGAL(indicateur_de_pente,UNDEF);
               EGAL(coefficient_de_pente,MOIT(FU));
                                        /* Cas des points isoles.                                                                    */
               Eblock
          ATes
               Bblock
               Test(IZEQ(pente))
                    Bblock
                    EGAL(X,INTE(Xf));
                    EGAL(Y,INTE(Yf));
                    EGAL(indicateur_de_pente,ZERO);
                    EGAL(coefficient_de_pente,MOIT(FU));
                                        /* Cas des droites horizontales.                                                             */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFEQ(pente,MOINS_L_INFINI))
                    Bblock
                    EGAL(X,INTE(Xf));
                    EGAL(Y,INTE(Yf));
                    EGAL(indicateur_de_pente,MOINS_L_INFINI);
                    EGAL(coefficient_de_pente,MOIT(FU));
                                        /* Cas des droites verticales.                                                               */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFET(IZNE(pente),IFNE(pente,MOINS_L_INFINI)))
                    Bblock
                                        /* Cas des droites ni horizontales, ni verticales.                                           */
                    EGAL(indicateur_de_pente,INTE(ABSO(pente)));
                    Test(IFEQ(ABSO(pente),DIVI(FLOT(UNITE),FLOT(UNITE))))
                         Bblock
                                        /* Cas des droites dont la pente est a 45 degres ; par la suite, elles seront considerees,   */
                                        /* dans le cas de l'anti-aliasing, comme des droites a forte pente...                        */
                         EGAL(X,ARRO(Xf));
                         EGAL(Y,ARRO(Yf));
                         EGAL(coefficient_de_pente,MOIT(FU));
                         Eblock
                    ATes
                         Bblock
                                        /* Cas des droites qui ne sont pas a 45 degres...                                            */
                         Test(pente_faible)
                              Bblock
                              EGAL(X,ARRO(Xf));
                              EGAL(Y,INTE(Yf));
                              EGAL(coefficient_de_pente,SOUA(FLOT(Y),Yf));
                                        /* Lorsque la pente est faible et non nulle, la ponderation est fonction                     */
                                        /* de l'ordonnee.                                                                            */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes

                         Test(pente_forte)
                              Bblock
                              EGAL(X,INTE(Xf));
                              EGAL(Y,ARRO(Yf));
                              EGAL(coefficient_de_pente,SOUA(FLOT(X),Xf));
                                        /* Lorsque la pente est forte et non infinie, la ponderation est fonction                    */
                                        /* de l'abscisse.                                                                            */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ETes

          EDITION_DES_VECTEURS_BIDIMENSIONNELS(NEUTL(EDITION_DES_VECTEURS_BIDIMENSIONNELS_____editer_les_points_hors_image)
                                              ,Xf,Yf
                                              ,X,Y
                                              ,GENP(intensite_maximale)
                                               );
          TEST_Z_Buffer_(X,Y,coordonnee_Z
                        ,BLOC(mise_a_jour_du_cadre(X,Y);
                              store_point_vector(GENP(intensite_maximale)
                                                ,imageAR
                                                ,Xf,Yf
                                                ,X,Y
                                                ,FVARIABLE
                                                 );
                              )
                         );
                                        /* Trace du point demande, ou du point central dans le cas d'un trace                        */
                                        /* en mode anti-aliasing ; a noter, que ce trace se fait avec gestion                        */
                                        /* du 'Z-Buffer'.                                                                            */
          Test(IL_FAUT(anti_aliasing))
               Bblock
               gPUSH_ECHANTILLONNAGE;
               gSET_ECHANTILLONNAGE(PasX,PasY);
                                        /* A cause des fonctions du type 'SUCY(...)' qui suivent. Ceci a ete introduit le            */
                                        /* 19970912103254 suite a des modifications de 'v $xci/etoile.01$K'                          */

               Test(IFOU(IL_FAUT(Ipoint_segment_____si__anti_aliasing__entourer_meme_les_points_non_isoles)
                        ,EST_VRAI(point_isole)
                         )
                    )
                    Bblock
                                        /* Cas des points isoles : on les entoure completement, en notant que cette possibilite      */
                                        /* fut offerte en option aux autres points le 20110501171130...                              */
                    marque_point_anti_aliase(NEUT(Xf),SUCY(Yf),NEUT(X),SUCY(Y),coefficient_de_pente);
                    marque_point_anti_aliase(PREX(Xf),SUCY(Yf),PREX(X),SUCY(Y),coefficient_de_pente);
                    marque_point_anti_aliase(PREX(Xf),NEUT(Yf),PREX(X),NEUT(Y),coefficient_de_pente);
                    marque_point_anti_aliase(PREX(Xf),PREY(Yf),PREX(X),PREY(Y),coefficient_de_pente);
                    marque_point_anti_aliase(NEUT(Xf),PREY(Yf),NEUT(X),PREY(Y),coefficient_de_pente);
                    marque_point_anti_aliase(SUCX(Xf),PREY(Yf),SUCX(X),PREY(Y),coefficient_de_pente);
                    marque_point_anti_aliase(SUCX(Xf),NEUT(Yf),SUCX(X),NEUT(Y),coefficient_de_pente);
                    marque_point_anti_aliase(SUCX(Xf),SUCY(Yf),SUCX(X),SUCY(Y),coefficient_de_pente);
                    Eblock
               ATes
                    Bblock
                    Test(pente_faible)
                         Bblock
                                        /* Cas des droites de faible pente.                                                          */
                         marque_point_anti_aliase(NEUT(Xf),SUCY(Yf),NEUT(X),SUCY(Y),NEUT(coefficient_de_pente));
                         marque_point_anti_aliase(NEUT(Xf),PREY(Yf),NEUT(X),PREY(Y),COMP(coefficient_de_pente));
                         Eblock
                    ATes
                         Bblock
                                        /* Cas des droites de forte pente.                                                           */
                         marque_point_anti_aliase(SUCX(Xf),NEUT(Yf),SUCX(X),NEUT(Y),NEUT(coefficient_de_pente));
                         marque_point_anti_aliase(PREX(Xf),NEUT(Yf),PREX(X),NEUT(Y),COMP(coefficient_de_pente));
                         Eblock
                    ETes
                    Eblock
               ETes

               gPULL_ECHANTILLONNAGE;
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     EGAL(INDIRECT(liste_des_vecteurs_____pointilles),SCLS(INDIRECT(liste_des_vecteurs_____pointilles),I));

     RETU_ERROR;
     Eblock

#undef    pente_forte
#undef    pente_faible
#undef    marque_point_anti_aliase

EFonctionI

#undef    store_point_vector
#undef    EDITION_DES_VECTEURS_BIDIMENSIONNELS

#undef    mise_a_jour_du_cadre

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A C E   D ' U N   V E C T E U R   2 D   E N T I E R   Q U E L C O N Q U E  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

#define   marque_point(numero_du_point,nombre_de_points)                                                                                \
                    Bblock                                                                                                              \
                    EGAL(IIsegment_____attribut_intermediaire                                                                           \
                        ,DIVZ(FLOT(ABSO(numero_du_point))                                                                               \
                             ,FLOT(ABSO(nombre_de_points))                                                                              \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Calcul du coefficient barycentrique sur le vecteur.                                       */ \
                    EGAL(depth_maximale,DEPTH_CUEING(intensite_maximale,coordonnee_Z));                                                 \
                                        /* Application du "depth-cueing".                                                            */ \
                    Test(IL_FAUT(anti_aliasing))                                                                                        \
                         Bblock                                                                                                         \
                         EGAL(depth_minimale,DEPTH_CUEING(intensite_minimale,coordonnee_Z));                                            \
                                        /* Application du "depth-cueing".                                                            */ \
                         EGAL(amplitude_intensite,INTE(SOUS(depth_maximale,depth_minimale)));                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    CALS(Ipoint_segment(depth_minimale,depth_maximale                                                                   \
                                       ,amplitude_intensite                                                                             \
                                       ,imageAR                                                                                         \
                                       ,Xf,Yf                                                                                           \
                                       ,point_isole                                                                                     \
                                       ,pente,ordonnee_a_l_origine                                                                      \
                                       ,anti_aliasing                                                                                   \
                                       ,ADRESSE(liste_des_vecteurs_____pointilles)                                                      \
                                        )                                                                                               \
                         );                                                                                                             \
                    Eblock

DEFV(Local,DEFV(FonctionI,IIsegment(imageAR
                                   ,ARGUMENT_POINTERs(Ivecteur)
                                   ,vecteurs_____pointilles
                                   ,intensite_minimale,intensite_maximale
                                   ,anti_aliasing
                                   ,attrib_origine,attrib_extremite
                                    )
                )
     )
DEFV(Argument,DEFV(image,imageAR));
                                        /* Image a la fois Argument et Resultat...                                                   */
DEFV(Argument,DEFV(vectorI_2D,POINTERs(Ivecteur)));
                                        /* Vecteur entier argument dont les coordonnees ne sont pas normalisees...                   */
DEFV(Argument,DEFV(binaire,vecteurs_____pointilles));
                                        /* Definit la forme (ou "pattern") de trace des vecteurs en vecteurs_____pointilles ;        */
                                        /* par exemple 'MMOT' permet le trace en traits pleins.                                      */
DEFV(Argument,DEFV(genere_p,intensite_minimale));
                                        /* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing                           */
                                        /* est demande pour ce vecteur.                                                              */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
                                        /* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas                          */
                                        /* demande, et dans le cas contraire, intensite maximale.                                    */
DEFV(Argument,DEFV(Logical,anti_aliasing));
                                        /* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX').                    */
DEFV(Argument,DEFV(Float,attrib_origine));
                                        /* Valeur de l'attribut a l'origine d'un vecteur 2D,                                         */
DEFV(Argument,DEFV(Float,attrib_extremite));
                                        /* Valeur de l'attribut a l'extremite d'un vecteur 2D.                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     DEFV(Float,INIT(Xf,FLOT__UNDEF));
     DEFV(Float,INIT(Yf,FLOT__UNDEF));
                                        /* Coordonnees du point courant a marquer.                                                   */
     DEFV(Int,INIT(index,UNDEF));
                                        /* Index du point courant a marquer.                                                         */
     DEFV(deltaF_2D,accroissement);
                                        /* Donne les accroissements horizontaux et verticaux du vecteur courant.                     */
     DEFV(Float,INIT(nombre_de_pas,FLOT__UNDEF));
                                        /* Donne MAX2(ABSO(ASD1(accroissement,dx)),ABSO(ASD1(accroissement,dy))).                    */
     DEFV(Logical,INIT(point_isole,FAUX));
                                        /* Indique si le trace se reduit a un point isole ('VRAI') ou pas ('FAUX') ;                 */
                                        /* on suppose a priori qu'il ne s'agit pas d'un point isole...                               */
     DEFV(Float,INIT(pente,FLOT__UNDEF));
                                        /* Pente 'A' de la droite Y=A.X+B support du point a tracer,                                 */
     DEFV(Float,INIT(ordonnee_a_l_origine,FLOT__UNDEF));
                                        /* Et son ordonnee a l'origine 'B'.                                                          */
     DEFV(genere_p,INIT(depth_minimale,NIVEAU_UNDEF));
                                        /* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing                           */
                                        /* est demande pour ce vecteur, apres application du "depth-cueing".                         */
     DEFV(genere_p,INIT(depth_maximale,NIVEAU_UNDEF));
                                        /* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas                          */
                                        /* demande, et dans le cas contraire, intensite maximale, apres application                  */
                                        /* du "depth-cueing".                                                                        */
     DEFV(Int,INIT(amplitude_intensite,UNDEF));
                                        /* Donne la difference (depth_maximale-depth_minimale) pour les                              */
                                        /* traces anti-aliasing.                                                                     */
     DEFV(binaire,INIT(liste_des_vecteurs_____pointilles,UNDEF));
                                        /* Afin de permettre l'integrite de la liste des pointilles "vecteurs_____pointilles"        */
                                        /* argument.                                                                                 */
     /*..............................................................................................................................*/
     EGAL(liste_des_vecteurs_____pointilles,vecteurs_____pointilles);
                                        /* Recuperation de la "pattern" des vecteurs_____pointilles, puisqu'en effet la fonction     */
                                        /* ici presente la modifie...                                                                */
     EGAL(IIsegment_____attribut_origine,attrib_origine);
     EGAL(IIsegment_____attribut_extremite,attrib_extremite);
                                        /* Recuperation de l'attribut du vecteur sous la forme [origine,extremite].                  */
     INITIALISATION_ACCROISSEMENT_2D(accroissement
                                    ,FLOT(SOUS(ASI2(Ivecteur,extremite,x),ASI2(Ivecteur,origine,x)))
                                    ,FLOT(SOUS(ASI2(Ivecteur,extremite,y),ASI2(Ivecteur,origine,y)))
                                     );

     Test(IFET(IZEQ(ASD1(accroissement,dx)),IZNE(ASD1(accroissement,dy))))
          Bblock
          EGAL(Xf,FLOT(ASI2(Ivecteur,origine,x)));
                                        /* L'abscisse est constante...                                                               */
          EGAL(pente,MOINS_L_INFINI);
                                        /* Cas des droites verticales ; la pente est initialisee avec cette                          */
                                        /* valeur afin de pouvoir retrouver lors du marquage des points                              */
                                        /* les droites verticales.                                                                   */
          EGAL(ordonnee_a_l_origine,MOINS_L_INFINI);

          Test(IZGE(ASD1(accroissement,dy)))
               Bblock
               DoIn(Yf,FLOT(ASI2(Ivecteur,origine,y)),FLOT(ASI2(Ivecteur,extremite,y)),FLOT(pasY))
                    Bblock
                    marque_point(SOUS(Yf,FLOT(ASI2(Ivecteur,origine,y)))
                                ,FLOT(SOUS(ASI2(Ivecteur,extremite,y),ASI2(Ivecteur,origine,y)))
                                 );
                    Eblock
               EDoI
               Eblock
          ATes
               Bblock
               DoDe(Yf,FLOT(ASI2(Ivecteur,extremite,y)),FLOT(ASI2(Ivecteur,origine,y)),FLOT(pasY))
                    Bblock
                    marque_point(SOUS(Yf,FLOT(ASI2(Ivecteur,origine,y)))
                                ,FLOT(SOUS(ASI2(Ivecteur,extremite,y),ASI2(Ivecteur,origine,y)))
                                 );
                    Eblock
               EDoD
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IZEQ(ASD1(accroissement,dy)))
          Bblock
          EGAL(Yf,FLOT(ASI2(Ivecteur,origine,y)));
                                        /* L'ordonnee est constante...                                                               */
          EGAL(pente,FZERO);
                                        /* Cas des droites horizontales ou des points isoles.                                        */
          EGAL(ordonnee_a_l_origine,FLOT(ASI2(Ivecteur,origine,y)));

          Test(IZEQ(ASD1(accroissement,dx)))
               Bblock
               EGAL(point_isole,VRAI);
                                        /* En fait, la droite horizontale se reduit a un point isole.                                */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IZGE(ASD1(accroissement,dx)))
               Bblock
               DoIn(Xf,FLOT(ASI2(Ivecteur,origine,x)),FLOT(ASI2(Ivecteur,extremite,x)),FLOT(pasX))
                    Bblock
                    marque_point(SOUS(Xf,FLOT(ASI2(Ivecteur,origine,x)))
                                ,FLOT(SOUS(ASI2(Ivecteur,extremite,x),ASI2(Ivecteur,origine,x)))
                                 );
                    Eblock
               EDoI
               Eblock
          ATes
               Bblock
               DoDe(Xf,FLOT(ASI2(Ivecteur,extremite,x)),FLOT(ASI2(Ivecteur,origine,x)),FLOT(pasX))
                    Bblock
                    marque_point(SOUS(Xf,FLOT(ASI2(Ivecteur,origine,x)))
                                ,FLOT(SOUS(ASI2(Ivecteur,extremite,x),ASI2(Ivecteur,origine,x)))
                                 );
                    Eblock
               EDoD
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IZNE(ASD1(accroissement,dx)),IZNE(ASD1(accroissement,dy))))
          Bblock
          EGAL(pente,DIVI(ASD1(accroissement,dy),ASD1(accroissement,dx)));
          EGAL(ordonnee_a_l_origine
              ,SOUS(FLOT(ASI2(Ivecteur,origine,y))
                   ,MUL2(pente,FLOT(ASI2(Ivecteur,origine,x)))
                    )
               );
                                        /* Calcul des caracteristiques de la droite support du segment.                              */
          EGAL(nombre_de_pas
              ,ARRO(MAX2(ABSO(ASD1(accroissement,dx))
                        ,ABSO(ASD1(accroissement,dy))
                         )
                    )
               );

          DoIn(index,ZERO,INTE(nombre_de_pas),I)
               Bblock
               EGAL(Xf
                   ,ADD2(FLOT(ASI2(Ivecteur,origine,x))
                        ,SCAL(ASD1(accroissement,dx)
                             ,nombre_de_pas
                             ,index
                              )
                         )
                    );
               EGAL(Yf
                   ,ADD2(MUL2(pente,Xf)
                        ,ordonnee_a_l_origine
                         )
                    );
               marque_point(index,nombre_de_pas);
               Eblock
          EDoI
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

#undef    marque_point
#undef    coordonnee_Z

EFonctionI

#undef    DEPTH_CUEING

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A C E   D ' U N   V E C T E U R   2 D   F L O T T A N T   Q U E L C O N Q U E  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

                                        /* Avant le 20001222141952, les parametres 'super_echelle_OX' et 'super_echelle_OY'          */
                                        /* figuraient ici. Ils ont du etre deplace dans '$xiii/Images$STR' pour des raisons de       */
                                        /* simplicite et de generalite. Ceci est du a l'utilisation des super-echelles               */
                                        /* dans 'v $xiii/di_image$FON SUPER_ECHELLE' pour la fonction 'IFdensite(...)'.              */

DEFV(Common,DEFV(Logical,SINT(IFsegment_____editer_le_vecteur_bidimensionnel,FAUX)));
                                        /* Indicateur permettant d'editer en option les coordonnees et les niveaux d'un vecteur      */
                                        /* bidimensionnel. Ceci fut introduit le 20080908174725.                                     */
DEFV(Common,DEFV(Logical,SINT(IFsegment_____trier_puis_editer_le_vecteur_bidimensionnel,FAUX)));
                                        /* Indicateur permettant d'editer en option les coordonnees et les niveaux d'un vecteur      */
                                        /* apres avoir trie les coordonnees. Ceci fut introduit le 20231012141022. L'interet de      */
                                        /* ceci est de pouvoir eliminer des segments qui apparaitraient plusieurs fois, parcourus    */
                                        /* dans deux sens differents (AB et BA), cette elimination se faisant a l'aide d'un tri      */
                                        /* via '$SOR -u' ('v $xiirv/.SMIT.81.1.$U SOR.' par exemple). On aura alors interet a        */
                                        /* reduire le nombre de decimales des coordonnees via :                                      */
                                        /*                                                                                           */
                                        /*                  ChiffresFlot=...                                                         */
                                        /*                                                                                           */
                                        /* afin d'eviter les problemes d'arrondis...                                                 */
                                        /*                                                                                           */
                                        /* On notera que la valeur par defaut garantit la compatibilite anterieure...                */

DEFV(Common,DEFV(Float,SINT(IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y,FZERO)));
DEFV(Common,DEFV(Float,SINT(IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y,FZERO)));
DEFV(Common,DEFV(Logical,SINT(IFsegment_____symetrie_par_rapport_a_l_axe_X,FAUX)));
DEFV(Common,DEFV(Logical,SINT(IFsegment_____symetrie_par_rapport_a_l_axe_Y,FAUX)));
                                        /* Introduit le 20231001100806 pour 'v $xrd/spectre.14$K IFsegment_____symetrie_.'...        */

DEFV(Local,DEFV(FonctionI,IFsegment(imageAR
                                   ,ARGUMENT_POINTERs(Fvecteur)
                                   ,vecteurs_____pointilles
                                   ,intensite_minimale,intensite_maximale
                                   ,anti_aliasing
                                   ,attrib_origine,attrib_extremite
                                    )
                )
     )
DEFV(Argument,DEFV(image,imageAR));
                                        /* Image a la fois Argument et Resultat...                                                   */
DEFV(Argument,DEFV(vectorF_2D,POINTERs(Fvecteur)));
                                        /* Vecteur flottant argument dont les coordonnees sont normalisees dans [0,1[.               */
DEFV(Argument,DEFV(binaire,vecteurs_____pointilles));
                                        /* Definit la forme (ou "pattern") de trace des vecteurs en pointilles ;                     */
                                        /* par exemple 'MMOT' permet le trace en traits pleins.                                      */
DEFV(Argument,DEFV(genere_p,intensite_minimale));
                                        /* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing                           */
                                        /* est demande pour ce vecteur.                                                              */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
                                        /* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas                          */
                                        /* demande, et dans le cas contraire, intensite maximale.                                    */
DEFV(Argument,DEFV(Logical,anti_aliasing));
                                        /* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX').                    */
DEFV(Argument,DEFV(Float,attrib_origine));
                                        /* Valeur de l'attribut a l'origine d'un vecteur 2D,                                         */
DEFV(Argument,DEFV(Float,attrib_extremite));
                                        /* Valeur de l'attribut a l'extremite d'un vecteur 2D.                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(vectorF_2D,Fvecteur_transforme);
                                        /* Vecteur flottant argument transforme eventuellement (introduit le 20231001100806)...      */
     DEFV(vectorI_2D,Ivecteur);
                                        /* Vecteur flottant argument converti en entier.                                             */
     /*..............................................................................................................................*/
     gTRANSFERT_VECTEUR_2D(Fvecteur_transforme,Fvecteur,ASD2,ASI2);

     Test(IL_FAUT(IFsegment_____symetrie_par_rapport_a_l_axe_X))
          Bblock
          INITIALISATION_VECTEUR_2D(Fvecteur_transforme
                                   ,NEUT(ASD2(Fvecteur_transforme,origine,x))
                                   ,SOUS(IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y
                                        ,SOUS(ASD2(Fvecteur_transforme,origine,y)
                                             ,IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y
                                              )
                                         )
                                   ,NEUT(ASD2(Fvecteur_transforme,extremite,x))
                                   ,SOUS(IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y
                                        ,SOUS(ASD2(Fvecteur_transforme,extremite,y)
                                             ,IFsegment_____Y_centre_des_symetries_par_rapport_aux_axes_X_et_Y
                                              )
                                         )
                                    );
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IL_FAUT(IFsegment_____symetrie_par_rapport_a_l_axe_Y))
          Bblock
          INITIALISATION_VECTEUR_2D(Fvecteur_transforme
                                   ,SOUS(IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y
                                        ,SOUS(ASD2(Fvecteur_transforme,origine,x)
                                             ,IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y
                                              )
                                         )
                                   ,NEUT(ASD2(Fvecteur_transforme,origine,y))
                                   ,SOUS(IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y
                                        ,SOUS(ASD2(Fvecteur_transforme,extremite,x)
                                             ,IFsegment_____X_centre_des_symetries_par_rapport_aux_axes_X_et_Y
                                              )
                                         )
                                   ,NEUT(ASD2(Fvecteur_transforme,extremite,y))
                                    );
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IL_FAUT(IFsegment_____editer_le_vecteur_bidimensionnel))
          Bblock
          Test(IL_FAUT(IFsegment_____trier_puis_editer_le_vecteur_bidimensionnel))
                                        /* Le 20231012141022 fut introduit la possibilite de trier les coordonnees...                */
               Bblock
               Test(IFOU(IFGT(ASD2(Fvecteur_transforme,origine,x),ASD2(Fvecteur_transforme,extremite,x))
                        ,IFET(IFEQ(ASD2(Fvecteur_transforme,origine,x),ASD2(Fvecteur_transforme,extremite,x))
                             ,IFGT(ASD2(Fvecteur_transforme,origine,y),ASD2(Fvecteur_transforme,extremite,y))
                              )
                         )
                    )
                    Bblock
                    fSWAP(ASD2(Fvecteur_transforme,origine,x),ASD2(Fvecteur_transforme,extremite,x));
                    fSWAP(ASD2(Fvecteur_transforme,origine,y),ASD2(Fvecteur_transforme,extremite,y));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          CALS(FPrme0("Vecteur={"));
          CAL3(Prme2("Origine={X=%+.^^^,Y=%+.^^^}"
                    ,ASD2(Fvecteur_transforme,origine,x)
                    ,ASD2(Fvecteur_transforme,origine,y)
                     )
               );
                                        /* Le 20091123122744, le format "^^g" est passe a "^^^" pour plus de souplesse...            */
          CALS(FPrme0("},"));
          CALS(FPrme0("{"));
          CAL3(Prme2("Extremite={X=%+.^^^,Y=%+.^^^}"
                    ,ASD2(Fvecteur_transforme,extremite,x)
                    ,ASD2(Fvecteur_transforme,extremite,y)
                     )
               );
                                        /* Le 20091123122744, le format "^^g" est passe a "^^^" pour plus de souplesse...            */
          CALS(FPrme0("}"));
          CAL3(Prme1(",Niveau=%d",intensite_maximale));
          CALS(Fsauts_de_lignes(UN));
                                        /* Edition du vecteur bidimensionnel argument dont les coordonnees sont normalisees          */
                                        /* dans [0,1[ (ceci fut introduit le 20080908174725...).                                     */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     INITIALISATION_VECTEUR_2D(Ivecteur
                              ,SUPER_cDENORMALISE_OX(ASD2(Fvecteur_transforme,origine,x))
                              ,SUPER_cDENORMALISE_OY(ASD2(Fvecteur_transforme,origine,y))
                              ,SUPER_cDENORMALISE_OX(ASD2(Fvecteur_transforme,extremite,x))
                              ,SUPER_cDENORMALISE_OY(ASD2(Fvecteur_transforme,extremite,y))
                               );
                                        /* ATTENTION, dans le format 'Pal', on notera que l'on peut avoir :                          */
                                        /*                                                                                           */
                                        /*                  F__cDENORMALISE_OY(ASI2(Fvecteur,origine,y))                             */
                                        /*                                                                                           */
                                        /* different d'une unite de :                                                                */
                                        /*                                                                                           */
                                        /*                  INTE(F__cDENORMALISE_OY(ASI2(Fvecteur,origine,y))                        */
                                        /*                                                                                           */
                                        /* Ceci s'est vu avec le programme 'v $xci/entrelace$K' generant de la stereoscopie.         */
                                        /* Le phenomene se manifestant, lorsque l'on part de 'Ymin' pour l'ordonnee 24 (flottante)   */
                                        /* qui donne alors la valeur 23 en entier (voir le programme 'v $xtc/Pal.11$c'). Ce probleme */
                                        /* a ete resolu par l'introduction de 'gINTE(...)' dans '_?DENORMALISE_AXES(...)'            */
                                        /* (voir le fichier 'v $xiif/format$DEF'). Simultanement, j'ai introduit 'LONGUEUR(...)'     */
                                        /* dans 'F__?DENORMALISE_AXES(...)'.                                                         */
     CALS(IIsegment(imageAR
                   ,ADRESSE(Ivecteur)
                   ,vecteurs_____pointilles
                   ,intensite_minimale,intensite_maximale
                   ,anti_aliasing
                   ,attrib_origine,attrib_extremite
                    )
          );
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A C E   D ' U N   V E C T E U R   F L O T T A N T   2 D   Q U E L C O N Q U E  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,IFseg2D(imageAR
                                  ,ARGUMENT_POINTERs(vector_2D)
                                  ,vecteurs_____pointilles
                                  ,intensite_minimale,intensite_maximale
                                  ,anti_aliasing
                                  ,Zf
                                   )
                 )
     )
DEFV(Argument,DEFV(image,imageAR));
                                        /* Image a la fois Argument et Resultat...                                                   */
DEFV(Argument,DEFV(vectorF_2D,POINTERs(vector_2D)));
                                        /* Vecteur flottant argument dont les coordonnees sont normalisees dans [0,1[.               */
DEFV(Argument,DEFV(binaire,vecteurs_____pointilles));
                                        /* Definit la forme (ou "pattern") de trace des vecteurs en pointilles ;                     */
                                        /* par exemple 'MMOT' permet le trace en traits pleins.                                      */
DEFV(Argument,DEFV(genere_p,intensite_minimale));
                                        /* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing                           */
                                        /* est demande pour ce vecteur.                                                              */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
                                        /* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas                          */
                                        /* demande, et dans le cas contraire, intensite maximale.                                    */
DEFV(Argument,DEFV(Logical,anti_aliasing));
                                        /* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX').                    */
DEFV(Argument,DEFV(Float,Zf));
                                        /* Definit (eventuellement arbitraitrement) la composante 'Z' dans [0,1[ d'un                */
                                        /* plan vertical dans lequel inserer le vecteur 2D a tracer.                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     CALS(IFsegment(imageAR
                   ,vector_2D
                   ,vecteurs_____pointilles
                   ,intensite_minimale,intensite_maximale
                   ,anti_aliasing
                   ,Zf,Zf
                    )
          );
                                        /* Nota : 'vector_2D' est deja un pointeur, donc on n'utilise pas 'ADRESSE'.                 */
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L A   P R O J E C T I O N   P L A N E   G E N E R A L E  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    PROJECTION_3D_2D_VERSION_02
#    define    COEFFICIENT_A_DU_PLAN_DE_PROJECTION                                                                                      \
                         FZERO
#    define    COEFFICIENT_B_DU_PLAN_DE_PROJECTION                                                                                      \
                         FZERO
#    define    COEFFICIENT_C_DU_PLAN_DE_PROJECTION                                                                                      \
                         FU
#    define    COEFFICIENT_D_DU_PLAN_DE_PROJECTION                                                                                      \
                         FZERO
                                        /* Definition du plan de projection : on utilise le plan (OX,OY), soit Z=0.                  */
#    define    COORDONNEE_X_DE_L_OBSERVATEUR                                                                                            \
                         COXA(ADD2(COXR(Xcentre)                                                                                        \
                                  ,MUL2(COZR(COORDONNEE_Z_DE_L_OBSERVATEUR)                                                             \
                                       ,TANG(Projection_OX_OY_____decalage_angulaire_de_l_observateur)                                  \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )
#    define    COORDONNEE_Y_DE_L_OBSERVATEUR                                                                                            \
                         Ycentre
#    define    COORDONNEE_Z_DE_L_OBSERVATEUR                                                                                            \
                         COZA(GRO1(FRA1(INTE(MUL2(Projection_OX_OY_____facteur_d_eloignement_en_Z_de_l_observateur,FLOT(COZR(Zmax)))))))
                                        /* Definition de la position de l'observateur : il est en (Xcentre,Ycentre,FRAi(Zmax)).      */
                                        /* ATTENTION : ces trois coordonnees seront DENORMALISEES par la suite...                    */
#Aifdef   PROJECTION_3D_2D_VERSION_02
#Eifdef   PROJECTION_3D_2D_VERSION_02

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R O J E C T I O N   S E L O N   L E S   A X E S   ' O X '   E T   ' O Y '  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    PROJECTION_3D_2D_VERSION_01                                           /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____PROJECTION_3D_2D_VERSION_01));
#Aifdef   PROJECTION_3D_2D_VERSION_01                                           /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   PROJECTION_3D_2D_VERSION_01                                           /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    PROJECTION_3D_2D_VERSION_02                                           /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____PROJECTION_3D_2D_VERSION_02));
#Aifdef   PROJECTION_3D_2D_VERSION_02                                           /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   PROJECTION_3D_2D_VERSION_02                                           /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#ifdef    PROJECTION_3D_2D_VERSION_01                                           /* Common,DEFV(Fonction,) : projection 2D --> 3D.    */

BFonctionF

DEFV(Common,DEFV(FonctionF,Projection_OX(Xf,Yf,Zf)))
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
                                        /* Coordonnees flottantes du point a projeter.                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(PROJECTION_OX(Xf,Yf,Zf));
     Eblock

EFonctionF

BFonctionF

DEFV(Common,DEFV(FonctionF,Projection_OY(Xf,Yf,Zf)))
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
                                        /* Coordonnees flottantes du point a projeter.                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(PROJECTION_OY(Xf,Yf,Zf));
     Eblock

EFonctionF

#Aifdef   PROJECTION_3D_2D_VERSION_01                                           /* Common,DEFV(Fonction,) : projection 2D --> 3D.    */
#Eifdef   PROJECTION_3D_2D_VERSION_01                                           /* Common,DEFV(Fonction,) : projection 2D --> 3D.    */

#ifdef    PROJECTION_3D_2D_VERSION_02                                           /* Common,DEFV(Fonction,) : projection 2D --> 3D.    */

BFonctionF

                                        /* ATTENTION : les donnees 'Projection_OX_OY_____position_de_l_observateur' et               */
                                        /* 'Projection_OX_OY_____plan_de_projection' sont rendues                                    */
                                        /* visibles a l'exterieur (le 1993041400), mais leur contenu n'a de sens qu'apres un appel   */
                                        /* a l'une des fonctions 'Projection_OX(...)' ou 'Projection_OY(...)'...                     */

DEFV(Common,DEFV(Logical,SINT(Projection_OX_OY_____etat_de_la_projection,INVALIDE)));
                                        /* Tant qu'un premier appel aux fonctions 'Projection_OX(...)' ou 'Projection_OY(...)' n'a   */
                                        /* pas ete effectue, les valeurs 'Projection_OX_OY_____position_de_l_observateur' et         */
                                        /* 'Projection_OX_OY_____plan_de_projection' sont invalides...                               */
                                        /*                                                                                           */
                                        /* ATTENTION, de plus a chaque appel de 'SET_DECALAGE_ANGULAIRE_DE_L_OBSERVATEUR(...)',      */
                                        /* 'Projection_OX_OY_____etat_de_la_projection' est remis a l'etat 'INVALIDE' afin que       */
                                        /* la nouvelle position de l'observateur soit recalculee...                                  */
DEFV(Common,DEFV(pointF_3D,Projection_OX_OY_____position_de_l_observateur));
                                        /* Definition de la position de l'observateur.                                               */
DEFV(Common,DEFV(plan_3D,Projection_OX_OY_____plan_de_projection));
                                        /* Definition du plan de projection.                                                         */

#    define    donnees_de_Projection_OX_OY                                                                                              \
                         DEFV(pointF_3D,point_3D_a_projeter);                                                                           \
                                        /* Point flottant argument dont les coordonnees sont normalisees dans [0,1[,                 */ \
                         DEFV(pointF_3D,point_projete)                                                                                  \
                                        /* Point projete qui est en fait a l'intersection du plan de projection et de la droite      */ \
                                        /* joignant l'observateur au point tri-dimensionnel a projeter.                              */ \
                                        /*                                                                                           */ \
                                        /* donnees necessaires a la projection 2D --> 3D, mais ATTENTION a l'absence de ";" a la     */ \
                                        /* fin de la derniere declaration due au mode d'appel.                                       */

#    define    Projection_OX_OY                                                                                                         \
                         Bblock                                                                                                         \
                         INITIALISATION_POINT_3D(point_3D_a_projeter,Xf,Yf,Zf);                                                         \
                                        /* Mise en place du point a projeter ; on notera malgre tout qu'il peut s'agir aussi,        */ \
                                        /* par exemple, des composantes d'un vecteur...                                              */ \
                         TRANSFERT_POINT_3D(point_projete,point_3D_a_projeter);                                                         \
                                        /* Le 19981102152819 ce transfert sans projection a ete rendu inconditionnel, alors que      */ \
                                        /* precedemment, il n'etait fait que dans le cas des points bidimensionnels...               */ \
                                                                                                                                        \
                         Test(IL_FAUT(Projection_OX_OY_____faire_de_la_vraie_projection_parallele))                                     \
                              Bblock                                                                                                    \
                                        /* Dans le cas de la projection parallele, il n'y a rien a faire : 'point_projete' est       */ \
                                        /* deja correct...                                                                           */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IFEQ(ASD1(point_3D_a_projeter,z),COEFFICIENT_D_DU_PLAN_DE_PROJECTION))                               \
                                   Bblock                                                                                               \
                                        /* Cas des points bidimensionnels, il n'est pas souhaitable de projeter.                     */ \
                                        /*                                                                                           */ \
                                        /* Ce test, a priori inutile, est mis ici malgre tout pour eviter d'eventuelles erreurs      */ \
                                        /* infinitesimales sur les coordonnees 'X' et 'Y' lorsque le point correspondant est dans    */ \
                                        /* le plan de projection. En effet, dans ce cas, 'X' et 'Y' doivent rester inchangees, ce    */ \
                                        /* qui, apparemment n'est pas le cas, et ce ne va pas sans poser quelques problemes lorsque  */ \
                                        /* l'on travaille en bidimensionnel et que l'on revient aux coordonnees d'ecran...           */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION, il y avait ici :                                                               */ \
                                        /*                                                                                           */ \
                                        /*                  TRANSFERT_POINT_3D(point_projete,point_3D_a_projeter);                   */ \
                                        /*                                                                                           */ \
                                        /* avant le 19981102152819.                                                                  */ \
                                                                                                                                        \
                                   Test(IFNE(COEFFICIENT_D_DU_PLAN_DE_PROJECTION,FZorigine))                                            \
                                        Bblock                                                                                          \
                                        PRINT_ATTENTION("le plan de projection n'est pas le plan de 'Zmin'");                           \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                        /* Cas des points tridimensionnels, il est obligatoire de projeter :                         */ \
                                   Test(EST_INVALIDE(Projection_OX_OY_____etat_de_la_projection))                                       \
                                        Bblock                                                                                          \
                                        EGAL(ASD1(Projection_OX_OY_____plan_de_projection,pA),COEFFICIENT_A_DU_PLAN_DE_PROJECTION);     \
                                        EGAL(ASD1(Projection_OX_OY_____plan_de_projection,pB),COEFFICIENT_B_DU_PLAN_DE_PROJECTION);     \
                                        EGAL(ASD1(Projection_OX_OY_____plan_de_projection,pC),COEFFICIENT_C_DU_PLAN_DE_PROJECTION);     \
                                        EGAL(ASD1(Projection_OX_OY_____plan_de_projection,pD),COEFFICIENT_D_DU_PLAN_DE_PROJECTION);     \
                                        /* Mise en place du plan de projection ; il s'agit du plan (OX,OY).                          */ \
                                        INITIALISATION_POINT_3D(Projection_OX_OY_____position_de_l_observateur                          \
                                                               ,_____cNORMALISE_OX(COORDONNEE_X_DE_L_OBSERVATEUR)                       \
                                                               ,_____cNORMALISE_OY(COORDONNEE_Y_DE_L_OBSERVATEUR)                       \
                                                               ,_____cNORMALISE_OZ(COORDONNEE_Z_DE_L_OBSERVATEUR)                       \
                                                                );                                                                      \
                                        /* Mise en place de l'observateur...                                                         */ \
                                        EGAL(Projection_OX_OY_____etat_de_la_projection,VALIDE);                                        \
                                        /* Apres un premier appel aux fonctions 'Projection_OX(...)' ou 'Projection_OY(...)', les    */ \
                                        /* valeurs 'Projection_OX_OY_____position_de_l_observateur' et                               */ \
                                        /* 'Projection_OX_OY_____plan_de_projection' sont valides...                                 */ \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   Test(IFEQ(LIZ3(ASD1(Projection_OX_OY_____plan_de_projection,pA),ASD1(point_3D_a_projeter,x)          \
                                                 ,ASD1(Projection_OX_OY_____plan_de_projection,pB),ASD1(point_3D_a_projeter,y)          \
                                                 ,ASD1(Projection_OX_OY_____plan_de_projection,pC),ASD1(point_3D_a_projeter,z)          \
                                                  )                                                                                     \
                                            ,LIZ3(ASD1(Projection_OX_OY_____plan_de_projection,pA)                                      \
                                                 ,ASD1(Projection_OX_OY_____position_de_l_observateur,x)                                \
                                                 ,ASD1(Projection_OX_OY_____plan_de_projection,pB)                                      \
                                                 ,ASD1(Projection_OX_OY_____position_de_l_observateur,y)                                \
                                                 ,ASD1(Projection_OX_OY_____plan_de_projection,pC)                                      \
                                                 ,ASD1(Projection_OX_OY_____position_de_l_observateur,z)                                \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                        Bblock                                                                                          \
                                        /* Le plan de projection a pour equation :                                                   */ \
                                        /*                                                                                           */ \
                                        /*                  A.X + B.Y + C.Z + D = 0                                                  */ \
                                        /*                                                                                           */ \
                                        /* un plan parallele a celui-ci et passant par l'observateur (X0,Y0,Z0) a pour equation :    */ \
                                        /*                                     ,                                                     */ \
                                        /*                  A.X + B.Y + C.Z + D  = 0                                                 */ \
                                        /*                                                                                           */ \
                                        /* avec :                                                                                    */ \
                                        /*                                        ,                                                  */ \
                                        /*                  A.X0 + B.Y0 + C.Z0 + D  = 0                                              */ \
                                        /*                                                                                           */ \
                                        /* d'ou, si le point a projeter (Xp,Yp,Zp) = {Xf,Yf,Zf} est dans un plan parallele au        */ \
                                        /* plan de projection et passant par l'observateur (appele "plan d'observation" dans ce      */ \
                                        /* qui suit) :                                                                               */ \
                                        /*                                                                                           */ \
                                        /*                  A.Xp + B.Yp + C.Zp = A.X0 + B.Y0 + C.Z0                                  */ \
                                        /*                                                                                           */ \
                                        /* d'ou le test ci-dessus...                                                                 */ \
                                        PRINT_ERREUR("le point a projeter est dans le plan d'observation");                             \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   PROJECTION_PLANE_QUELCONQUE(point_projete                                                            \
                                                              ,point_3D_a_projeter                                                      \
                                                              ,Projection_OX_OY_____plan_de_projection                                  \
                                                              ,Projection_OX_OY_____position_de_l_observateur                           \
                                                               );                                                                       \
                                        /* Projection de l'origine du vecteur tri-dimensionnel,                                      */ \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                                        /* Projection generale sur les axes 'OX' et 'OY'.                                            */

DEFV(Common,DEFV(Logical,SINT(Projection_OX_OY_____faire_de_la_vraie_projection_parallele,FAUX)));
                                        /* Afin de faire simplement de la projection parallele (introduit le 19981102152819).        */
DEFV(Common,DEFV(Float,SINT(Projection_OX_OY_____facteur_d_eloignement_en_Z_de_l_observateur
                           ,FACTEUR_D_ELOIGNEMENT_EN_Z_DE_L_OBSERVATEUR
                            )
                 )
     );
                                        /* Facteur destine a deplacer l'observateur le long de l'axe 'OZ', et ce afin de simuler     */
                                        /* la projection parallele, c'est-a-dire celle qui realise : {X,Y,Z} --> {X,Y}.              */
DEFV(Common,DEFV(Float,SINT(Projection_OX_OY_____decalage_angulaire_de_l_observateur,DECALAGE_ANGULAIRE_POUR_UNE_VISION_CYCLOPIQUE)));
                                        /* Facteur destine a simuler la vision stereoscopique, et initialiser sur une vision         */
                                        /* monoculaire (dite "cyclopique"...) ; ce facteur est un angle mesure dans le plan (OX,OZ). */

DEFV(Common,DEFV(FonctionF,Projection_OX(Xf,Yf,Zf)))
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
                                        /* Coordonnees flottantes du point a projeter dans [0,1[.                                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     donnees_de_Projection_OX_OY;
     /*..............................................................................................................................*/
     Projection_OX_OY;
                                        /* Projection sur les deux axes 'OX' et 'OY'.                                                */
     RETU(ASD1(point_projete,x));
     Eblock

EFonctionF

BFonctionF

DEFV(Common,DEFV(FonctionF,Projection_OY(Xf,Yf,Zf)))
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
                                        /* Coordonnees flottantes du point a projeter dans [0,1[.                                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     donnees_de_Projection_OX_OY;
     /*..............................................................................................................................*/
     Projection_OX_OY;
                                        /* Projection sur les deux axes 'OX' et 'OY'.                                                */
     RETU(ASD1(point_projete,y));
     Eblock

EFonctionF

#    undef     Projection_OX_OY
#    undef     donnees_de_Projection_OX_OY

#Aifdef   PROJECTION_3D_2D_VERSION_02                                           /* Common,DEFV(Fonction,) : projection 2D --> 3D.    */
#Eifdef   PROJECTION_3D_2D_VERSION_02                                           /* Common,DEFV(Fonction,) : projection 2D --> 3D.    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A C E   D ' U N   V E C T E U R   F L O T T A N T   3 D   Q U E L C O N Q U E  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

DEFV(Common,DEFV(Logical,ZINT(DEBUT_CENTRAGE_____compatibilite_20080909,FAUX)));
                                        /* Introduit le 20080909140617...                                                            */

DEFV(Common,DEFV(Logical,PINT(DRAW_____initialiser_les_extrema_de_X_Y_Z,VRAI)));
                                        /* Afin de pouvoir forcer l'initialisation des extrema qui suivent...                        */
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_X,F_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_Y,F_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_Z,F_INFINI)));
                                        /* Minima courant des coordonnees {X,Y,Z} (introduit le 20080909140617) et ce quel que soit  */
                                        /* 'vecteurs_____etat_trace'...                                                              */
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_X,F_MOINS_L_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_Y,F_MOINS_L_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_Z,F_MOINS_L_INFINI)));
                                        /* Maxima courant des coordonnees {X,Y,Z} (introduit le 20080909140617) et ce quel que soit  */
                                        /* 'vecteurs_____etat_trace'...                                                              */
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_X__trace_AUTORISE,F_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_Y__trace_AUTORISE,F_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____minimum_Z__trace_AUTORISE,F_INFINI)));
                                        /* Minima courant des coordonnees {X,Y,Z} (introduit le 20230809171130) qui ne conncernent   */
                                        /* que les cas 'EST_AUTORISE(vecteurs_____etat_trace)'...                                    */
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_X__trace_AUTORISE,F_MOINS_L_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_Y__trace_AUTORISE,F_MOINS_L_INFINI)));
DEFV(Common,DEFV(Float,PINT(DRAW_____maximum_Z__trace_AUTORISE,F_MOINS_L_INFINI)));
                                        /* Maxima courant des coordonnees {X,Y,Z} (introduit le 20230809171130) qui ne conncernent   */
                                        /* que les cas 'EST_AUTORISE(vecteurs_____etat_trace)'...                                    */

BFonctionI

DEFV(Common,DEFV(Logical,SINT(IFseg3D_____editer_le_vecteur_tridimensionnel,FAUX)));
                                        /* Indicateur permettant d'editer en option les coordonnees et les niveaux d'un vecteur      */
                                        /* tridimensionnel. Ceci fut introduit le 20080908174725 afin de, par exemple, recuperer     */
                                        /* les formes paradoxales de 'v $xiii/alphabet.3$FON'...                                     */

DEFV(Common,DEFV(FonctionI,IFseg3D(imageAR
                                  ,ARGUMENT_POINTERs(vecteurs_____vector_3D)
                                  ,vecteurs_____pointilles
                                  ,intensite_minimale,intensite_maximale
                                  ,anti_aliasing
                                   )
                 )
     )
DEFV(Argument,DEFV(image,imageAR));
                                        /* Image a la fois Argument et Resultat...                                                   */
DEFV(Argument,DEFV(vectorF_3D,POINTERs(vecteurs_____vector_3D)));
                                        /* Vecteur flottant argument dont les coordonnees sont normalisees dans [0,1[.               */
DEFV(Argument,DEFV(binaire,vecteurs_____pointilles));
                                        /* Definit la forme (ou "pattern") de trace des vecteurs en pointilles ;                     */
                                        /* par exemple 'MMOT' permet le trace en traits pleins.                                      */
DEFV(Argument,DEFV(genere_p,intensite_minimale));
                                        /* Intensite minimale lumineuse du vecteur lorsque l'anti-aliasing                           */
                                        /* est demande pour ce vecteur.                                                              */
DEFV(Argument,DEFV(genere_p,intensite_maximale));
                                        /* Intensite lumineuse du vecteur lorsque l'anti-aliasing n'est pas                          */
                                        /* demande, et dans le cas contraire, intensite maximale.                                    */
DEFV(Argument,DEFV(Logical,anti_aliasing));
                                        /* Indicateur demandant un trace anti-aliase ('VRAI') ou normal ('FAUX').                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     DEFV(vectorF_2D,vector_2D);
                                        /* Vecteur flottant 2D (projection du vecteur 3D).                                           */
     /*..............................................................................................................................*/
     Test(IL_FAUT(IFseg3D_____editer_le_vecteur_tridimensionnel))
          Bblock
          CALS(FPrme0("Vecteur={"));
          CAL3(Prme3("Origine={X=%+.^^^,Y=%+.^^^,Z=%+.^^^}"
                    ,ASI2(vecteurs_____vector_3D,origine,x)
                    ,ASI2(vecteurs_____vector_3D,origine,y)
                    ,ASI2(vecteurs_____vector_3D,origine,z)
                     )
               );
                                        /* Le 20091123122744, le format "^^g" est passe a "^^^" pour plus de souplesse...            */
          CALS(FPrme0("},"));
          CALS(FPrme0("{"));
          CAL3(Prme3("Extremite={X=%+.^^^,Y=%+.^^^,Z=%+.^^^}"
                    ,ASI2(vecteurs_____vector_3D,extremite,x)
                    ,ASI2(vecteurs_____vector_3D,extremite,y)
                    ,ASI2(vecteurs_____vector_3D,extremite,z)
                     )
               );
                                        /* Le 20091123122744, le format "^^g" est passe a "^^^" pour plus de souplesse...            */
          CALS(FPrme0("}"));
          CAL3(Prme1(",Niveau=%d",intensite_maximale));
          CALS(Fsauts_de_lignes(UN));
                                        /* Edition du vecteur tridimensionnel argument dont les coordonnees sont normalisees         */
                                        /* dans [0,1[ (ceci fut introduit le 20080908174725...).                                     */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     INITIALISATION_VECTEUR_2D(vector_2D
                              ,Projection_OX(ASI2(vecteurs_____vector_3D,origine,x)
                                            ,ASI2(vecteurs_____vector_3D,origine,y)
                                            ,ASI2(vecteurs_____vector_3D,origine,z)
                                             )
                              ,Projection_OY(ASI2(vecteurs_____vector_3D,origine,x)
                                            ,ASI2(vecteurs_____vector_3D,origine,y)
                                            ,ASI2(vecteurs_____vector_3D,origine,z)
                                             )
                              ,Projection_OX(ASI2(vecteurs_____vector_3D,extremite,x)
                                            ,ASI2(vecteurs_____vector_3D,extremite,y)
                                            ,ASI2(vecteurs_____vector_3D,extremite,z)
                                             )
                              ,Projection_OY(ASI2(vecteurs_____vector_3D,extremite,x)
                                            ,ASI2(vecteurs_____vector_3D,extremite,y)
                                            ,ASI2(vecteurs_____vector_3D,extremite,z)
                                             )
                               );
     CALS(IFsegment(imageAR
                   ,ADRESSE(vector_2D)
                   ,vecteurs_____pointilles
                   ,intensite_minimale,intensite_maximale
                   ,anti_aliasing
                   ,ASI2(vecteurs_____vector_3D,origine,z),ASI2(vecteurs_____vector_3D,extremite,z)
                    )
          );
                                        /* Vers le trace du vecteur projete sur le plan de l'ecran.                                  */
     RETU_ERROR;
     Eblock

EFonctionI

#ifdef    PROJECTION_3D_2D_VERSION_02
#    undef     COORDONNEE_Z_DE_L_OBSERVATEUR
#    undef     COORDONNEE_Y_DE_L_OBSERVATEUR
#    undef     COORDONNEE_X_DE_L_OBSERVATEUR
#    undef     COEFFICIENT_D_DU_PLAN_DE_PROJECTION
#    undef     COEFFICIENT_C_DU_PLAN_DE_PROJECTION
#    undef     COEFFICIENT_B_DU_PLAN_DE_PROJECTION
#    undef     COEFFICIENT_A_DU_PLAN_DE_PROJECTION
#Aifdef   PROJECTION_3D_2D_VERSION_02
#Eifdef   PROJECTION_3D_2D_VERSION_02

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D O N N E E S   G R A P H I Q U E S   U T I L E S  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____cursor_3D__ramener_la_coordonnee_X_dans_l_image,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____cursor_3D__ramener_la_coordonnee_Y_dans_l_image,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(vecteurs_____cursor_3D__ramener_la_coordonnee_Z_dans_l_image,FAUX)));
                                        /* Introduits le 20180620134829 pour permettre a 'v $xci/grille.01$K 20180620140957' de      */
                                        /* generer des cadres inclus dans l'image ('v $xiio/RADRE$R16' par exemple...).              */

#if  (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01))                                                      /* Common,DEFV(Fonction,)   */
DEFV(Common,DEFV(vectorF_3D,ZINS(vecteurs_____vector_3D
                                ,IstructH102(IstructL03(FXorigine
                                                       ,FYorigine
                                                       ,FZorigine
                                                        )
                                            ,IstructL03(FXorigine
                                                       ,FYorigine
                                                       ,FZorigine
                                                        )
                                             )
                                 )
                 )
     );
                                        /* Vecteur tri-dimensionnel courant exprime en flottant pour avoir un                        */
                                        /* maximum de precision dans des unites telles que :                                         */
                                        /* [Xmin,Xmax]*[Ymin,Ymax]*[Zmin,Zmax] soit represente par [0,1[*[0,1[*[0,1[.                */
                                        /* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de         */
                                        /* faciliter le travail de '$xcg/gen.ext$Z'...                                               */

DEFV(Common,DEFV(pointF_3D,ZINS(vecteurs_____cursor_3D
                               ,IstructL03(FXorigine
                                          ,FYorigine
                                          ,FZorigine
                                           )
                                )
                 )
     );
                                        /* Curseur virtuel courant exprime en flottant pour avoir un                                 */
                                        /* maximum de precision dans des unites telles que :                                         */
                                        /* [Xmin,Xmax]*[Ymin,Ymax]*[Zmin,Zmax] soit represente par [0,1[*[0,1[*[0,1[.                */
                                        /* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de         */
                                        /* faciliter le travail de '$xcg/gen.ext$Z'...                                               */

DEFV(Common,DEFV(Logical,ZINT(vecteurs_____renormaliser_scale_globale,VRAI)));
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_globale,ECHELLES_INITIALES)));
                                        /* Echelle globale. Le controle de la renormalisation de 'vecteurs_____scale_globale' a      */
                                        /* ete introduit le 20160527135040 ('v $xiii/vecteurs$DEF 20160527135104' afin de justifier  */
                                        /* cela...).                                                                                 */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OX,_____lNORMALISE_OX(ECHELLES_INITIALES))));
                                        /* Echelle sur l'axe des 'X',                                                                */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OY,_____lNORMALISE_OY(ECHELLES_INITIALES))));
                                        /* Echelle sur l'axe des 'Y',                                                                */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OZ,_____lNORMALISE_OZ(ECHELLES_INITIALES))));
                                        /* Echelle sur l'axe des 'Z'.                                                                */
#Aif (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01))                                                      /* Common,DEFV(Fonction,)   */
#Eif (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01))                                                      /* Common,DEFV(Fonction,)   */

#if  ((dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) || (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)))  /* Common,DEFV(Fonction,)   */
                                        /* Nota : malheureusement, dans 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02', on ne peut plus   */
                                        /* utiliser des expressions du type 'FXorigine', car malheureusement elles                   */
                                        /* referencent des variables et non plus des expressions constantes, comme cela etait le     */
                                        /* cas dans 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01', d'ou les initialisations suivantes    */
                                        /* a l'aide de 'FZERO'...                                                                    */
#    define    COORDONNEES_INITIALES_DENORMALISEES                                                                                      \
                         FZERO                                                                                                          \
                                        /* Valeurs initiales des composantes de 'vecteurs_____vector_3D' et                          */ \
                                        /* 'vecteurs_____cursor_3D'...                                                               */
DEFV(Common,DEFV(vectorF_3D,ZINS(vecteurs_____vector_3D
                                ,IstructH102(IstructL03(COORDONNEES_INITIALES_DENORMALISEES
                                                       ,COORDONNEES_INITIALES_DENORMALISEES
                                                       ,COORDONNEES_INITIALES_DENORMALISEES
                                                        )
                                            ,IstructL03(COORDONNEES_INITIALES_DENORMALISEES
                                                       ,COORDONNEES_INITIALES_DENORMALISEES
                                                       ,COORDONNEES_INITIALES_DENORMALISEES
                                                        )
                                             )
                                 )
                 )
     );
                                        /* Vecteur tri-dimensionnel courant exprime en flottant pour avoir un                        */
                                        /* maximum de precision dans des unites telles que :                                         */
                                        /* [Xmin,Xmax]*[Ymin,Ymax]*[Zmin,Zmax] soit represente par [0,1[*[0,1[*[0,1[.                */
                                        /* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de         */
                                        /* faciliter le travail de '$xcg/gen.ext$Z'...                                               */
DEFV(Common,DEFV(pointF_3D,ZINS(vecteurs_____cursor_3D
                               ,IstructL03(COORDONNEES_INITIALES_DENORMALISEES
                                          ,COORDONNEES_INITIALES_DENORMALISEES
                                          ,COORDONNEES_INITIALES_DENORMALISEES
                                           )
                                )
                 )
     );
                                        /* Curseur virtuel courant exprime en flottant pour avoir un                                 */
                                        /* maximum de precision dans des unites telles que :                                         */
                                        /* [Xmin,Xmax]*[Ymin,Ymax]*[Zmin,Zmax] soit represente par [0,1[*[0,1[*[0,1[.                */
                                        /* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de         */
                                        /* faciliter le travail de '$xcg/gen.ext$Z'...                                               */

#    undef     COORDONNEES_INITIALES_DENORMALISEES

DEFV(Common,DEFV(Logical,ZINT(vecteurs_____renormaliser_scale_globale,VRAI)));
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_globale,INITIALISER_LES_ECHELLES)));
                                        /* Echelle globale. Le controle de la renormalisation de 'vecteurs_____scale_globale' a      */
                                        /* ete introduit le 20160527135040 ('v $xiii/vecteurs$DEF 20160527135104' afin de justifier  */
                                        /* cela...).                                                                                 */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OX,INITIALISER_LES_ECHELLES)));
                                        /* Echelle sur l'axe des 'X',                                                                */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OY,INITIALISER_LES_ECHELLES)));
                                        /* Echelle sur l'axe des 'Y',                                                                */
DEFV(Common,DEFV(Float,ZINT(vecteurs_____scale_OZ,INITIALISER_LES_ECHELLES)));
                                        /* Echelle sur l'axe des 'Z'.                                                                */
#Aif ((dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) || (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)))  /* Common,DEFV(Fonction,)   */
#Eif ((dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) || (dfd(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)))  /* Common,DEFV(Fonction,)   */

DEFV(Common,DEFV(Logical,ZINT(vecteurs_____etat_trace,AUTORISE)));
                                        /* Indicateur de l'etat du trace : il est autorise ('AUTORISE') ou inhibe                    */
                                        /* ('INTERDIT').                                                                             */

DEFV(Common,DEFV(Logical,ZINT(vecteurs_____etat_anti_aliasing,FAUX)));
                                        /* Indicateur de mode de trace avec ('VRAI') ou sans ('FAUX') anti-aliasing.                 */
DEFV(Common,DEFV(genere_p,ZINT(vecteurs_____niveau_minimal,NOIR)));
                                        /* Niveau minimal lors d'un trace anti-aliasing.                                             */
DEFV(Common,DEFV(genere_p,ZINT(vecteurs_____niveau_maximal,BLANC)));
                                        /* Niveau de trace, ou niveau maximal lors d'un trace anti-aliasing.                         */

DEFV(Common,DEFV(binaire,ZINT(vecteurs_____pointilles,PAS_DE_POINTILLES)));
                                        /* Definition de la pattern de trace des vecteurs ; 'MMOT' permet un trace continu.          */

DEFV(Common,DEFV(Logical,ZINT(vecteurs_____SET_COULEURS,AUTORISE)));
                                        /* A cause de 'v $xiii/alphabets$FON SET_COULEURS.niveau_fond,niveau_fond.', cet indicateur  */
                                        /* fut introduit le 20181023140445 afin de bloquer le fonctionnement de 'SET_COULEURS(...)'  */
                                        /* et donc ne pas modifier {vecteurs_____niveau_minimal,vecteurs_____niveau_maximal}...      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O T I O N   D E   P I L E   G R A P H I Q U E  :                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    La plupart des donnes graphiques                                                                               */
/*                  peuvent etre sauvegardees dans une                                                                               */
/*                  pile.                                                                                                            */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(l_element,INIT(POINTERs(vecteurs_____pile_graphique),PILE_UNDEF)));
                                        /* Definition de la pile de gestion des entites graphiques.                                  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O T I O N   D E   T R A N S F O R M A T I O N   G E O M E T R I Q U E  :                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    On va disposer a tout instant d'une                                                                            */
/*                  matrice de transformation geometrique                                                                            */
/*                  qui sera appliquee lors de l'operation                                                                           */
/*                  MOVE(dX,dY,dZ) du curseur virtuel.                                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        ATTENTION :                                                                                                                */
/*                                                                                                                                   */
/*                    Il n'est pas possible de placer en                                                                             */
/*                  tete les donnees suivantes relatives                                                                             */
/*                  a la transformation geometrique en tete                                                                          */
/*                  afin de pouvoir etre placee dans un bloc                                                                         */
/*                  de type '$a' autonome. En effet elles                                                                            */
/*                  sont utilisees dans de nombreuses fonctions                                                                      */
/*                  locales. C'est dommage, car en effet, elles                                                                      */
/*                  sont souvent utilisees independamment des                                                                        */
/*                  autre outils ici definis (c'est par exemple                                                                      */
/*                  le cas des rotations tridimensionnelles de                                                                       */
/*                  'ROTATION_TRIDIMENSIONNELLE_DANS_HC(...)').                                                                      */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Float,ZINT(vecteurs_____rapport_de_zoom_cumule_courant,ABSENCE_D_EFFET_DE_ZOOM)));
                                        /* Rapport du zoom courant integrant tous les modifications anterieures. Celui-ci est        */
                                        /* utilise dans les procedures :                                                             */
                                        /*                                                                                           */
                                        /*                  T_ZOOM(...)                                                              */
                                        /*                                                                                           */
                                        /* et                                                                                        */
                                        /*                                                                                           */
                                        /*                  TRANSFORMATION_GEOMETRIQUE_3D_Fx(...)                                    */
                                        /*                                                                                           */
                                        /* afin de garantir que les translations imposees subissent elles-aussi l'effet de zoom...   */

DEFV(Common,DEFV(Float,ZINT(vecteurs_____angle_de_rotation,FZERO)));
                                        /* Angle courant de rotation (introduit le 20230722112439 lors de la mise au point de        */
                                        /* 'v $xrd/spectre.01$K')...                                                                 */

DEFV(Common,DEFV(matrixF_3D,vecteurs_____matrix_3D));
                                        /* Matrice de transformation courante dans l'espace 3D.                                      */
DEFV(Common,DEFV(Logical,INIT(vecteurs_____etat_matrix,INVALIDE)));
                                        /* Indicateur logique indiquant si le contenu de la matrice est correct                      */
                                        /* ('VALIDE') ou incorrect ou encore non initialise ('INVALIDE').                            */

Denumer04(INIS(_ORDRE_DE_LA_ROTATION_0X,_____BEAUCOUP)
              ,_ORDRE_DE_LA_ROTATION_0Y
              ,_ORDRE_DE_LA_ROTATION_0Z
              ,DERNIER_ORDRE_DE_LA_ROTATION
         ,liste_des_ORDRE_DES_ROTATIONS
          );
                                        /* La valeur tres elevee donnee a ces indicateurs est destinee a garantir presque surement   */
                                        /* que les rotations absentes en tant qu'argument n'auront pas des ordres identiques a ceux  */
                                        /* des rotations presentes...                                                                */

                                        /* Tout ce qui concerne l'ordre des rotations vient de 'v $xrq/nucleon.LX.2$I' et a ete      */
                                        /* deplace le 19971104162912.                                                                */

#define   ORDRE_DE_LA_ROTATION_0X                                                                                                       \
                    ENUM(_ORDRE_DE_LA_ROTATION_0X)
#define   ORDRE_DE_LA_ROTATION_0Y                                                                                                       \
                    ENUM(_ORDRE_DE_LA_ROTATION_0Y)
#define   ORDRE_DE_LA_ROTATION_0Z                                                                                                       \
                    ENUM(_ORDRE_DE_LA_ROTATION_0Z)

DEFV(Common,DEFV(Int,ZINT(vecteurs_____ordre_de_la_ROTATION_0X,ORDRE_DE_LA_ROTATION_0X)));
DEFV(Common,DEFV(Int,ZINT(vecteurs_____ordre_de_la_ROTATION_0Y,ORDRE_DE_LA_ROTATION_0Y)));
DEFV(Common,DEFV(Int,ZINT(vecteurs_____ordre_de_la_ROTATION_0Z,ORDRE_DE_LA_ROTATION_0Z)));
                                        /* Comme les rotations de l'espace tridimensionnel ne commutent pas, on va memoriser par     */
                                        /* ce biais l'ordre dans lequel elles sont definies, et donc l'ordre dans lequel elles       */
                                        /* seront appliquees. Pour avoir un exemple de memorisation de l'ordre courant des rotations */
                                        /* on pourra voir le fichier 'v $xrv/champs_5.1A$I vecteurs_____ordre_de_la_ROTATION_0X',    */
                                        /* via la procedure 'PROCESS_ARGUMENTS_GEOMETRIQUES'...                                      */

#undef    ORDRE_DE_LA_ROTATION_0X
#undef    ORDRE_DE_LA_ROTATION_0Y
#undef    ORDRE_DE_LA_ROTATION_0Z

                                        /* Tout ce qui concerne l'ordre des rotations vient de 'v $xrq/nucleon.LX.2$I' et a ete      */
                                        /* deplace le 19971104162912.                                                                */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O T I O N   D E   C O N T E X T E  :                                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Le contexte est constitue de                                                                                   */
/*                  l'ensemble des donnees necessaires                                                                               */
/*                  au trace graphique. Il est possible                                                                              */
/*                  de le sauvegarder et de la restaurer                                                                             */
/*                  globalement, et ce de facon "aleatoire",                                                                         */
/*                  c'est-a-dire sans pile ni liste.                                                                                 */
/*                                                                                                                                   */
/*                    A cause des problemes d'initialisation                                                                         */
/*                  des structures a la compilation, les                                                                             */
/*                  donnees graphiques courante ne sont pas                                                                          */
/*                  rangees dans une structure de type "con-                                                                         */
/*                  texte"...                                                                                                        */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_00));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_01));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_02));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_03));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_04));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_05));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_06));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_07));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_08));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_09));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_10));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_11));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_12));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_13));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_14));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_15));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_16));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_17));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_18));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_19));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_20));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_21));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_22));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_23));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_24));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_25));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_26));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_27));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_28));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_29));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_30));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_31));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_32));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_33));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_34));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_35));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_36));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_37));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_38));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_39));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_40));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_41));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_42));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_43));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_44));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_45));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_46));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_47));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_48));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_49));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_50));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_51));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_52));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_53));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_54));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_55));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_56));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_57));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_58));
DEFV(Common,DEFV(Gcontexte,vecteurs_____Gcon_59));
                                        /* Generation des contextes graphiques.                                                      */
                                        /*                                                                                           */
                                        /* Le 20230906150540 ont ete introduits les contextes {40,41,42,43,44,45,46,47,48,49}.       */
                                        /*                                                                                           */
                                        /* Le 20230926180744 ont ete introduits les contextes {50,51,52,53,54,55,56,57,58,59}.       */

DEFV(Common,DEFV(Gcontexte,INIS(POINTERs(DTb0(liste_des_____vecteurs_____Gcon))
                                        /* ATTENTION : ce qui precede doit absolument etre sur une seule et meme ligne et ce a       */
                                        /* caause de 'v $xcg/gen$EXT$Z' via 'v $xcg/gen$EXT$D/GetCommon$vv$Y'...                     */
                               ,IstructL60(ADRESSE(vecteurs_____Gcon_00)
                                          ,ADRESSE(vecteurs_____Gcon_01)
                                          ,ADRESSE(vecteurs_____Gcon_02)
                                          ,ADRESSE(vecteurs_____Gcon_03)
                                          ,ADRESSE(vecteurs_____Gcon_04)
                                          ,ADRESSE(vecteurs_____Gcon_05)
                                          ,ADRESSE(vecteurs_____Gcon_06)
                                          ,ADRESSE(vecteurs_____Gcon_07)
                                          ,ADRESSE(vecteurs_____Gcon_08)
                                          ,ADRESSE(vecteurs_____Gcon_09)
                                          ,ADRESSE(vecteurs_____Gcon_10)
                                          ,ADRESSE(vecteurs_____Gcon_11)
                                          ,ADRESSE(vecteurs_____Gcon_12)
                                          ,ADRESSE(vecteurs_____Gcon_13)
                                          ,ADRESSE(vecteurs_____Gcon_14)
                                          ,ADRESSE(vecteurs_____Gcon_15)
                                          ,ADRESSE(vecteurs_____Gcon_16)
                                          ,ADRESSE(vecteurs_____Gcon_17)
                                          ,ADRESSE(vecteurs_____Gcon_18)
                                          ,ADRESSE(vecteurs_____Gcon_19)
                                          ,ADRESSE(vecteurs_____Gcon_20)
                                          ,ADRESSE(vecteurs_____Gcon_21)
                                          ,ADRESSE(vecteurs_____Gcon_22)
                                          ,ADRESSE(vecteurs_____Gcon_23)
                                          ,ADRESSE(vecteurs_____Gcon_24)
                                          ,ADRESSE(vecteurs_____Gcon_25)
                                          ,ADRESSE(vecteurs_____Gcon_26)
                                          ,ADRESSE(vecteurs_____Gcon_27)
                                          ,ADRESSE(vecteurs_____Gcon_28)
                                          ,ADRESSE(vecteurs_____Gcon_29)
                                          ,ADRESSE(vecteurs_____Gcon_30)
                                          ,ADRESSE(vecteurs_____Gcon_31)
                                          ,ADRESSE(vecteurs_____Gcon_32)
                                          ,ADRESSE(vecteurs_____Gcon_33)
                                          ,ADRESSE(vecteurs_____Gcon_34)
                                          ,ADRESSE(vecteurs_____Gcon_35)
                                          ,ADRESSE(vecteurs_____Gcon_36)
                                          ,ADRESSE(vecteurs_____Gcon_37)
                                          ,ADRESSE(vecteurs_____Gcon_38)
                                          ,ADRESSE(vecteurs_____Gcon_39)
                                          ,ADRESSE(vecteurs_____Gcon_40)
                                          ,ADRESSE(vecteurs_____Gcon_41)
                                          ,ADRESSE(vecteurs_____Gcon_42)
                                          ,ADRESSE(vecteurs_____Gcon_43)
                                          ,ADRESSE(vecteurs_____Gcon_44)
                                          ,ADRESSE(vecteurs_____Gcon_45)
                                          ,ADRESSE(vecteurs_____Gcon_46)
                                          ,ADRESSE(vecteurs_____Gcon_47)
                                          ,ADRESSE(vecteurs_____Gcon_48)
                                          ,ADRESSE(vecteurs_____Gcon_49)
                                          ,ADRESSE(vecteurs_____Gcon_50)
                                          ,ADRESSE(vecteurs_____Gcon_51)
                                          ,ADRESSE(vecteurs_____Gcon_52)
                                          ,ADRESSE(vecteurs_____Gcon_53)
                                          ,ADRESSE(vecteurs_____Gcon_54)
                                          ,ADRESSE(vecteurs_____Gcon_55)
                                          ,ADRESSE(vecteurs_____Gcon_56)
                                          ,ADRESSE(vecteurs_____Gcon_57)
                                          ,ADRESSE(vecteurs_____Gcon_58)
                                          ,ADRESSE(vecteurs_____Gcon_59)
                                           )
                                )
                 )
     );
                                        /* Introduit le 20230730120025 afin de pourvoir indexer les 'vecteurs_____Gcon_*'...         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O T I O N   D E   " B I B L I O T H E Q U E "  :                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Certaines primitives sont en                                                                                   */
/*                  fait constituees d'un aiguillage                                                                                 */
/*                  portant sur la valeur de l'indicateur                                                                            */
/*                  'vecteurs_____num_bibliotheque' et qui fait                                                                      */
/*                  qu'alors tel ou tel code est                                                                                     */
/*                  execute.                                                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Int,ZINT(vecteurs_____num_bibliotheque,BIBLIOTHEQUE_00)));
                                        /* Numero de la bibliotheque courante.                                                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A I T E M E N T   D E S   D E F I N I T I O N S   I N E X I S T A N T E S  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgLinex,PARENTHESES_DES_FONCTIONS,Linex))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

                                        /* Definition inexistante.                                                                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   N E U T R E  :                                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgLneutre,PARENTHESES_DES_FONCTIONS                        /* Common,DEFV(Fonction,) :      */
                                        ,BLOC(
                                              )
                                         )
     )

EFonctionI

                                        /* Caractere "neutre".                                                                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        Q U E L Q U E S   M A C R O S   G R A P H I Q U E S   U T I L E S                                                          */
/*        P O U R   L A   G E S T I O N   D E S   B I B L I O T H E Q U E S  :                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Utilisation :                                                                                                              */
/*                                                                                                                                   */
/*                  SET_BIBLIOTHEQUE(nom de bibliotheque);                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R I M I T I V E S   G R A P H I Q U E S   D E   B A S E  :                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definitions :                                                                                                              */
/*                                                                                                                                   */
/*                  "PO;"               : mise du curseur a l'origine.                                                               */
/*                  "PA;"               : definition de l'origine d'un segment.                                                      */
/*                  "PS;"               : definition de l'extremite d'un segment et trace.                                           */
/*                  "PB;"               : definition de l'extremite d'un segment et trace, puis chainage.                            */
/*                  "M1;"               : deplacement 'EST',                                                                         */
/*                  "M3;"               : deplacement 'OUEST'.                                                                       */
/*                  "M2;"               : deplacement 'NORD',                                                                        */
/*                  "M4;"               : deplacement 'SUD'.                                                                         */
/*                  "M5;"               : deplacement 'AVANT',                                                                       */
/*                  "M6;"               : deplacement 'ARRIERE'.                                                                     */
/*                  "SK(k);"            : definition de l'echelle globale telle que l'unite soit l'inter-point "physique",           */
/*                  "SKH(k);"           : definition homothetique de l'echelle globale telle que l'unite soit dans le                */
/*                                        rapport des dimensions de l'image courante definies dans 'format' aux                      */
/*                                        dimensions de l'image de BASE definies aussi dans 'format'.                                */
/*                  "SX(x);"            : definition de l'echelle sur l'axe des 'X',                                                 */
/*                  "SY(y);"            : definition de l'echelle sur l'axe des 'Y',                                                 */
/*                  "SZ(z);"            : definition de l'echelle sur l'axe des 'Z'.                                                 */
/*                  "XADDI;"            : incrementation de l'echelle sur l'axe des 'X',                                             */
/*                  "XSOUS;"            : incrementation de l'echelle sur l'axe des 'X',                                             */
/*                  "XMULT;"            : multiplication de l'echelle sur l'axe des 'X',                                             */
/*                  "XDIVI;"            : division de l'echelle sur l'axe des 'X',                                                   */
/*                  "YADDI;"            : incrementation de l'echelle sur l'axe des 'Y',                                             */
/*                  "YSOUS;"            : incrementation de l'echelle sur l'axe des 'Y',                                             */
/*                  "YMULT;"            : multiplication de l'echelle sur l'axe des 'Y',                                             */
/*                  "YDIVI;"            : division de l'echelle sur l'axe des 'Y',                                                   */
/*                  "ZADDI;"            : incrementation de l'echelle sur l'axe des 'Z',                                             */
/*                  "ZSOUS;"            : incrementation de l'echelle sur l'axe des 'Z',                                             */
/*                  "ZMULT;"            : multiplication de l'echelle sur l'axe des 'Z',                                             */
/*                  "ZDIVI;"            : division de l'echelle sur l'axe des 'Z',                                                   */
/*                  "MIK;"              : empilement de l'echelle globale.                                                           */
/*                  "MIX;"              : empilement de l'echelle sur l'axe des 'X',                                                 */
/*                  "MIY;"              : empilement de l'echelle sur l'axe des 'Y',                                                 */
/*                  "MIZ;"              : empilement de l'echelle sur l'axe des 'Z'.                                                 */
/*                  "MI1;"              : empilement de l'abscisse du curseur,                                                       */
/*                  "MI2;"              : empilement de l'ordonnee du curseur,                                                       */
/*                  "MI3;"              : empilement de la profondeur du curseur.                                                    */
/*                  "MIC;"              : empilement des trois coordonnees du curseur dans l'ordre (Z,Y,X),                          */
/*                  "MIT;"              : empilement de la matrice de transformation courante.                                       */
/*                  "MIN;"              : empilement des niveaux et des etats de trace dans l'ordre (min,max).                       */
/*                  "MON;"              : depilement des niveaux et des etats de trace dans l'ordre (min,max).                       */
/*                  "MOT;"              : depilement de la matrice de transformation courante.                                       */
/*                  "MOC;"              : depilement des trois coordonnees du curseur dans l'ordre {X,Y,Z}.                          */
/*                  "MO3;"              : depilement de la profondeur du curseur,                                                    */
/*                  "MO2;"              : depilement de l'ordonnee du curseur,                                                       */
/*                  "MO1;"              : depilement de l'abscisse du curseur.                                                       */
/*                  "MOZ;"              : depilement de l'echelle sur l'axe des 'Z',                                                 */
/*                  "MOY;"              : depilement de l'echelle sur l'axe des 'Y',                                                 */
/*                  "MOX;"              : depilement de l'echelle sur l'axe des 'X'.                                                 */
/*                  "MOK;"              : depilement de l'echelle globale.                                                           */
/*                  "T_INIT;"           : (re-)initialisation de la transformation courante.                                         */
/*                  "TRX1;"             : rotation autour de l'axe des 'X' de +pi/2,                                                 */
/*                  "TRX3;"             : rotation autour de l'axe des 'X' de -pi/2.                                                 */
/*                  "TRX(a);"           : rotation autour de l'axe des 'X' d'un angle exprime en radian.                             */
/*                  "TRY1;"             : rotation autour de l'axe des 'Y' de +pi/2,                                                 */
/*                  "TRY3;"             : rotation autour de l'axe des 'Y' de -pi/2.                                                 */
/*                  "TRY(a);"           : rotation autour de l'axe des 'Y' d'un angle exprime en radian.                             */
/*                  "TRZ1;"             : rotation autour de l'axe des 'Z' de +pi/2,                                                 */
/*                  "TRZ3;"             : rotation autour de l'axe des 'Z' de -pi/2.                                                 */
/*                  "TRZ(a);"           : rotation autour de l'axe des 'Z' d'un angle exprime en radian.                             */
/*                  "TSO;"              : symetrie origine (qui est le produit de trois symetries planes),                           */
/*                  "TSXY;"             : symetrie par rapport au plan 'XY',                                                         */
/*                  "TSYZ;"             : symetrie par rapport au plan 'YZ',                                                         */
/*                  "TSZX;"             : symetrie par rapport au plan 'ZX',                                                         */
/*                  "ERASE;"            : effacement de l'image de trace...                                                          */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   PO                                                                                                                            \
                    Bblock                                                                                                              \
                    SET_CURSOR(FXorigine,FYorigine,FZorigine);                                                                          \
                    Eblock                                                                                                              \
                                        /* "O" : mise du curseur a l'origine.                                                        */
#define   PA                                                                                                                            \
                    Bblock                                                                                                              \
                    ORIGINE(ASD1(vecteurs_____cursor_3D,x),ASD1(vecteurs_____cursor_3D,y),ASD1(vecteurs_____cursor_3D,z));              \
                    Eblock                                                                                                              \
                                        /* "A" : definition de l'origine d'un segment.                                               */
#define   PS                                                                                                                            \
                    Bblock                                                                                                              \
                    EXTREMITE(ASD1(vecteurs_____cursor_3D,x),ASD1(vecteurs_____cursor_3D,y),ASD1(vecteurs_____cursor_3D,z));            \
                    DRAW;                                                                                                               \
                    Eblock                                                                                                              \
                                        /* "S" : definition de l'extremite d'un segment et trace.                                    */
#define   PB                                                                                                                            \
                    Bblock                                                                                                              \
                    PS;                                                                                                                 \
                    PA;                                                                                                                 \
                    Eblock                                                                                                              \
                                        /* "B" : definition de l'extremite d'un segment et trace, puis chainage.                     */

#define   MOINS_I                                                                                                                       \
                    NEGA(I)
#define   ___ZERO                                                                                                                       \
                    ZERO
#define   PLUS__I                                                                                                                       \
                    NEUT(I)
                                        /* Uniquement afin de faire une belle presentation des 'MOVE' qui suivent...                 */

#define   M1                                                                                                                            \
                    Bblock                                                                                                              \
                    MOVE(PLUS__I,___ZERO,___ZERO);                                                                                      \
                    Eblock                                                                                                              \
                                        /* "1" : deplacement 'EST',                                                                  */
#define   M3                                                                                                                            \
                    Bblock                                                                                                              \
                    MOVE(MOINS_I,___ZERO,___ZERO);                                                                                      \
                    Eblock                                                                                                              \
                                        /* "3" : deplacement 'OUEST'.                                                                */
#define   M2                                                                                                                            \
                    Bblock                                                                                                              \
                    MOVE(___ZERO,PLUS__I,___ZERO);                                                                                      \
                    Eblock                                                                                                              \
                                        /* "2" : deplacement 'NORD',                                                                 */
#define   M4                                                                                                                            \
                    Bblock                                                                                                              \
                    MOVE(___ZERO,MOINS_I,___ZERO);                                                                                      \
                    Eblock                                                                                                              \
                                        /* "4" : deplacement 'SUD'.                                                                  */
#define   M5                                                                                                                            \
                    Bblock                                                                                                              \
                    MOVE(___ZERO,___ZERO,PLUS__I);                                                                                      \
                    Eblock                                                                                                              \
                                        /* "5" : deplacement 'AVANT',                                                                */
#define   M6                                                                                                                            \
                    Bblock                                                                                                              \
                    MOVE(___ZERO,___ZERO,MOINS_I);                                                                                      \
                    Eblock                                                                                                              \
                                        /* "6" : deplacement 'ARRIERE'.                                                              */

#define   SCALE_GLOBALE_OX                                                                                                              \
                    _____lNORMALISE_OX(I___vecteurs_____scale_globale)                                                                  \
                                        /* En effet, pour 'XADDI' et 'XSOUS', ce n'est pas 'vecteurs_____scale_globale' qui est a    */ \
                                        /* utiliser, mais plutot une version denormalisee (dans [0,1])...                            */
#define   SCALE_GLOBALE_OY                                                                                                              \
                    _____lNORMALISE_OY(I___vecteurs_____scale_globale)                                                                  \
                                        /* En effet, pour 'YADDI' et 'YSOUS', ce n'est pas 'vecteurs_____scale_globale' qui est a    */ \
                                        /* utiliser, mais plutot une version denormalisee (dans [0,1])...                            */
#define   SCALE_GLOBALE_OZ                                                                                                              \
                    _____lNORMALISE_OZ(I___vecteurs_____scale_globale)                                                                  \
                                        /* En effet, pour 'ZADDI' et 'ZSOUS', ce n'est pas 'vecteurs_____scale_globale' qui est a    */ \
                                        /* utiliser, mais plutot une version denormalisee (dans [0,1])...                            */

#define   XADDI                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OX,ADD2(I___vecteurs_____scale_OX,SCALE_GLOBALE_OX));                                       \
                    Eblock                                                                                                              \
                                        /* "X+" : incrementation de l'echelle sur l'axe des 'X',                                     */
#define   XSOUS                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OX,SOUS(I___vecteurs_____scale_OX,SCALE_GLOBALE_OX));                                       \
                    Eblock                                                                                                              \
                                        /* "X-" : incrementation de l'echelle sur l'axe des 'X',                                     */
#define   XMULT                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OX,MUL2(I___vecteurs_____scale_OX,I___vecteurs_____scale_globale));                         \
                    Eblock                                                                                                              \
                                        /* "X*" : multiplication de l'echelle sur l'axe des 'X',                                     */
#define   XDIVI                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OX,DIVZ(I___vecteurs_____scale_OX,I___vecteurs_____scale_globale));                         \
                    Eblock                                                                                                              \
                                        /* "X/" : division de l'echelle sur l'axe des 'X',                                           */
#define   YADDI                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OY,ADD2(I___vecteurs_____scale_OY,SCALE_GLOBALE_OY));                                       \
                    Eblock                                                                                                              \
                                        /* "Y+" : incrementation de l'echelle sur l'axe des 'Y',                                     */
#define   YSOUS                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OY,SOUS(I___vecteurs_____scale_OY,SCALE_GLOBALE_OY));                                       \
                    Eblock                                                                                                              \
                                        /* "Y-" : incrementation de l'echelle sur l'axe des 'Y',                                     */
#define   YMULT                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OY,MUL2(I___vecteurs_____scale_OY,I___vecteurs_____scale_globale));                         \
                    Eblock                                                                                                              \
                                        /* "Y*" : multiplication de l'echelle sur l'axe des 'Y',                                     */
#define   YDIVI                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OY,DIVZ(I___vecteurs_____scale_OY,I___vecteurs_____scale_globale));                         \
                    Eblock                                                                                                              \
                                        /* "Y/" : division de l'echelle sur l'axe des 'Y',                                           */
#define   ZADDI                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OZ,ADD2(I___vecteurs_____scale_OZ,SCALE_GLOBALE_OZ));                                       \
                    Eblock                                                                                                              \
                                        /* "Z+" : incrementation de l'echelle sur l'axe des 'Z',                                     */
#define   ZSOUS                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OZ,SOUS(I___vecteurs_____scale_OZ,SCALE_GLOBALE_OZ));                                       \
                    Eblock                                                                                                              \
                                        /* "Z-" : incrementation de l'echelle sur l'axe des 'Z',                                     */
#define   ZMULT                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OZ,MUL2(I___vecteurs_____scale_OZ,I___vecteurs_____scale_globale));                         \
                    Eblock                                                                                                              \
                                        /* "Z*" : multiplication de l'echelle sur l'axe des 'Z',                                     */
#define   ZDIVI                                                                                                                         \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____scale_OZ,DIVZ(I___vecteurs_____scale_OZ,I___vecteurs_____scale_globale));                         \
                    Eblock                                                                                                              \
                                        /* "Z/" : division de l'echelle sur l'axe des 'Z',                                           */

#define   MIK                                                                                                                           \
                    Bblock                                                                                                              \
                    GpushF(I___vecteurs_____scale_globale);                                                                             \
                    Eblock                                                                                                              \
                                        /* "MIK;" : empilement de l'echelle globale.                                                 */
#define   MIX                                                                                                                           \
                    Bblock                                                                                                              \
                    GpushF(I___vecteurs_____scale_OX);                                                                                  \
                    Eblock                                                                                                              \
                                        /* "MIX;" : empilement de l'echelle sur l'axe des 'X',                                       */
#define   MIY                                                                                                                           \
                    Bblock                                                                                                              \
                    GpushF(I___vecteurs_____scale_OY);                                                                                  \
                    Eblock                                                                                                              \
                                        /* "MIY;" : empilement de l'echelle sur l'axe des 'Y',                                       */
#define   MIZ                                                                                                                           \
                    Bblock                                                                                                              \
                    GpushF(I___vecteurs_____scale_OZ);                                                                                  \
                    Eblock                                                                                                              \
                                        /* "MIZ;" : empilement de l'echelle sur l'axe des 'Z'.                                       */
#define   MI1                                                                                                                           \
                    Bblock                                                                                                              \
                    GpushF(ASD1(vecteurs_____cursor_3D,x));                                                                             \
                    Eblock                                                                                                              \
                                        /* "MI1;" : empilement de l'abscisse du curseur,                                             */
#define   MI2                                                                                                                           \
                    Bblock                                                                                                              \
                    GpushF(ASD1(vecteurs_____cursor_3D,y));                                                                             \
                    Eblock                                                                                                              \
                                        /* "MI2;" : empilement de l'ordonnee du curseur,                                             */
#define   MI3                                                                                                                           \
                    Bblock                                                                                                              \
                    GpushF(ASD1(vecteurs_____cursor_3D,z));                                                                             \
                    Eblock                                                                                                              \
                                        /* "MI3;" : empilement de la profondeur du curseur.                                          */
#define   MIC                                                                                                                           \
                    Bblock                                                                                                              \
                    MI3;                                                                                                                \
                    MI2;                                                                                                                \
                    MI1;                                                                                                                \
                    Eblock                                                                                                              \
                                        /* "MIC;" : empilement des trois coordonnees du curseur dans l'ordre (Z,Y,X),                */
#define   MIT                                                                                                                           \
                    Bblock                                                                                                              \
                    GpushI(vecteurs_____etat_matrix);                                                                                   \
                                                                                                                                        \
                    GpushF(vecteurs_____rapport_de_zoom_cumule_courant);                                                                \
                                                                                                                                        \
                    GpushF(vecteurs_____angle_de_rotation);                                                                             \
                                                                                                                                        \
                    GpushF(ASD2(vecteurs_____matrix_3D,cx,cx));                                                                         \
                    GpushF(ASD2(vecteurs_____matrix_3D,cx,cy));                                                                         \
                    GpushF(ASD2(vecteurs_____matrix_3D,cx,cz));                                                                         \
                                                                                                                                        \
                    GpushF(ASD2(vecteurs_____matrix_3D,cy,cx));                                                                         \
                    GpushF(ASD2(vecteurs_____matrix_3D,cy,cy));                                                                         \
                    GpushF(ASD2(vecteurs_____matrix_3D,cy,cz));                                                                         \
                                                                                                                                        \
                    GpushF(ASD2(vecteurs_____matrix_3D,cz,cx));                                                                         \
                    GpushF(ASD2(vecteurs_____matrix_3D,cz,cy));                                                                         \
                    GpushF(ASD2(vecteurs_____matrix_3D,cz,cz));                                                                         \
                    Eblock                                                                                                              \
                                        /* "MIT;" : empilement de la matrice de transformation courante.                             */
#define   MIN                                                                                                                           \
                    Bblock                                                                                                              \
                    GpushI(vecteurs_____niveau_minimal);                                                                                \
                    GpushI(vecteurs_____niveau_maximal);                                                                                \
                    GpushI(vecteurs_____pointilles);                                                                                    \
                    GpushI(vecteurs_____etat_trace);                                                                                    \
                    GpushI(vecteurs_____etat_anti_aliasing);                                                                            \
                    GpushI(noir_plancher_des_vecteurs);                                                                                 \
                    Eblock                                                                                                              \
                                        /* Empilement des niveaux, des etats de trace et du "noir-plancher" des vecteurs.            */
#define   MON                                                                                                                           \
                    Bblock                                                                                                              \
                    GpullI(GENP,noir_plancher_des_vecteurs);                                                                            \
                    GpullI(LOGI,vecteurs_____etat_anti_aliasing);                                                                       \
                    GpullI(LOGI,vecteurs_____etat_trace);                                                                               \
                    GpullI(POSI,vecteurs_____pointilles);                                                                               \
                    GpullI(GENP,vecteurs_____niveau_maximal);                                                                           \
                    GpullI(GENP,vecteurs_____niveau_minimal);                                                                           \
                    Eblock                                                                                                              \
                                        /* Depilement des niveaux, des etats de trace et du "noir-plancher" des vecteurs.            */
#define   MOT                                                                                                                           \
                    Bblock                                                                                                              \
                    GpullF(ASD2(vecteurs_____matrix_3D,cz,cz));                                                                         \
                    GpullF(ASD2(vecteurs_____matrix_3D,cz,cy));                                                                         \
                    GpullF(ASD2(vecteurs_____matrix_3D,cz,cx));                                                                         \
                                                                                                                                        \
                    GpullF(ASD2(vecteurs_____matrix_3D,cy,cz));                                                                         \
                    GpullF(ASD2(vecteurs_____matrix_3D,cy,cy));                                                                         \
                    GpullF(ASD2(vecteurs_____matrix_3D,cy,cx));                                                                         \
                                                                                                                                        \
                    GpullF(ASD2(vecteurs_____matrix_3D,cx,cz));                                                                         \
                    GpullF(ASD2(vecteurs_____matrix_3D,cx,cy));                                                                         \
                    GpullF(ASD2(vecteurs_____matrix_3D,cx,cx));                                                                         \
                                                                                                                                        \
                    GpullF(vecteurs_____angle_de_rotation);                                                                             \
                                                                                                                                        \
                    GpullF(vecteurs_____rapport_de_zoom_cumule_courant);                                                                \
                                                                                                                                        \
                    GpullI(LOGI,vecteurs_____etat_matrix);                                                                              \
                    Eblock                                                                                                              \
                                        /* "MOT;" : depilement de la matrice de transformation courante.                             */
#define   MOC                                                                                                                           \
                    Bblock                                                                                                              \
                    MO1;                                                                                                                \
                    MO2;                                                                                                                \
                    MO3;                                                                                                                \
                    Eblock                                                                                                              \
                                        /* "MOC;" : depilement des trois coordonnees du curseur dans l'ordre {X,Y,Z}.                */
#define   MO3                                                                                                                           \
                    Bblock                                                                                                              \
                    GpullF(ASD1(vecteurs_____cursor_3D,z));                                                                             \
                    Eblock                                                                                                              \
                                        /* "MO3;" : depilement de la profondeur du curseur,                                          */
#define   MO2                                                                                                                           \
                    Bblock                                                                                                              \
                    GpullF(ASD1(vecteurs_____cursor_3D,y));                                                                             \
                    Eblock                                                                                                              \
                                        /* "MO2;" : depilement de l'ordonnee du curseur,                                             */
#define   MO1                                                                                                                           \
                    Bblock                                                                                                              \
                    GpullF(ASD1(vecteurs_____cursor_3D,x));                                                                             \
                    Eblock                                                                                                              \
                                        /* "MO1;" : depilement de l'abscisse du curseur.                                             */
#define   MOZ                                                                                                                           \
                    Bblock                                                                                                              \
                    GpullF(vecteurs_____scale_OZ);                                                                                      \
                    Eblock                                                                                                              \
                                        /* "MOZ;" : depilement de l'echelle sur l'axe des 'Z',                                       */
#define   MOY                                                                                                                           \
                    Bblock                                                                                                              \
                    GpullF(vecteurs_____scale_OY);                                                                                      \
                    Eblock                                                                                                              \
                                        /* "MOY;" : depilement de l'echelle sur l'axe des 'Y',                                       */
#define   MOX                                                                                                                           \
                    Bblock                                                                                                              \
                    GpullF(vecteurs_____scale_OX);                                                                                      \
                    Eblock                                                                                                              \
                                        /* "MOX;" : depilement de l'echelle sur l'axe des 'X'.                                       */
#define   MOK                                                                                                                           \
                    Bblock                                                                                                              \
                    GpullF(vecteurs_____scale_globale);                                                                                 \
                    Eblock                                                                                                              \
                                        /* "MOK;" : depilement de l'echelle globale.                                                 */

#define   __________________FZERO                                                                                                       \
                    FZERO                                                                                                               \
                                        /* Uniquement afin de faire une belle presentation des 'MOVE' qui suivent...                 */
#define   T_INIT                                                                                                                        \
                    Bblock                                                                                                              \
                    EGAL(vecteurs_____rapport_de_zoom_cumule_courant,ABSENCE_D_EFFET_DE_ZOOM);                                          \
                    EGAL(vecteurs_____angle_de_rotation,ABSENCE_DE_ROTATION);                                                           \
                    INITIALISATION_MATRICE_3D                                                                                           \
                        (vecteurs_____matrix_3D                                                                                         \
                        ,ABSENCE_D_EFFET_DE_ZOOM,__________________FZERO,__________________FZERO                                        \
                        ,__________________FZERO,ABSENCE_D_EFFET_DE_ZOOM,__________________FZERO                                        \
                        ,__________________FZERO,__________________FZERO,ABSENCE_D_EFFET_DE_ZOOM                                        \
                         );                                                                                                             \
                    EGAL(vecteurs_____etat_matrix,VALIDE);                                                                              \
                    Eblock                                                                                                              \
                                        /* (re-)initialisation de la transformation courante.                                        */
#define   TRX1                                                                                                                          \
                    Bblock                                                                                                              \
                    T_ROTATION_X(NEUT(PI_SUR_2))                                                                                        \
                    Eblock                                                                                                              \
                                        /* "TRX1;" : rotation autour de l'axe des 'X' de +pi/2,                                      */
#define   TRX3                                                                                                                          \
                    Bblock                                                                                                              \
                    T_ROTATION_X(NEGA(PI_SUR_2))                                                                                        \
                    Eblock                                                                                                              \
                                        /* "TRX3;" : rotation autour de l'axe des 'X' de -pi/2.                                      */
#define   TRY1                                                                                                                          \
                    Bblock                                                                                                              \
                    T_ROTATION_Y(NEUT(PI_SUR_2))                                                                                        \
                    Eblock                                                                                                              \
                                        /* "TRY1;" : rotation autour de l'axe des 'Y' de +pi/2,                                      */
#define   TRY3                                                                                                                          \
                    Bblock                                                                                                              \
                    T_ROTATION_Y(NEGA(PI_SUR_2))                                                                                        \
                    Eblock                                                                                                              \
                                        /* "TRY3;" : rotation autour de l'axe des 'Y' de -pi/2.                                      */
#define   TRZ1                                                                                                                          \
                    Bblock                                                                                                              \
                    T_ROTATION_Z(NEUT(PI_SUR_2))                                                                                        \
                    Eblock                                                                                                              \
                                        /* "TRZ1;" : rotation autour de l'axe des 'Z' de +pi/2,                                      */
#define   TRZ3                                                                                                                          \
                    Bblock                                                                                                              \
                    T_ROTATION_Z(NEGA(PI_SUR_2))                                                                                        \
                    Eblock                                                                                                              \
                                        /* "TRZ3;" : rotation autour de l'axe des 'Z' de -pi/2.                                      */
#define   TSO                                                                                                                           \
                    Bblock                                                                                                              \
                    TSXY;TSYZ;TSZX;                                                                                                     \
                    Eblock                                                                                                              \
                                        /* "TSO;" : symetrie origine (qui est le produit de trois symetries planes),                 */
#define   TSXY                                                                                                                          \
                    Bblock                                                                                                              \
                    T_PRODUIT_MATRICIEL(vecteurs_____matrix_3D                                                                          \
                                       ,FU       ,FZERO    ,FZERO                                                                       \
                                       ,FZERO    ,FU       ,FZERO                                                                       \
                                       ,FZERO    ,FZERO    ,NEGA(FU)                                                                    \
                                        );                                                                                              \
                    Eblock                                                                                                              \
                                        /* "TSXY;" : symetrie par rapport au plan 'XY',                                              */
#define   TSYZ                                                                                                                          \
                    Bblock                                                                                                              \
                    T_PRODUIT_MATRICIEL(vecteurs_____matrix_3D                                                                          \
                                       ,NEGA(FU) ,FZERO    ,FZERO                                                                       \
                                       ,FZERO    ,FU       ,FZERO                                                                       \
                                       ,FZERO    ,FZERO    ,FU                                                                          \
                                        );                                                                                              \
                    Eblock                                                                                                              \
                                        /* "TSYZ;" : symetrie par rapport au plan 'YZ',                                              */
#define   TSZX                                                                                                                          \
                    Bblock                                                                                                              \
                    T_PRODUIT_MATRICIEL(vecteurs_____matrix_3D                                                                          \
                                       ,FU       ,FZERO    ,FZERO                                                                       \
                                       ,FZERO    ,NEGA(FU) ,FZERO                                                                       \
                                       ,FZERO    ,FZERO    ,FU                                                                          \
                                        );                                                                                              \
                    Eblock                                                                                                              \
                                        /* "TSZX;" : symetrie par rapport au plan 'ZX',                                              */

#define   ERASE                                                                                                                         \
                    Bblock                                                                                                              \
                    CALi(Inoir(ImageG));                                                                                                \
                    Eblock                                                                                                              \
                                        /* Effacement de l'image de trace. ATTENTION, il y avait autrefois :                         */ \
                                        /*                                                                                           */ \
                                        /*                  CALS(Inoir(ImageG));                                                     */ \
                                        /*                                                                                           */ \
                                        /* mais c'est en fait plus sage d'utiliser 'CALi(...)'.                                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   G R A P H I Q U E S   P R I M I T I V E S  :                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definitions :                                                                                                              */
/*                                                                                                                                   */
/*                  "FgSET_CURSOR(ARGUMENT_POINTERs(point_3D));"                                                                     */
/*                                      : positionnement absolu du curseur.                                                          */
/*                  "FgPO();"           : mise du curseur a l'origine.                                                               */
/*                  "FgPA();"           : definition de l'origine d'un segment.                                                      */
/*                  "FgPS();"           : definition de l'extremite d'un segment et trace.                                           */
/*                  "FgPB();"           : definition de l'extremite d'un segment et trace, puis chainage.                            */
/*                  "FgM1();"           : deplacement 'EST',                                                                         */
/*                  "FgM3();"           : deplacement 'OUEST'.                                                                       */
/*                  "FgM2();"           : deplacement 'NORD',                                                                        */
/*                  "FgM4();"           : deplacement 'SUD'.                                                                         */
/*                  "FgM5();"           : deplacement 'AVANT',                                                                       */
/*                  "FgM6();"           : deplacement 'ARRIERE'.                                                                     */
/*                  "FgXADDI();"        : incrementation de l'echelle sur l'axe des 'X',                                             */
/*                  "FgXSOUS();"        : incrementation de l'echelle sur l'axe des 'X',                                             */
/*                  "FgXMULT();"        : multiplication de l'echelle sur l'axe des 'X',                                             */
/*                  "FgXDIVI();"        : division de l'echelle sur l'axe des 'X',                                                   */
/*                  "FgYADDI();"        : incrementation de l'echelle sur l'axe des 'Y',                                             */
/*                  "FgYSOUS();"        : incrementation de l'echelle sur l'axe des 'Y',                                             */
/*                  "FgYMULT();"        : multiplication de l'echelle sur l'axe des 'Y',                                             */
/*                  "FgYDIVI();"        : division de l'echelle sur l'axe des 'Y',                                                   */
/*                  "FgZADDI();"        : incrementation de l'echelle sur l'axe des 'Z',                                             */
/*                  "FgZSOUS();"        : incrementation de l'echelle sur l'axe des 'Z',                                             */
/*                  "FgZMULT();"        : multiplication de l'echelle sur l'axe des 'Z',                                             */
/*                  "FgZDIVI();"        : division de l'echelle sur l'axe des 'Z',                                                   */
/*                  "FgMIK();"          : empilement de l'echelle globale.                                                           */
/*                  "FgMIX();"          : empilement de l'echelle sur l'axe des 'X',                                                 */
/*                  "FgMIY();"          : empilement de l'echelle sur l'axe des 'Y',                                                 */
/*                  "FgMIZ();"          : empilement de l'echelle sur l'axe des 'Z'.                                                 */
/*                  "FgMI1();"          : empilement de l'abscisse du curseur,                                                       */
/*                  "FgMI2();"          : empilement de l'ordonnee du curseur,                                                       */
/*                  "FgMI3();"          : empilement de la profondeur du curseur.                                                    */
/*                  "FgMIC();"          : empilement des trois coordonnees du curseur dans l'ordre (Z,Y,X),                          */
/*                  "FgMIT();"          : empilement de la matrice de transformation courante.                                       */
/*                  "FgMIN();"          : empilement des niveaux, des etats de trace et du "noir-plancher" des vecteurs.             */
/*                  "FgMON();"          : depilement des niveaux, des etats de trace et du "noir-plancher" des vecteurs.             */
/*                  "FgMOT();"          : depilement de la matrice de transformation courante.                                       */
/*                  "FgMOC();"          : depilement des trois coordonnees du curseur dans l'ordre {X,Y,Z}.                          */
/*                  "FgMO3();"          : depilement de la profondeur du curseur,                                                    */
/*                  "FgMO2();"          : depilement de l'ordonnee du curseur,                                                       */
/*                  "FgMO1();"          : depilement de l'abscisse du curseur.                                                       */
/*                  "FgMOZ();"          : depilement de l'echelle sur l'axe des 'Z',                                                 */
/*                  "FgMOY();"          : depilement de l'echelle sur l'axe des 'Y',                                                 */
/*                  "FgMOX();"          : depilement de l'echelle sur l'axe des 'X'.                                                 */
/*                  "FgMOK();"          : depilement de l'echelle globale.                                                           */
/*                  "FgT_INIT();"       : (re-)initialisation de la transformation courante.                                         */
/*                  "FgTRX1();"         : rotation autour de l'axe des 'X' de +pi/2,                                                 */
/*                  "FgTRX3();"         : rotation autour de l'axe des 'X' de -pi/2.                                                 */
/*                  "FgTRY1();"         : rotation autour de l'axe des 'Y' de +pi/2,                                                 */
/*                  "FgTRY3();"         : rotation autour de l'axe des 'Y' de -pi/2.                                                 */
/*                  "FgTRZ1();"         : rotation autour de l'axe des 'Z' de +pi/2,                                                 */
/*                  "FgTRZ3();"         : rotation autour de l'axe des 'Z' de -pi/2.                                                 */
/*                  "FgTSO();"          : symetrie origine (qui est le produit de trois symetries planes),                           */
/*                  "FgTSXY();"         : symetrie par rapport au plan 'XY',                                                         */
/*                  "FgTSYZ();"         : symetrie par rapport au plan 'YZ',                                                         */
/*                  "FgTSZX();"         : symetrie par rapport au plan 'ZX',                                                         */
/*                  "FgERASE();"        : effacement de l'image de trace...                                                          */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P O S I T I O N N E M E N T   D U   C U R S E U R   G R A P H I Q U E  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FgSET_CURSOR(ARGUMENT_POINTERs(point_3D))))
DEFV(Argument,DEFV(pointF_3D,POINTERs(point_3D)));
                                        /* Point flottant argument dont les coordonnees sont normalisees dans [0,1[,                 */
                                        /* et sur lequel on va positionner le curseur graphique.                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     SET_CURSOR(ASI1(point_3D,x),ASI1(point_3D,y),ASI1(point_3D,z));
                                        /* Et ainsi, on positionne le curseur graphique...                                           */
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgT_INIT,PARENTHESES_DES_FONCTIONS,T_INIT))                /* Common,DEFV(Fonction,) :      */

EFonctionI

                                        /* ATTENTION : la fonction 'FgT_INIT(...)' doit etre la premiere car beaucoup d'autres       */
                                        /* la referencent via 'INITIALISATION_TRANSFORMATION' dans 'MOVE(dX,dY,dZ)'...               */

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgPO,PARENTHESES_DES_FONCTIONS,PO))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgPA,PARENTHESES_DES_FONCTIONS,PA))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgPS,PARENTHESES_DES_FONCTIONS,PS))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgPB,PARENTHESES_DES_FONCTIONS,PB))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM1,PARENTHESES_DES_FONCTIONS,M1))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM2,PARENTHESES_DES_FONCTIONS,M2))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM3,PARENTHESES_DES_FONCTIONS,M3))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM4,PARENTHESES_DES_FONCTIONS,M4))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM5,PARENTHESES_DES_FONCTIONS,M5))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgM6,PARENTHESES_DES_FONCTIONS,M6))                        /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgXADDI,PARENTHESES_DES_FONCTIONS,XADDI))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgXSOUS,PARENTHESES_DES_FONCTIONS,XSOUS))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgXMULT,PARENTHESES_DES_FONCTIONS,XMULT))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgXDIVI,PARENTHESES_DES_FONCTIONS,XDIVI))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgYADDI,PARENTHESES_DES_FONCTIONS,YADDI))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgYSOUS,PARENTHESES_DES_FONCTIONS,YSOUS))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgYMULT,PARENTHESES_DES_FONCTIONS,YMULT))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgYDIVI,PARENTHESES_DES_FONCTIONS,YDIVI))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgZADDI,PARENTHESES_DES_FONCTIONS,ZADDI))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgZSOUS,PARENTHESES_DES_FONCTIONS,ZSOUS))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgZMULT,PARENTHESES_DES_FONCTIONS,ZMULT))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgZDIVI,PARENTHESES_DES_FONCTIONS,ZDIVI))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIK,PARENTHESES_DES_FONCTIONS,MIK))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIX,PARENTHESES_DES_FONCTIONS,MIX))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIY,PARENTHESES_DES_FONCTIONS,MIY))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIZ,PARENTHESES_DES_FONCTIONS,MIZ))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMI1,PARENTHESES_DES_FONCTIONS,MI1))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMI2,PARENTHESES_DES_FONCTIONS,MI2))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMI3,PARENTHESES_DES_FONCTIONS,MI3))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIC,PARENTHESES_DES_FONCTIONS,MIC))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIT,PARENTHESES_DES_FONCTIONS,MIT))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMIN,PARENTHESES_DES_FONCTIONS,MIN))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMON,PARENTHESES_DES_FONCTIONS,MON))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOT,PARENTHESES_DES_FONCTIONS,MOT))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOC,PARENTHESES_DES_FONCTIONS,MOC))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMO3,PARENTHESES_DES_FONCTIONS,MO3))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMO2,PARENTHESES_DES_FONCTIONS,MO2))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMO1,PARENTHESES_DES_FONCTIONS,MO1))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOZ,PARENTHESES_DES_FONCTIONS,MOZ))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOY,PARENTHESES_DES_FONCTIONS,MOY))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOX,PARENTHESES_DES_FONCTIONS,MOX))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgMOK,PARENTHESES_DES_FONCTIONS,MOK))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRX1,PARENTHESES_DES_FONCTIONS,TRX1))                    /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRX3,PARENTHESES_DES_FONCTIONS,TRX3))                    /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRY1,PARENTHESES_DES_FONCTIONS,TRY1))                    /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRY3,PARENTHESES_DES_FONCTIONS,TRY3))                    /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRZ1,PARENTHESES_DES_FONCTIONS,TRZ1))                    /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTRZ3,PARENTHESES_DES_FONCTIONS,TRZ3))                    /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTSO,PARENTHESES_DES_FONCTIONS,TSO))                      /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTSXY,PARENTHESES_DES_FONCTIONS,TSXY))                    /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTSYZ,PARENTHESES_DES_FONCTIONS,TSYZ))                    /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgTSZX,PARENTHESES_DES_FONCTIONS,TSZX))                    /* Common,DEFV(Fonction,) :      */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_GRAPHIQUES(FgERASE,PARENTHESES_DES_FONCTIONS,ERASE))                  /* Common,DEFV(Fonction,) :      */

EFonctionI

#undef    PO
#undef    PA
#undef    PS
#undef    PB

#undef    PLUS__I
#undef    ___ZERO
#undef    MOINS_I

#undef    M1
#undef    M3
#undef    M2
#undef    M4
#undef    M5
#undef    M6

#undef    SCALE_GLOBALE_OZ
#undef    SCALE_GLOBALE_OY
#undef    SCALE_GLOBALE_OX

#undef    XADDI
#undef    XSOUS
#undef    XMULT
#undef    XDIVI
#undef    YADDI
#undef    YSOUS
#undef    YMULT
#undef    YDIVI
#undef    ZADDI
#undef    ZSOUS
#undef    ZMULT
#undef    ZDIVI
#undef    MIK
#undef    MIX
#undef    MIY
#undef    MIZ
#undef    MI1
#undef    MI2
#undef    MI3
#undef    MIC
#undef    MIT
#undef    MIN
#undef    MON
#undef    MOT
#undef    MOC
#undef    MO3
#undef    MO2
#undef    MO1
#undef    MOZ
#undef    MOY
#undef    MOX
#undef    T_INIT
#undef    __________________FZERO
#undef    MOK
#undef    TRX1
#undef    TRX3
#undef    TRY1
#undef    TRY3
#undef    TRZ1
#undef    TRZ3
#undef    TSO
#undef    TSXY
#undef    TSYZ
#undef    TSZX
#undef    ERASE

_______________________________________________________________________________________________________________________________________



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.