/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O R M A T   D E S   I M A G E S   S T A N D A R D  :                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiif/format$DEF' :                                                                                             */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   M O D E   D E   G E S T I O N   D E S   F O R M A T S   D ' I M A G E S  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01' et 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02'    */
                                        /* sont fixees maintenant dans $Fdefinit' afin de pouvoir definir correctement la            */
                                        /* procedure 'POINTERp(...)'.                                                                */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   F O R M A T   D E S   I M A G E S  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   LONGUEUR(dimension)                                                                                                           \
                    TRMU(dimension)                                                                                                     \
                                        /* Definition de la longueur d'un axe au sens "longueur geometrique".                        */

#define   COORDONNEE_MINIMALE                                                                                                           \
                    ZERO                                                                                                                \
                                        /* Definition de 'Xmin' ou 'Ymin'.                                                           */
#define   COORDONNEE_MAXIMALE(logarithme_dimension)                                                                                     \
                    ADD2(LONGUEUR(SLLS(BIT,logarithme_dimension)),COORDONNEE_MINIMALE)                                                  \
                                        /* Definition de 'Xmax' ou 'Ymax'.                                                           */

#define   DIMENSION(coordonnee_minimale,coordonnee_maximale)                                                                            \
                    NBRE(coordonnee_minimale,coordonnee_maximale)                                                                       \
                                        /* Definition de la longueur d'un axe au sens "nombre d'elements". ATTENTION, autrefois, il  */ \
                                        /* y avait :                                                                                 */ \
                                        /*                                                                                           */ \
                                        /*                  #define   DIMENSION(coordonnee_minimale,coordonnee_maximale)          \  */ \
                                        /*                                      LENG(coordonnee_minimale,coordonnee_maximale)        */ \
                                        /*                                                                                           */ \
                                        /* Pour alleger la compilation, je fais dorenavant l'hypothese realiste suivante :           */ \
                                        /*                                                                                           */ \
                                        /*                  coordonnee_minimale < coordonnee_maximale                                */ \
                                        /*                                                                                           */ \
                                        /* On notera bien que que la longueur d'un axe est definie en tant que nombre d'elements     */ \
                                        /* a memoriser par exemple dans un vecteur (max-min+1), et non pas en tant que longueur      */ \
                                        /* geometrique (max-min)...                                                                  */

#define   XYZmin(coordonnee_maximale,dimension)                                                                                         \
                    SOUS(coordonnee_maximale,LONGUEUR(dimension))                                                                       \
                                        /* Calcul de la coordonnee minimale a partir de la coordonnee maximale et de la dimension.   */ \
                                        /* ATTENTION : 'LENG(...)' utilise la valeur absolue via 'SOUA(...)', alors que cette        */ \
                                        /* formule fait l'hypothese realiste que la coordonnee 'coordonnee_maximale' est superieure  */ \
                                        /* a la coordonnee 'coordonnee_minimale'. Mais, ATTENTION, le commentaire precedent n'a plus */
                                        /* de sens depuis que 'DIMENSION(...)' est define par 'NBRE(...)' et non plus 'LENG(...)'... */
#define   XYZmax(coordonnee_minimale,dimension)                                                                                         \
                    COOA(coordonnee_minimale,LONGUEUR(dimension))                                                                       \
                                        /* Calcul de la coordonnee maximale a partir de la coordonnee minimale et de la dimension.   */ \
                                        /* ATTENTION : 'LENG(...)' utilise la valeur absolue via 'SOUA(...)', alors que cette        */ \
                                        /* formule fait l'hypothese realiste que la coordonnee 'coordonnee_maximale' est superieure  */ \
                                        /* a la coordonnee 'coordonnee_minimale'...                                                  */ \
                                        /*                                                                                           */ \
                                        /* La procedure 'COOA(...)' a ete introduite le 20040907170849, en notant au passage que     */ \
                                        /* 'COOR(...)' ne peut etre utilise pour definir 'XYZmin(...)' (voir a ce propos sa          */ \
                                        /* definition dans 'v $xiii/Images$DEF COOR.coordonnee.coordonnee_minimale.').               */

