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