/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   D E   L ' A N T I - A L I A S I N G  :                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrq/nucleon.LP$I' :                                                                                            */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1991??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A I T E M E N T   D E   L ' A N T I - A L I A S I N G   P R E S   D U                                                  */
/*        C O N T O U R   A P P A R E N T   D ' U N E   S P H E R E  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING                                                                                      \
                    FLOT(QUATRE)
DEFV(Local,DEFV(Float,INIT(epaisseur_de_la_couronne_d_anti_aliasing,EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING)));
DEFV(Local,DEFV(Float,INIT(epaisseur_de_la_couronne_d_anti_aliasing_effective,FLOT__UNDEF)));
                                        /* Epaisseur (exprimee en nombre de points) de la couronne (externe) des spheres sur         */
                                        /* laquelle le traitement anti-aliasing sera effectue. On notera que prendre ici une         */
                                        /* valeur egale a 'FZERO' revient a supprimer la correction. On notera que suivant le        */
                                        /* type d'interpolation, cette valeur peut etre modifiee :                                   */
                                        /*                                                                                           */
                                        /*                  2.0     : INTERPOLATION_LINEAIRE(...),                                   */
                                        /*                  3.0     : INTERPOLATION_CUBIQUE(...).                                    */
                                        /*                                                                                           */
                                        /* ATTENTION, ce parametre 'epaisseur_de_la_couronne_d_anti_aliasing' ("couronne=")          */
                                        /* associe au parametre 'attenuation_au_bord_d_un_disque' ("attenuation_au_bord=") peut,     */
                                        /* comme cela s'est vu en generant la sequence :                                             */
                                        /*                                                                                           */
                                        /*                  xivPdf 9 2 / 026783_027294                                               */
                                        /*                                                                                           */
                                        /* avoir des effets visuels genants en ce qui concerne le rayon apparent des spheres         */
                                        /* (c'est-a-dire tel qu'elles sont vues). Il peut etre alors necessaire de "tricher" en      */
                                        /* augmentant le rayon (d'ou le parametre '$_____FacteurPsI' inferieur a 1 dans la dite      */
                                        /* sequence...).                                                                             */
                                        /*                                                                                           */
                                        /* Le 20060224113546 fut introduit 'epaisseur_de_la_couronne_d_anti_aliasing_effective'...   */
                                        /*                                                                                           */
                                        /* Le 20240424094430 le test suivant des deux parametres precedents fut introduit :          */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /*   :Debut_listG_TestAntiAlias:                                                             */
                                        /*                                                                                           */
                                        /*   $Z             FilSTmpB  FAnTi_AlIaSiNg                                                 */
                                        /*                                                                                           */
                                        /*   $Z             set       CoUrOnNe=4                                                     */
                                        /*   $Z             set       AtTeNuAtIoN=0.125                                              */
                                        /*                                                                                           */
                                        /*   $Z             set       CoOrD_XY=0.5                                                   */
                                        /*   $Z             set       CoOrD_Z1=0.5                                                   */
                                        /*   $Z             set       CoOrD_Z2=0.5                                                   */
                                        /*                                                                                           */
                                        /*   $Z             set       RaYoN=0.08                                                     */
                                        /*                                                                                           */
                                        /*   $Z             echo      "$CoOrD_XY""\n""$CoOrD_XY"    > $FAnTi_AlIaSiNg$COORD_X        */
                                        /*   $Z             echo      "$CoOrD_XY""\n""$CoOrD_XY"    > $FAnTi_AlIaSiNg$COORD_Y        */
                                        /*   $Z             echo      "$CoOrD_Z1""\n""$CoOrD_Z2"    > $FAnTi_AlIaSiNg$COORD_Z        */
                                        /*                                                                                           */
                                        /*   $Z             echo      "$BLANC""\n""$NOIR"           > $FAnTi_AlIaSiNg$ROUGE          */
                                        /*   $Z             echo      "$NOIR""\n""$BLANC"           > $FAnTi_AlIaSiNg$VERTE          */
                                        /*   $Z             echo      "$NOIR""\n""$NOIR"            > $FAnTi_AlIaSiNg$BLEUE          */
                                        /*                                                                                           */
                                        /*   $Z             echo      "$RaYoN""\n""$RaYoN"          > $FAnTi_AlIaSiNg$RAYON          */
                                        /*                                                                                           */
                                        /*   $Z             $xrv/particule.10$X                                                   \  */
                                        /*   $Z                       npoints=2                                                   \  */
                                        /*   $Z                       LISTE_X=$FAnTi_AlIaSiNg$COORD_X                             \  */
                                        /*   $Z                       LISTE_Y=$FAnTi_AlIaSiNg$COORD_Y                             \  */
                                        /*   $Z                       LISTE_Z=$FAnTi_AlIaSiNg$COORD_Z                             \  */
                                        /*   $Z                       LISTE_ROUGE=$FAnTi_AlIaSiNg$ROUGE                           \  */
                                        /*   $Z                       LISTE_VERTE=$FAnTi_AlIaSiNg$VERTE                           \  */
                                        /*   $Z                       LISTE_BLEUE=$FAnTi_AlIaSiNg$BLEUE                           \  */
                                        /*   $Z                       LISTE_RAYON=$FAnTi_AlIaSiNg$RAYON                           \  */
                                        /*   $Z                       ZBuffer_test_strict=FAUX                                    \  */
                                        /*   $Z                       couronne=$CoUrOnNe                                          \  */
                                        /*   $Z                       attenuation_au_bord=$AtTeNuAtIoN                            \  */
                                        /*   $Z                       chiffres=0 R=$FAnTi_AlIaSiNg.test                           \  */
                                        /*   $Z                                                     $formatI                         */
                                        /*                                                                                           */
                                        /*   $Z             v         $FAnTi_AlIaSiNg.test                                           */
                                        /*                                                                                           */
                                        /*   $Z             FilSTmpE  FAnTi_AlIaSiNg                                                 */
                                        /*                                                                                           */
                                        /*   :Fin_listG_TestAntiAlias:                                                               */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Puis on fera :                                                                            */
                                        /*                                                                                           */
                                        /*   listG     $xrq/nucleon.LP$I :Debut_listG_""TestAntiAlias: :Fin_listG_""TestAntiAlias:   */
                                        /*                                                                                           */
                                        /* pour generer le '$Z' a executer a des fins de test...                                     */