#define   PAS_COORDONNEE                                                                                                                \
                    UNITE                                                                                                               \
                                        /* Definition du pas de parcours implicite d'un axe.                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H O I X   E N T R E   D E S   A X E S   " F E R M E S "   O U   " O U V E R T S   A   D R O I T E "  :                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   AXES_COORDONNEES_FERMES_OUVERTS(coordonnee)                                                                                   \
                    OPC1(IL_FAUT(AXES_COORDONNEES_FERMES_OUVERTS_____compatibilite_20090929)                                            \
                        ,LONGUEUR                                                                                                       \
                        ,NEUT                                                                                                           \
                        ,coordonnee                                                                                                     \
                         )                                                                                                              \
                                        /* Introduit le 20090929093052, on ne sait jamais : les axes sont ouverts a droite par       */ \
                                        /* defaut (soit [0,1[).                                                                      */ \
                                        /*                                                                                           */ \
                                        /* Je rappelle le 20190621121046 que :                                                       */ \
                                        /*                                                                                           */ \
                                        /*        compatibilite_20090929=VRAI   ==> [?min,?max]     -0-> [0,1]                       */ \
                                        /*                                                                                           */ \
                                        /*        compatibilite_20090929=FAUX   ==> [?min,?max]     -0-> [0,1[                       */ \
                                        /*                                                                                           */ \
                                        /* Ainsi, par exemple, avec Xmax=511 (et donc dimX=512) :                                    */ \
                                        /*                                                                                           */ \
                                        /*        compatibilite_20090929=VRAI   ==> 511   -0-> 511/(512-1) = 511/511 = 1             */ \
                                        /*                                                                                           */ \
                                        /*        compatibilite_20090929=FAUX   ==> 511   -0-> 511/512               = 0.998046875   */ \
                                        /*                                                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   G E N E R A L E   D E   L A   D E N O R M A L I S A T I O N  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   F___DENORMALISE_AXES(minimum,dimension,longueur,modificateur)                                                                 \
                    COOA(MUL2(FLOT(modificateur(dimension))                                                                             \
                             ,FLOT(longueur)                                                                                            \
                              )                                                                                                         \
                        ,FLOT(minimum)                                                                                                  \
                         )
#define   F__cDENORMALISE_AXES(minimum,dimension,coordonnee)                                                                            \
                    F___DENORMALISE_AXES(minimum,dimension,coordonnee,AXES_COORDONNEES_FERMES_OUVERTS)
#define   F__lDENORMALISE_AXES(dimension,longueur)                                                                                      \
                    F___DENORMALISE_AXES(ZERO,dimension,longueur,NEUT)
                                        /* Version flottante : afin de faire que l'unite (1) represente [min,max]                    */
                                        /* sur les axes, et donc de permettre le passage de [0,1[ a [min,max]. ATTENTION :           */
                                        /* lorsque la precision doit etre conservee, et par exemple dans des ecritures du type :     */
                                        /*                                                                                           */
                                        /*                  _?DENORMALISE_OZ(_____?NORMALISE_OZ(...))                                */
                                        /*                                                                                           */
                                        /* qui, par ce passage en entier font perdre de la precision, et commettre des erreurs,      */
                                        /* par exemple, lors des acces au 'Z-Buffer'. Dans ces cas, on aura interet a ecrire :       */
                                        /*                                                                                           */
                                        /*                  F__?DENORMALISE_OZ(_____?NORMALISE_OZ(...))                              */
                                        /*                                                                                           */
                                        /* On notera qu'autrefois on utilisait la dimension au sens "nombre d'elements" :            */
                                        /*                                                                                           */
                                        /*                  ...FLOT(dimension)...                                                    */
                                        /*                                                                                           */
                                        /* mais qu'il est beaucoup plus logique d'utiliser la dimension au sens "longueur", d'ou     */
                                        /* l'ecriture :                                                                              */
                                        /*                                                                                           */
                                        /*                  ...FLOT(LONGUEUR(dimension))...                                          */
                                        /*                                                                                           */
                                        /* Le 20041111165615, je suis revenu en arriere pour 'F__lDENORMALISE_AXES(...)', d'ou       */
                                        /* l'introduction de l'argument 'modificateur' pour 'F___DENORMALISE_AXES(...)'. Cela        */
                                        /* s'est avere necessaire dans 'v $xiii/di_image$FON IFtranslation' de facon a ce que,       */
                                        /* par exemple une translation horizontale de 0.5 corresponde bien a dimX/2.                 */
                                        /* Mais ATTENTION, cet "aller-retour" ne fut pas neutre en particulier en ce qui concerne    */
                                        /* la generation de champs via 'v $xiii/mono_image$DEF ACCES_A_UN_CHAMP_3D' qui reference    */
                                        /* de facon indirecte les deux procedures 'v $xiiD/definit.1$DEF _____cNORMALISE_AXES'       */
                                        /* et 'v $xiif/format$DEF F__lDENORMALISE_AXES'. Ainsi, suivant la date, il peut etre        */
                                        /* impossible de regenerer exactement certaines images. Cela s'est vu vers le 200604281457   */
                                        /* ou, par exemple, le calcul de 'v $xiaf/COT2.Q1$R16' sur '$CMAP28' a differe quelque peu   */
                                        /* de la version precedente 'v $xiaf/COT2.D1$R16' sur '$LACT14' a cause des conditions       */
                                        /* initiales ('v $xiirf/.COT2.D1.0.2.$U .xci.gauss.X') generees a partir de filtres          */
                                        /* utilisant donc 'v $xiii/mono_image$DEF ACCES_A_UN_CHAMP_3D' via la commande               */
                                        /* 'v $xci/gauss$K Fgaussien'...                                                             */
                                        /*                                                                                           */
                                        /* Les "double" versions 'F__cDENORMALISE_AXES(...)' et 'F__lDENORMALISE_AXES(...)' ont ete  */
                                        /* introduites le 20010223102730 car effectivement une coordonnee et une longueur ne         */
                                        /* doivent pas etre normalisees de la meme facon (seule la coordonnee doit etre              */
                                        /* "relativiser"...).                                                                        */
                                        /*                                                                                           */
                                        /* La procedure 'COOA(...)' a ete introduite le 20040907163359.                              */
                                        /*                                                                                           */
                                        /* Le 20090928173307, la procedure 'LONGUEUR(...)' a ete remplacee par 'NEUT(...)' dans      */
                                        /* 'F__cDENORMALISE_AXES(...)' a cause du probleme 'v $xtc/NormDenorm.02$c TRMU' issu        */
                                        /* lui meme d'un probleme lors d'un redimensionnement d'un zoom dans 'v $xiirk/DIFF.11'      */
                                        /* ou les carres materialisant les particules n'etaient pas tous carres. Cela venait d'un    */
                                        /* "aller-retour" du type :                                                                  */
                                        /*                                                                                           */
                                        /*                  X/Y denormalisees au format 'F1'                                         */
                                        /*                            --> X/Y normalisees                                            */
                                        /*                                      X/Y denormalisees au format 'F2' (F2 # F1)           */
                                        /*                                                                                           */
                                        /* Par exemple, examinons le passage de [0,15] a [0,3] avec 'LONGUEUR(...)' :                */
                                        /*                                                                                           */
                                        /*                          |                   |                   |                        */
                                        /*        00   01   02   03 | 04   05   06   07 | 08   09   10   11 | 12   13   14   15      */
                                        /*                          |                   |                   |                        */
                                        /*        00   00   00   00 | 00   01   01   01 | 01   01   02   02 | 02   02   02   03      */
                                        /*                          | __                | __   __           | __   __   __           */
                                        /*                                                                                           */
                                        /* (ou les elements incorrects sont soulignes par "__"), l'"aller-retour" etant ici          */
                                        /* equivalent a :                                                                            */
                                        /*                                                                                           */
                                        /*                  (coordonnee/15)*3                                                        */
                                        /*                                                                                           */
                                        /* L'utilisation de 'NEUT(...)' equivaut a :                                                 */
                                        /*                                                                                           */
                                        /*                  (coordonnee/16)*4                                                        */
                                        /*                                                                                           */
                                        /* ce qui donne :                                                                            */
                                        /*                                                                                           */
                                        /*                          |                   |                   |                        */
                                        /*        00   01   02   03 | 04   05   06   07 | 08   09   10   11 | 12   13   14   15      */
                                        /*                          |                   |                   |                        */
                                        /*        00   00   00   00 | 01   01   01   01 | 02   02   02   02 | 03   03   03   03      */
                                        /*                          |                   |                   |                        */
                                        /*                                                                                           */
                                        /* qui est correct...                                                                        */

