/*************************************************************************************************************************************/
/* */
/* 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"... */