#define   MODULER_L_EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING                                                                            \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(moduler_l_epaisseur_de_la_couronne_d_anti_aliasing
                            ,MODULER_L_EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING
                             )
                )
     );
DEFV(Local,DEFV(Float,INIT(minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing,EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING)));
DEFV(Local,DEFV(Float,INIT(maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing,EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING)));
DEFV(Local,DEFV(Float,INIT(rayon_associe_au_minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing,FLOT__UNDEF)));
DEFV(Local,DEFV(Float,INIT(rayon_associe_au_maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing,FLOT__UNDEF)));
                                        /* Le 20060224115535 a ete introduite la possibilite de moduler l'epaisseur de la couronne   */
                                        /* des spheres 'epaisseur_de_la_couronne_d_anti_aliasing' en fonction du rayon courant...    */
                                        /* La valeur par defaut ('FAUX') garantit la compatibilite anterieure. On notera le          */
                                        /* 20060224123438 qu'il est impossible d'utiliser 'RAYON_DE_VISUALISATION' pour initialiser  */
                                        /* les deux rayons ci-dessus car, en effet, le symbole 'RAYON_DE_VISUALISATION' n'est en     */
                                        /* general pas encore defini. La valeur par defaut ne sera mise en place qu'avant la         */
                                        /* premiere recherche des parametres ('v $xrv/champs_5.1A$I PROKESS_ARGUMENT_F').            */

DEFV(Local,DEFV(Float,INIT(distance_critique_normalisee_au_bord,FLOT__UNDEF)));
                                        /* Distance normalisee dans [0,1] a laquelle peuvent se situer les niveaux maximaux ;        */
                                        /* au-dela ils doivent imperativement decroitre. On notera qu'une valeur superieure ou       */
                                        /* egale a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE' revient a supprimer la correction...          */

#define   CALCUL_DE_LA_DISTANCE_CRITIQUE_NORMALISEE_AU_BORD(rayon,Arayon)                                                               \
                                        /* L'argument 'Arayon' a ete introduit le 20060224145005 car c'est le parametre le plus      */ \
                                        /* "parlant" et sur lequel il est le plus facile d'agir de facon pertinente...               */ \
                    Bblock                                                                                                              \
                    Test(IL_NE_FAUT_PAS(moduler_l_epaisseur_de_la_couronne_d_anti_aliasing))                                            \
                         Bblock                                                                                                         \
                         EGAL(epaisseur_de_la_couronne_d_anti_aliasing_effective,epaisseur_de_la_couronne_d_anti_aliasing);             \
                                        /* Cas ou l'epaisseur de la couronne est constante...                                        */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         EGAL(epaisseur_de_la_couronne_d_anti_aliasing_effective                                                        \
                             ,INTERPOLATION_LINEAIRE(minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing                              \
                                                    ,maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing                              \
                                                    ,NORM(TRON(Arayon                                                                   \
                                                              ,rayon_associe_au_minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing   \
                                                              ,rayon_associe_au_maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing   \
                                                               )                                                                        \
                                                         ,rayon_associe_au_minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing        \
                                                         ,rayon_associe_au_maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing        \
                                                          )                                                                             \
                                                     )                                                                                  \
                              );                                                                                                        \
                                        /* Cas ou l'epaisseur de la couronne est modulee par le rayon (introduit le 20060224115535). */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : on rappelle que 'rayon' est exprime en nombre de points...                    */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(distance_critique_normalisee_au_bord                                                                           \
                        ,TRON(SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                                    \
                                  ,DIVZ(epaisseur_de_la_couronne_d_anti_aliasing_effective                                              \
                                       ,MAX2(FLOT(rayon),epaisseur_de_la_couronne_d_anti_aliasing_effective)                            \
                                        )                                                                                               \
                                   )                                                                                                    \
                             ,COORDONNEE_BARYCENTRIQUE_MINIMALE                                                                         \
                             ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                                         \
                              )                                                                                                         \
                         );                                                                                                             \
                    Eblock                                                                                                              \
                                        /* Calcul de 'distance_critique_normalisee_au_bord' en fonction du rayon courant de la       */ \
                                        /* sphere courante...                                                                        */