#if       (PRECISION_DU_Float==SIMPLE_PRECISION)
#    define    nEPSILON___DENORMALISE_AXES                                                                                              \
                         PARE(1.0E-2)                                                                                                   \
                                        /* Petite constante destinee a corriger le defaut d'arrondi mis en evidence dans le          */ \
                                        /* programme 'v $xci/entrelace$K', et plus simplement dans 'v $xtc/Pal.11$c' ; avec le       */ \
                                        /* premier, les commandes :                                                                  */ \
                                        /*                                                                                           */ \
                                        /*                  Pal                                                                      */ \
                                        /*                  $xci/init$X n=$NOIR                                         $formatI  \  */ \
                                        /*                                      | $xci/entrelace$X                      $formatI  \  */ \
                                        /*                                      | $xci/display$X     p=$xiP/cercle.22   $formatI     */ \
                                        /*                                                                                           */ \
                                        /* donnait des lignes paralleles non regulierement espacees...                               */
#Aif      (PRECISION_DU_Float==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Float==SIMPLE_PRECISION)

#if       (PRECISION_DU_Float==DOUBLE_PRECISION)
#    define    nEPSILON___DENORMALISE_AXES                                                                                              \
                         PARE(1.0E-10)                                                                                                  \
                                        /* Petite constante destinee a corriger le defaut d'arrondi mis en evidence dans le          */ \
                                        /* programme 'v $xci/entrelace$K', et plus simplement dans 'v $xtc/Pal.11$c' ; avec le       */ \
                                        /* premier, les commandes :                                                                  */ \
                                        /*                                                                                           */ \
                                        /*                  Pal                                                                      */ \
                                        /*                  $xci/init$X n=$NOIR                                         $formatI  \  */ \
                                        /*                                      | $xci/entrelace$X                      $formatI  \  */ \
                                        /*                                      | $xci/display$X     p=$xiP/cercle.22   $formatI     */ \
                                        /*                                                                                           */ \
                                        /* donnait des lignes paralleles non regulierement espacees.                                 */
#Aif      (PRECISION_DU_Float==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Float==DOUBLE_PRECISION)

#define   gINTE(x)                                                                                                                      \
                    FLIN(x,DENORMALISE_AXES_____epsilon)                                                                                \
                                        /* Partie entiere avec prise en compte des erreurs d'arrondi (voir les commentaires relatifs */ \
                                        /* a la definition de 'nEPSILON___DENORMALISE_AXES').                                        */
#define   gVINTE(x)                                                                                                                     \
                    VFLIN(x,DENORMALISE_AXES_____epsilon)                                                                               \
                                        /* Partie entiere avec prise en compte des erreurs d'arrondi (voir les commentaires relatifs */ \
                                        /* a la definition de 'nEPSILON___DENORMALISE_AXES') et validation de non debordement...     */

#define   _cDENORMALISE_AXES(minimum,dimension,coordonnee)                                                                              \
                    gINTE(F__cDENORMALISE_AXES(minimum,dimension,coordonnee))
#define   _lDENORMALISE_AXES(dimension,longueur)                                                                                        \
                    gINTE(F__lDENORMALISE_AXES(dimension,longueur))

#define   V_cDENORMALISE_AXES(minimum,dimension,coordonnee)                                                                             \
                    gVINTE(F__cDENORMALISE_AXES(minimum,dimension,coordonnee))
#define   V_lDENORMALISE_AXES(dimension,longueur)                                                                                       \
                    gVINTE(F__lDENORMALISE_AXES(dimension,longueur))
                                        /* Version entiere : afin de faire que l'unite (1) represente [min,max]                      */
                                        /* sur les axes, et donc de permettre le passage de [0,1[ a [min,max], sans et avec          */
                                        /* validation de non debordement. ATTENTION, il est imperatif que 'gINTE(...)' et            */
                                        /* 'gVINTE(...) soient la, car en effet, ces expressions sont souvent des arguments de       */
                                        /* type 'Int' de fonctions.                                                                  */
                                        /*                                                                                           */
                                        /* Les "double" versions '*_cDENORMALISE_AXES(...)' et '*_lDENORMALISE_AXES(...)' ont ete    */
                                        /* introduites le 20010223102730 car effectivement une coordonnee et une longueur ne         */
                                        /* doivent pas etre normalisees de la meme facon (seule la coordonnee doit etre              */
                                        /* "relativiser"...).                                                                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O R M A T   D E   B A S E   ( I M A G E S   5 1 2 x 5 1 2 )  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   Format_p_BASE                                                                                                                 \
                    Format_char                                                                                                         \
                                        /* Format d'un pixel en memoire ("CHAR"/"Int"/"Float").                                      */ \
                                        /* ATTENTION : un format de type "Int" ou "Float" pourra etre la cause de                    */ \
                                        /* problemes dans la generation des listes de substitution, dont la taille                   */ \
                                        /* risque d'etre alors trop grande (voire negative pour des raisons d'over-                  */ \
                                        /* flow...).                                                                                 */