#define   COORDONNEE_BARYCENTRIQUE_A_L_INTERIEUR_DE_LA_COURONNE(distance_normalisee)                                                    \
                    NORM(distance_normalisee,distance_critique_normalisee_au_bord,COORDONNEE_BARYCENTRIQUE_MAXIMALE)                    \
                                        /* Lorsque l'on est a l'interieur de la couronne, la distance normalisee est ramenee dans    */ \
                                        /* [0,1] afin de fournir une coordonnee barycentrique de parcours de cette couronne.         */

#define   ATTENUATION_D_ANTI_ALIASING_AU_BORD                                                                                           \
                    COORDONNEE_BARYCENTRIQUE_MINIMALE
DEFV(Local,DEFV(Float,INIT(attenuation_d_anti_aliasing_au_bord,ATTENUATION_D_ANTI_ALIASING_AU_BORD)));
                                        /* Facteur multiplicatif a appliquer a 'modulation_d_eclairement' sur le contour apparent    */
                                        /* des spheres...                                                                            */

#nodefine CORRECTION_D_ANTI_ALIASING_VERSION_01(distance_normalisee)                                                                    \
                                        /* ATTENTION : la distance normalisee argument est dans [0,1], et est en fait le rapport     */ \
                                        /* de la distance au rayon...                                                                */ \
                    fCOND(IFLE(distance_normalisee,distance_critique_normalisee_au_bord)                                                \
                         ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                                             \
                         ,INTERPOLATION_LINEAIRE(COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                      \
                                                ,attenuation_d_anti_aliasing_au_bord                                                    \
                                                ,COORDONNEE_BARYCENTRIQUE_A_L_INTERIEUR_DE_LA_COURONNE(distance_normalisee)             \
                                                 )                                                                                      \
                          )                                                                                                             \
                                        /* Lorsque les zones tres eclairees d'une sphere se situent tres pres du contour apparent,   */ \
                                        /* une correction d'aliasing s'impose. Une telle fonction est definie ici ; elle est         */ \
                                        /* fonction de la distance normalisee au centre du disque bidimensionnel. Cette correction   */ \
                                        /* est une valeur dans [0,1] elle-aussi definie par la courbe suivante :                     */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*                                      ^                                                    */ \
                                        /* COORDONNEE_BARYCENTRIQUE_MAXIMALE. . | * * * * * * * * . . . .                            */ \
                                        /*                                      |               .*      .                            */ \
                                        /*                                      |               . *     .                            */ \
                                        /*                                      |               .  *    .                            */ \
                                        /*                                      |               .   *   .                            */ \
                                        /*                                      |               .    *  .                            */ \
                                        /*                                      |               .     * .                            */ \
                                        /*                                      |               .      *.                            */ \
                                        /* attenuation_d_anti_aliasing_au_bord. | . . . . . . . . . . . *                            */ \
                                        /*                                      |               .       .                            */ \
                                        /*                                      |               .       .                            */ \
                                        /*                                      |               .       .                            */ \
                                        /*                                      |               .       .                            */ \
                                        /* COORDONNEE_BARYCENTRIQUE_MINIMALE. . --------------------------------------->             */ \
                                        /*                                      .               .       .          distance          */ \
                                        /*                                      .               .       .         normalisee         */ \
                                        /* COORDONNEE_BARYCENTRIQUE_MINIMALE. . .               .       .         dans [0,1]         */ \
                                        /* distance_critique_normalisee_au_bord . . . . . . . . .       .                            */ \
                                        /* COORDONNEE_BARYCENTRIQUE_MAXIMALE. . . . . . . . . . . . . . .                            */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* Nota important : il convient de remarquer que la distance utilisee ici est une distance   */ \
                                        /* bidimensionnelle dans le plan, et non pas une distance dans l'espace tridimensionnel.     */ \
                                        /* Elle definie bien (ou du moins son complement a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE') une  */ \
                                        /* distance du point courant bidimensionnel au contour apparent...                           */ \
                                        /*                                                                                           */ \
                                        /* Le 20030222110348, 'CORRECTION_D_ANTI_ALIASING_VERSION_01(...)' est passe de 'define' a   */ \
                                        /* 'nodefine' afin de ne pas etre recupere par le processus 'v $xcc/cpp$Z _VERSION_'.        */