#define   log_BASE                                                                                                                      \
                    NEUF                                                                                                                \
                                        /* Logarithme en base 2 des deux dimensions.                                                 */
#define   logX_BASE                                                                                                                     \
                    log_BASE                                                                                                            \
                                        /* Logarithme en base 2 de la dimension horizontale.                                         */
#define   logY_BASE                                                                                                                     \
                    log_BASE                                                                                                            \
                                        /* Logarithme en base 2 de la dimension verticale.                                           */
#define   Xmin_BASE                                                                                                                     \
                    COORDONNEE_MINIMALE                                                                                                 \
                                        /* Definition de l'abscisse minimale.                                                        */
#define   Xmax_BASE                                                                                                                     \
                    COORDONNEE_MAXIMALE(logX_BASE)                                                                                      \
                                        /* Definition de l'abscisse maximale.                                                        */
#define   dimX_BASE                                                                                                                     \
                    DIMENSION(Xmin_BASE,Xmax_BASE)                                                                                      \
                                        /* Definition de la longueur de l'axe horizontal.                                            */
#define   PasX_BASE                                                                                                                     \
                    PAS_COORDONNEE                                                                                                      \
                                        /* Definition du pas de parcours de l'axe horizontal.                                        */
#define   Ymin_BASE                                                                                                                     \
                    COORDONNEE_MINIMALE                                                                                                 \
                                        /* Definition de l'ordonnee minimale.                                                        */
#define   Ymax_BASE                                                                                                                     \
                    COORDONNEE_MAXIMALE(logY_BASE)                                                                                      \
                                        /* Definition de l'ordonnee maximale.                                                        */
#define   dimY_BASE                                                                                                                     \
                    DIMENSION(Ymin_BASE,Ymax_BASE)                                                                                      \
                                        /* Definition de la longueur de l'axe vertical.                                              */
#define   PasY_BASE                                                                                                                     \
                    PAS_COORDONNEE                                                                                                      \
                                        /* Definition du pas de parcours de l'axe vertical.                                          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O R M A T   C O U R A N T   D E S   I M A G E S  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  image_forma_FT_512x512_DEF
                                        /* ATTENTION : on n'oubliera pas que les noms des fichiers de format d'images sont de la     */
                                        /* forme :                                                                                   */
                                        /*                                                                                           */
                                        /*                  image_forma_FT_XXXxYYY_DEF                                               */
                                        /*                                                                                           */
                                        /* ou 'XXX' symbolise 'dimension_formatX', et                                                */
                                        /* ou 'YYY' symbolise 'dimension_formatY'.                                                   */
                                        /*                                                                                           */
                                        /* Cette ligne est decortiquee par le fichier 'v $Fimages' afin de connaitre les dimensions  */
                                        /* de base des images, et ainsi definir les variables du 'C-Shell' 'dimension_formatX' et    */
                                        /* 'dimension_formatY'...                                                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   L I E E S   A U   F O R M A T   C O U R A N T   D E S   I M A G E S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  image_defin_DEFINIT_1_DEF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D O N N E E S   D E   P R O J E C T I O N  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   PROJECTEUR_OX                                                                                                                 \
                    PARE(0.75)                                                                                                          \
                                        /* Facteur de projection de l'axe des 'Z' sur l'axe des 'X',                                 */
#define   PROJECTEUR_OY                                                                                                                 \
                    PARE(0.50)                                                                                                          \
                                        /* Facteur de projection de l'axe des 'Z' sur l'axe des 'Y'.                                 */
#define   PROJECTION_OX(x,y,z)                                                                                                          \
                    SOUS(FLOT(x),MUL2(FLOT(z),projecteur_OX))                                                                           \
                                        /* Fonction simpliste de projection sur l'axe 'OX',                                          */
#define   PROJECTION_OY(x,y,z)                                                                                                          \
                    SOUS(FLOT(y),MUL2(FLOT(z),projecteur_OY))                                                                           \
                                        /* Fonction simpliste de projection sur l'axe 'OY'.                                          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   F O R M A T   " T E M P O R E L "   D E S   I M A G E S  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   FREQUENCE_DE_BALAYAGE_DES_IMAGES                                                                                              \
                    VINGT_CINQ                                                                                                          \
                                        /* Definition du nombre d'images par seconde "chez nous"...                                  */



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.