#define   DERIVEE_A_L_INTERIEUR_DE_LA_COURONNE                                                                                          \
                    FZERO
DEFV(Local,DEFV(Float,INIT(derivee_a_l_interieur_de_la_couronne,DERIVEE_A_L_INTERIEUR_DE_LA_COURONNE)));
                                        /* Definit la derivee de la fonction a interpoler cubiquement a l'interieur de la couronne.  */
#define   DERIVEE_A_L_EXTERIEUR_DE_LA_COURONNE                                                                                          \
                    FZERO
DEFV(Local,DEFV(Float,INIT(derivee_a_l_exterieur_de_la_couronne,DERIVEE_A_L_EXTERIEUR_DE_LA_COURONNE)));
                                        /* Definit la derivee de la fonction a interpoler cubiquement a l'exterieur de la couronne.  */
#define   CORRECTION_D_ANTI_ALIASING_VERSION_02(distance_normalisee)                                                                    \
                                        /* ATTENTION : la distance normalisee argument est dans [0,1], et est en fait le rapport     */ \
                                        /* de la distance au rayon...                                                                */ \
                    fCOND(IFLE(distance_normalisee,distance_critique_normalisee_au_bord)                                                \
                         ,COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                                             \
                         ,INTERPOLATION_CUBIQUE(COORDONNEE_BARYCENTRIQUE_MAXIMALE                                                       \
                                               ,derivee_a_l_interieur_de_la_couronne                                                    \
                                               ,attenuation_d_anti_aliasing_au_bord                                                     \
                                               ,derivee_a_l_exterieur_de_la_couronne                                                    \
                                               ,COORDONNEE_BARYCENTRIQUE_A_L_INTERIEUR_DE_LA_COURONNE(distance_normalisee)              \
                                                )                                                                                       \
                          )                                                                                                             \
                                        /* Lorsque les zones tres eclairees d'une sphere se situent tres pres du contour apparent,   */ \
                                        /* une correction d'aliasing s'impose. Une telle fonction est definie ici ; elle est         */ \
                                        /* fonction de la distance normalisee au centre du disque bidimensionnel. Cette correction   */ \
                                        /* est une valeur dans [0,1] elle-aussi definie par la courbe suivante :                     */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*                                      ^                                                    */ \
                                        /* COORDONNEE_BARYCENTRIQUE_MAXIMALE. . | * * * * * * * * . . . .                            */ \
                                        /*                                      |               .  *    .                            */ \
                                        /*                                      |               .   *   .                            */ \
                                        /*                                      |               .   *   .                            */ \
                                        /*                                      |               .   *   .                            */ \
                                        /*                                      |               .   *   .                            */ \
                                        /*                                      |               .   *   .                            */ \
                                        /*                                      |               .    *  .                            */ \
                                        /* attenuation_d_anti_aliasing_au_bord. | . . . . . . . . . . . *                            */ \
                                        /*                                      |               .       .                            */ \
                                        /*                                      |               .       .                            */ \
                                        /*                                      |               .       .                            */ \
                                        /*                                      |               .       .                            */ \
                                        /* COORDONNEE_BARYCENTRIQUE_MINIMALE. . --------------------------------------->             */ \
                                        /*                                      .               .       .          distance          */ \
                                        /*                                      .               .       .         normalisee         */ \
                                        /* COORDONNEE_BARYCENTRIQUE_MINIMALE. . .               .       .         dans [0,1]         */ \
                                        /* distance_critique_normalisee_au_bord . . . . . . . . .       .                            */ \
                                        /* COORDONNEE_BARYCENTRIQUE_MAXIMALE. . . . . . . . . . . . . . .                            */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* Nota important : il convient de remarquer que la distance utilisee ici est une distance   */ \
                                        /* bidimensionnelle dans le plan, et non pas une distance dans l'espace tridimensionnel.     */ \
                                        /* Elle definie bien (ou du moins son complement a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE') une  */ \
                                        /* distance du point courant bidimensionnel au contour apparent...                           */
#define   CORRECTION_D_ANTI_ALIASING(distance_normalisee)                                                                               \
                                        /* ATTENTION : la distance normalisee argument est dans [0,1], et est en fait le rapport     */ \
                                        /* de la distance au rayon...                                                                */ \
                    CORRECTION_D_ANTI_ALIASING_VERSION_02(distance_normalisee)                                                          \
                                        /* Choix de la methode de correction d'aliasing...                                           */



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.