_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/* */
/* P R I M I T I V E S D E C O M B I N A I S O N D E P I X E L S */
/* S O U S F O R M E D E " F O N C T I O N S " : */
/* */
/* */
/* Definition : */
/* */
/* Dans ce fichier se trouvent toutes les */
/* primitives de combinaisons des pixels d'une */
/* image raster ; elles sont exprimees */
/* sous forme de fonctions ce qui fait */
/* que la duree d'execution par rapport */
/* aux "defines" est tres allongee... */
/* Mais l'avantage, c'est qu'elle */
/* peuvent etre referencees comme argument */
/* 'Vf' des operations de 'store_point' */
/* sous la forme : */
/* */
/* Vf(ancien_niveau,nouveau_niveau); */
/* */
/* */
/* Ainsi, on pourra combiner la valeur */
/* anterieure d'un point, avec la nouvelle */
/* que l'on vient de calculer, pour les */
/* fonctions 'Vf' autre que 'NEUTRE2'. */
/* */
/* */
/* N O T A T I O N S : */
/* */
/* */
/* On notera 'imageA' les images Arguments, */
/* et 'imageR' les images Resultats ; 'arg' */
/* designera des arguments, et 'Vf' une */
/* fonction "variable"... */
/* */
/* */
/* Author of '$xiipf/fonction.2$FON' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19870000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E N V O I D U P R E M I E R A R G U M E N T : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FNEUTRE1(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(arg1);
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E N V O I D U D E U X I E M E A R G U M E N T : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FNEUTRE2(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(arg2);
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E N V O I D U D E U X I E M E A R G U M E N T ( P L U S S I M P L E ) : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FNEUTRE(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(FNEUTRE2(arg1,arg2));
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* A D D I T I O N D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FADD(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(NIVA(ADD2(NIVR(arg1),NIVR(arg2))));
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* " B A R Y C E N T R E " D E D E U X N I V E A U X : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(Float,SINT(FBARY_____ponderation_de_la_fonction,FDU)));
/* Afin que toutes ces fonctions aient le meme nombre d'Arguments (2), les Arguments */
/* "exceptionnels", tels 'FBARY_____ponderation_de_la_fonction', sont transmis differemment. */
DEFV(Common,DEFV(FonctionP,FBARY(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(GENP(NIVA(BARY(FLOT(NIVR(arg1)),FLOT(NIVR(arg2)),FBARY_____ponderation_de_la_fonction))));
/* Calcul de : */
/* */
/* (1-lambda).arg1+lambda.arg2 */
/* */
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M O Y E N N E D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FMOYENNE(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(NIVA(MOYE(NIVR(arg1),NIVR(arg2))));
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* S O U S T R A C T I O N D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FSUB(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(NIVA(SOUS(NIVR(arg1),NIVR(arg2))));
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M U L T I P L I C A T I O N D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FMUL(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(NIVA(MUL2(NIVR(arg1),NIVR(arg2))));
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M U L T I P L I C A T I O N D E D E U X V A L E U R S ( F L O T T A N T E E T E N T I E R E ) : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FMULF(arg1,arg2)))
DEFV(Argument,DEFV(Float,arg1));
/* Premier argument (flottant). */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument (entier). */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(NIVA(MUL2(arg1,NIVR(arg2))));
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I V I S I O N D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FDIV(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument (dividende). */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument (diviseur). */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(genere_p,INIT(resultat,NIVEAU_UNDEF));
/* Variable de manoeuvre. */
/*..............................................................................................................................*/
Test(IZEQ(NIVR(arg2)))
Bblock
PRINT_ATTENTION("division par zero");
EGAL(resultat,NIVEAU_UNDEF);
Eblock
ATes
Bblock
Eblock
ETes
Test(IZNE(NIVR(arg2)))
Bblock
EGAL(resultat,NIVA(DIVI(NIVR(arg1),NIVR(arg2))));
Eblock
ATes
Bblock
Eblock
ETes
RETU(resultat);
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A X I M U M D E D E U X V A L E U R S ( " O U " F L O U ) : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FMAX(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(MAX2(arg1,arg2));
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M I N I M U M D E D E U X V A L E U R S ( " E T " F L O U ) : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FMIN(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(MIN2(arg1,arg2));
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* " O U " E X C L U S I F F L O U D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FMINMAX(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(FMAX(FMIN(arg1,FCOMP(arg2)),FMIN(FCOMP(arg1),arg2)));
Eblock
EFonctionP
#if ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* ' O R ' D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FOR(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(OUIN(arg1,arg2));
Eblock
EFonctionP
#Aif ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
#Eif ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
#if ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* ' A N D ' D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FAND(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(ETLO(arg1,arg2));
Eblock
EFonctionP
#Aif ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
#Eif ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
#if ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* ' E O R ' D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FEOR(arg1,arg2)))
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
RETU(OUEX(arg1,arg2));
Eblock
EFonctionP
#Aif ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
#Eif ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E L A I V E R S L A F O N C T I O N D E C O M B I N A I S O N C O U R A N T E : */
/* */
/* */
/* Definition : */
/* */
/* Les fonctions du type "VNEUTRE", qui */
/* permettent de combiner les niveaux a */
/* ecrire et ne niveau anterieur, peuvent */
/* etre referencees indirectement, via */
/* le relai que l'on definit ici. */
/* */
/*************************************************************************************************************************************/
BPointeurFonctionP
#ifdef SYSTEME_CRAY2_UNICOS /* Common,DEFV(Fonction,) : */
/* Introduit le 20180427190259... */
DEFV(Common,DEFV(PointeurFonctionP,INIT(afPOINTEUR_2p(Fvariable),aFONCTION(__FNEUTRE))));
#Aifdef SYSTEME_CRAY2_UNICOS /* Common,DEFV(Fonction,) : */
/* Introduit le 20180427190259... */
DEFV(Common,DEFV(PointeurFonctionP,INIT(afPOINTEUR_2p(Fvariable),aFONCTION(FNEUTRE))));
#Eifdef SYSTEME_CRAY2_UNICOS /* Common,DEFV(Fonction,) : */
/* Le pointeur 'Fvariable' contient en permanence l'adresse */
/* de la fonction de combinaison de la valeur a marquer, et */
/* de la valeur anterieure d'un point d'une image ; il est initialise */
/* sur l'operation neutre, c'est-a-dire celle qui ecrase la valeur */
/* anterieure en forcant la nouvelle valeur. */
/* */
/* ATTENTION : on notera le '__FNEUTRE' qui n'est en fait utile que sur le CRAY2, et qui */
/* inhibe le test du nombre des arguments... */
/* */
/* Le 20040618153050, je suis passe de 'genere_p,INIT(afPOINTEUR' a la version actuelle */
/* a cause de 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', les pointeurs */
/* de fonction devant alors avoir aussi des arguments... */
EPointeurFonctionP
/* Ceci a ete introduit le 20051125212040 ('v $xcc/cpp$Z .xccp.PASSE_4.NomF')... */
#if ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N U N I V E R S E L L E D E C O M B I N A I S O N D E D E U X V A L E U R S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
#define EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_fonction,fonction) \
Ca1e(code_fonction) \
Bblock \
EGAL(niveau_resultant_de_la_combinaison_universelle,fonction(arg1,arg2)); \
Eblock \
ECa1
DEFV(Common,DEFV(Int,SINT(Fcombinaison_universelle_de_deux_niveaux_____code,code_FNEUTRE)));
DEFV(Common,DEFV(FonctionP,Fcombinaison_universelle_de_deux_niveaux(arg1,arg2)))
/* Fonction introduite le 20170714185144... */
DEFV(Argument,DEFV(genere_p,arg1));
/* Premier argument. */
DEFV(Argument,DEFV(genere_p,arg2));
/* Deuxieme argument. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(genere_p,INIT(niveau_resultant_de_la_combinaison_universelle,NIVEAU_UNDEF));
/*..............................................................................................................................*/
Choi(Fcombinaison_universelle_de_deux_niveaux_____code)
Bblock
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FNEUTRE1,FNEUTRE1)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FNEUTRE2,FNEUTRE2)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FNEUTRE,FNEUTRE)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FADD,FADD)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FBARY,FBARY)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FMOYENNE,FMOYENNE)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FSUB,FSUB)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FMUL,FMUL)
/* On notera l'absence de : */
/* */
/* EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FMULF,FMULF) */
/* */
/* parce que pour cette fonction 'arg1' est de type 'Float'... */
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FDIV,FDIV)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FMAX,FMAX)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FMIN,FMIN)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FMINMAX,FMINMAX)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FOR,FOR)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FAND,FAND)
EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX(code_FEOR,FEOR)
Defo
Bblock
PRINT_ERREUR("la fonction de combinaison des points n'existe pas");
Eblock
EDef
Eblock
ECho
RETU(niveau_resultant_de_la_combinaison_universelle);
Eblock
EFonctionP
#undef EXECUTION_D_UNE_COMBINAISON_QUELCONQUE_DE_DEUX_NIVEAUX
#Aif ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
#Eif ((Format_p==Format_char)||(Format_p==Format_int)) /* Common,DEFV(Fonction,) : la generation depend des conditions... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P E R I O D I S A T I O N D E S A X E S : */
/* */
/*************************************************************************************************************************************/
=define PERIODISER_SYMETRISER_PROLONGER(axe) \
/* ATTENTION : cette procedure prend la valeur d'une variable 'axe' (soit 'X' ou 'Y') et */ \
/* renvoie la valeur calculee dans une variable 'coordonnee`axe' (soit 'coordonnee_X' ou */ \
/* 'coordonnee_Y'). */ \
Bblock \
EGAL(coordonnee`axe \
,COND(IL_FAUT(periodiser`axe) \
,HORS`axe`PERIODIQUE(axe) \
,COND(IL_FAUT(symetriser`axe) \
,HORS`axe`SYMETRIQUE(axe) \
,COND(IL_FAUT(prolonger`axe) \
,HORS`axe`PROLONGEMENT(axe) \
,HORS`axe`FORCER(axe) \
) \
) \
) \
); \
Eblock
/* Eventuellement pour l'axe 'coordonnee', periodisation et prolongement tel qu'il etait */
/* au bord. */
/* */
/* Resume de la signification des options : */
/* */
/* periodiser HORS_?_PERIODIQUE(c) MOD?(c) */
/* symetriser HORS_?_SYMETRIQUE(c) SYM?(c) */
/* prolonger HORS_?_PROLONGEMENT(c) TRO?(c) */
/* "rien" HORS_?_FORCER(c) NEUT(c) */
/* */
/* ou '?' et 'c' designent une coordonnee {X,Y,Z} quelconque... */
/* */
/* L'option de symetrisation a ete introduite le 20050720190202... */
#define VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser,symetriser,prolonger_) \
I3OU(IFET(IL_FAUT(periodiser),IL_FAUT(symetriser)) \
,IFET(IL_FAUT(symetriser),IL_FAUT(prolonger_)) \
,IFET(IL_FAUT(prolonger_),IL_FAUT(periodiser)) \
) \
/* Afin de verifier qu'une seule des trois options {periodiser,symetriser,prolonger} est */
/* VRAI... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " S T A N D A R D " D ' U N E I M A G E : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,Fload_point(imageA
,X,Y
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
)
)
)
DEFV(Argument,DEFV(image,imageA));
/* Image contenant le point argument. */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
/* Coordonnees {X,Y} du point argument. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est symetrique ou pas. Ceci a ete */
/* introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] doit etre prolonge a l'exterieur comme il */
/* est au bord... */
DEFV(Argument,DEFV(genere_p,niveau_hors_image));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-image". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Int,INIT(coordonnee_X,UNDEF));
DEFV(Int,INIT(coordonnee_Y,UNDEF));
/* Coordonnees {X,Y} du point argument apres d'eventuelles transformations... */
DEFV(genere_p,INIT(point,niveau_hors_image));
/* Valeur du point courant initialise a priori sur la situation "hors-image". */
/*..............................................................................................................................*/
Test(IFOU(VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_X,symetriser_X,prolonger_X)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Y,symetriser_Y,prolonger_Y)
)
)
Bblock
PRINT_ATTENTION("une seule des options {periodiser,symetriser,prolonger} peut etre VRAI -la premiere 'VRAI' l'emporte-");
Eblock
ATes
Bblock
Eblock
ETes
PERIODISER_SYMETRISER_PROLONGER(X);
PERIODISER_SYMETRISER_PROLONGER(Y);
/* Eventuellement, periodisation et prolongement des axes... */
Test(TEST_DANS_L_IMAGE(coordonnee_X,coordonnee_Y))
Bblock
EGAL(point,load_point(imageA,coordonnee_X,coordonnee_Y));
/* Acces au point recherche apres ses eventuelles transformations... */
Eblock
ATes
Bblock
Eblock
ETes
RETU(point);
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Common,DEFV(FonctionF,FFload_point(imageA
,X,Y
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
)
)
)
DEFV(Argument,DEFV(imageF,imageA));
/* Image contenant le point argument. */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
/* Coordonnees {X,Y} du point argument. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est symetrique ou pas. Ceci a ete */
/* introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] doit etre prolonge a l'exterieur comme il */
/* est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_image));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-image". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Int,INIT(coordonnee_X,UNDEF));
DEFV(Int,INIT(coordonnee_Y,UNDEF));
/* Coordonnees {X,Y} du point argument apres d'eventuelles transformations... */
DEFV(genere_Float,INIT(point,niveau_hors_image));
/* Valeur du point courant initialise a priori sur la situation "hors-image". */
/*..............................................................................................................................*/
Test(IFOU(VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_X,symetriser_X,prolonger_X)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Y,symetriser_Y,prolonger_Y)
)
)
Bblock
PRINT_ATTENTION("une seule des options {periodiser,symetriser,prolonger} peut etre VRAI -la premiere 'VRAI' l'emporte-");
Eblock
ATes
Bblock
Eblock
ETes
PERIODISER_SYMETRISER_PROLONGER(X);
PERIODISER_SYMETRISER_PROLONGER(Y);
/* Eventuellement, periodisation et prolongement des axes... */
Test(TEST_DANS_L_IMAGE(coordonnee_X,coordonnee_Y))
Bblock
EGAL(point,loadF_point(imageA,coordonnee_X,coordonnee_Y));
/* Acces au point recherche apres ses eventuelles transformations... */
Eblock
ATes
Bblock
Eblock
ETes
RETU(point);
Eblock
EFonctionF
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E */
/* A V E C C O O R D O N N E E S F L O T T A N T E S : */
/* */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * ** * * * * * ** * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * ** * * * * * ** */
/* * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* */
/* ATTENTION : */
/* */
/* Je note le 20060601101800 lors du travail sur */
/* l'image 'v $xiirs/SPHE.92' que tout cela fonctionne */
/* tres bien, sauf s'il y une discontinuite dans l'image. */
/* Cela se voit par exemple, si l'image represente un */
/* angle auquel cas une discontinuite possible sera un */
/* passage de 2.pi a 0 ce qui ne se voit pas en tant que tel */
/* si cet angle est ensuite l'argument d'une fonction periodique */
/* de periode 2.pi (tel 'COSX(...)' ou 'SINX(...)'...). */
/* */
/*************************************************************************************************************************************/
#define NomFonctionCourant \
NomDeLaFonctionCourante \
/* Afin de raccourcir certaines lignes a venir... */
/* Introduit le 20080805102158 afin d'ameliorer la presentation de la valeur par defaut des */
/* matrices de transformation 'FFload_point_coordonnees_01_____matrice_de_transformation' */
/* et 'FFAload_point_coordonnees_01_____matrice_de_transformation'... */
/* */
/* Le 20120520122707, 'FU___' a ete mise dans 'v $xil/defi_K2$vv$DEF 20120520122554'... */
DEFV(Common,DEFV(Logical,PINT(bILOAD_POINT_COORDONNEES_01_____eviter_les_fortes_discontinuites,FAUX)));
DEFV(Common,DEFV(Float,PINT(bILOAD_POINT_COORDONNEES_01_____epsilon_detection_des_fortes_discontinuites,tgEPSILON)));
/* Dispositif introduit le 20170228182517 destine a eviter les trop fortes disconinuites */
/* dans les acces a un champ 'imageA'... */
#define bILOAD_POINT_COORDONNEES_01 \
/* Le 20120309180208, 'ILOAD_POINT_COORDONNEES_01' est devenu 'bILOAD_POINT_COORDONNEES_01' */ \
/* ("b" pour "Basic") par "symetrie" avec ce qui est fait pour les albums */ \
/* ('v $xiipf/fonction.2$FON ALOAD_POINT_COORDONNEES_01'... */ \
Bblock \
DEFV(genere_Float,INIT(niveau_sans_interpolation_du_point_de_coordonnees_01,FLOT__NIVEAU_UNDEF)); \
\
VOISINAGE_POINT_SIMPLE(Xf_effective \
,Yf_effective \
,BLOC(VIDE;) \
,BLOC(VIDE;) \
,genere_Float \
,FLOT__NIVEAU_UNDEF \
,FZERO \
,FZERO \
,NEUT \
); \
EGAL(niveau_sans_interpolation_du_point_de_coordonnees_01,niveau_du_point_de_coordonnees_01); \
/* Sauvegarde du niveau du point courant sans interpolation (introduit le 20080926132449). */ \
\
Test(IL_FAUT(NomFonctionCourant QD@@__ _____interpoler_bilineairement_ou_bicubiquement)) \
/* Test introduit le 20080926132449... */ \
Bblock \
Test(IL_FAUT(NomFonctionCourant QD@@__ _____utiliser_l_interpolation_bilineaire)) \
Bblock \
VOISINAGE_POINT_BILINEAIRE(Xf_effective \
,Yf_effective \
,BLOC(VIDE;) \
,BLOC(VIDE;) \
,genere_Float \
,FLOT__NIVEAU_UNDEF \
,FZERO \
,FZERO \
,NEUT \
,NomFonctionCourant QD@@__ _____ponderation_du_barycentre_d_interpolation_X \
,NomFonctionCourant QD@@__ _____ponderation_du_barycentre_d_interpolation_Y \
); \
/* Rappelons que : */ \
/* */ \
/* [(1-u)*(1-v)] */ \
/* +[u*(1-v)] */ \
/* +[u*v] */ \
/* +[(1-u)*v] = 1. */ \
/* */ \
/* {u,v} designant les coordonnees barycentriques du point {Xf_effective,Yf_effective} */ \
/* dans le carre courant. */ \
Eblock \
ATes \
Bblock \
VOISINAGE_POINT_BICUBIQUE(Xf_effective \
,Yf_effective \
,BLOC(VIDE;) \
,BLOC(VIDE;) \
,genere_Float \
,FLOT__NIVEAU_UNDEF \
,FZERO \
,FZERO \
,NomFonctionCourant QD@@__ _____ponderation_du_barycentre_d_interpolation_X \
,NomFonctionCourant QD@@__ _____ponderation_du_barycentre_d_interpolation_Y \
); \
Eblock \
ETes \
\
Test(IL_FAUT(bILOAD_POINT_COORDONNEES_01_____eviter_les_fortes_discontinuites)) \
/* Test introduit le 20170228182517... */ \
Bblock \
Test(IFEQ_a_peu_pres_absolu(niveau_du_point_de_coordonnees_01 \
,niveau_sans_interpolation_du_point_de_coordonnees_01 \
,bILOAD_POINT_COORDONNEES_01_____epsilon_detection_des_fortes_discontinuites \
) \
) \
Bblock \
Eblock \
ATes \
Bblock \
EGAL(niveau_du_point_de_coordonnees_01,niveau_sans_interpolation_du_point_de_coordonnees_01); \
/* Dans le cas ou il y a une trop forte discontinuite, on "oublie" l'interpolation... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
EGAL(niveau_du_point_de_coordonnees_01,niveau_sans_interpolation_du_point_de_coordonnees_01); \
/* La possibilite de ne pas interpoler a ete introduite le 20080926132449... */ \
/* */ \
/* Mis sous cette forme le 20170301073336 : le deplacement de 'VOISINAGE_POINT_SIMPLE(...)' */ \
/* en tete de cette procedure est destine a detecter les discontinuites... */ \
Eblock \
ETes \
\
Eblock \
/* Procedure introduite le 20091202184549 dans le but de generer plusieurs fonctions */ \
/* realisant cette operation, mais avec des types d'images differents... */
#define GENERATION_DE_L_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01 \
GENERATION_DE_L_ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS \
(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01 \
/* On notera que l'on utilise le nom 'S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01' pour */ \
/* les donnees de l'accelerateur et non pas 'ACCELERATEUR__ILOAD_POINT_COORDONNEES_01' */ \
/* car, en effet, ce dernier nom est aussi celui de la procedure d'acceleration et donc */ \
/* si ce nom etait utilise, il y aurait substitution par la definition de l'accelerateur */ \
/* a suivre... */ \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,DEFV(Local,DEFV(Float,DdTb1(POINTERf \
,S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_1 \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,ADRESSE_NON_ENCORE_DEFINIE \
) \
) \
); \
DEFV(Local,DEFV(Float,DdTb1(POINTERf \
,S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_2 \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,ADRESSE_NON_ENCORE_DEFINIE \
) \
) \
); \
/* Donne les deux arguments de l'entree courante (si elle est valide...). */ \
) \
/* Donnees de l'accelerateur a deux arguments... */
#define ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
TRON(DIVI(dimXY,GRO2(CENT)),CENT,CENT_MILLE)
#define ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE \
ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS__PREMIERE_ENTREE
#define ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__DERNIERE_ENTREE \
LSTX(ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
)
#define ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__PONDERATEUR \
ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS__PONDERATEUR
/* Parametres fondamentaux. */
/* */
/* Jusqu'au 20120930085841 c'etait 'dimXYZ' qui figurait ci-dessus : cela venait du fait */
/* que 'ACCELERATEUR__ILOAD_POINT_COORDONNEES_01(...)' ici genere etait en fait une "copie" */
/* de 'ACCELERATEUR__ALOAD_POINT_COORDONNEES_01(...)', l'adaptation faite le 20120619132452, */
/* ayant oublie ce remplacement. Ainsi, le 20120930085841 'dimXY' a remplace 'dimXYZ'... */
#define ACCELERATEUR__ILOAD_POINT_COORDONNEES_01(valeur_fonction,calcul_fonction,Argument_1,Argument_2,fonction,objet) \
/* Procedure introduite le 20120619132452... */ \
Bblock \
ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS \
(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01 \
,S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____utiliser_l_accelerateur \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__DERNIERE_ENTREE \
,BLOC( \
Bblock \
MdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_1 \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
MdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_2 \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
/* Allocation de la memoire des listes d'Arguments. */ \
Eblock \
) \
,BLOC( \
Bblock \
EGAL(IdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_1 \
,INDX(index_d_initialisation,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE) \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,FLOT__UNDEF \
); \
EGAL(IdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_2 \
,INDX(index_d_initialisation,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE) \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,FLOT__UNDEF \
); \
/* Initialisation des listes d'Arguments. */ \
Eblock \
) \
,HORNER_1_01(ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__PONDERATEUR \
,Argument_1 \
,Argument_2 \
) \
/* Calcul d'une fonction des deux arguments : */ \
/* */ \
/* 1 0 */ \
/* Argument1.P + Argument2.P */ \
/* */ \
/* ou 'P' represente le 'PONDERATEUR' (arbitraire...). */ \
/* */ \
/* Cette methode repose sur le programme 'v $xtc/HashCode.01$c'... */ \
,IFET(IFEQ(IdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_1 \
,index_d_acceleration \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_1 \
) \
,IFEQ(IdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_2 \
,index_d_acceleration \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_2 \
) \
) \
/* Est-ce la liste {Argument_1,Argument_2} memorisee ? */ \
,BLOC( \
Bblock \
EGAL(IdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_1 \
,index_d_acceleration \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_1 \
); \
EGAL(IdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_2 \
,index_d_acceleration \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_2 \
); \
Eblock \
) \
,BLOC( \
Bblock \
FdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_2 \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
FdTb1(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____Argument_1 \
,ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
/* Desallocation de la memoire des listes d'Arguments. */ \
/* */ \
/* On notera qu'a priori on n'utilisera jamais cette sequence puisqu'en effet, on ne sait */ \
/* jamais que c'est la derniere fois. C'est introduit malgre tout par "symetrie"... */ \
Eblock \
) \
,valeur_fonction \
,BLOC(calcul_fonction) \
,fonction \
,objet \
) \
Eblock
DEFV(Common,DEFV(Logical,PINT(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____utiliser_l_accelerateur,FAUX)));
/* Indique si l'accelerateur doit etre utilise ou pas... */
/* */
/* Le 20120619134249, l'accelerateur est desactive par defaut suite a des tests faits a */
/* l'aide de 'v $xci/GenDeform.01$K' qui montrent un ralentissement d'un facteur 1.3, */
/* mais cela est tout a fait normal car en effet 'FFload_point_coordonnees_01(...)' n'y est */
/* appele qu'une seule fois pour chaque couple {X,Y} ; et donc le ralentissment est le */
/* "cout" de l'accelerateur... */
DEFV(Common,DEFV(Logical,PINT(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____fermer_l_accelerateur,FAUX)));
/* Indique si l'accelerateur doit etre ferme... */
/* */
/* Ainsi, pour fermer l'accelerateur, il suffirait de faire : */
/* */
/* EGAL(S_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01_____fermer_l_accelerateur,VRAI); */
/* */
/* puis d'appeler (une derniere fois...) : */
/* */
/* FAload_point_coordonnees_01(...) */
/* */
/* ou encore : */
/* */
/* FFAload_point_coordonnees_01(...) */
/* */
/* (qui utilisent 'ILOAD_POINT_COORDONNEES_01(...)') avec des parametres dont la valeur */
/* a peu d'importance (a condition evidemment qu'ils soient licites...). Mais cela ne serait */
/* pas tres "elegant" car, en effet, cela obligerait a mettre la sequence qui precede dans */
/* dans le code de tous les appelants des fonctions 'FAload_point_coordonnees_01(...)' */
/* et 'FFAload_point_coordonnees_01(...)', ce qui rendrait "visible" de l'exterieur */
/* l'accelerateur, alors que l'idee est qu'il soit justement "invisible". Or enfin et de */
/* nouveau, on ne peut rendre cette "fermeture" automatique car, en effet, il n'y a aucune */
/* facon, en toute generalite, de connaitre le dernier appel a ces fonctions... */
GENERATION_DE_L_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01;
/* Generation des donnees utiles a l'accelerateur. */
#define ILOAD_POINT_COORDONNEES_01 \
Bblock \
Test(IL_FAUT(NomFonctionCourant QD@@__ _____appliquer_une_matrice_de_transformation)) \
Bblock \
EGAL(Xf_effective,TRANSFORMATION_GEOMETRIQUE_2D_Xf(Xf,Yf)); \
EGAL(Yf_effective,TRANSFORMATION_GEOMETRIQUE_2D_Yf(Xf,Yf)); \
/* La possibilite de transformer {Xf,Yf} fut introduite le 20080802120636... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
ACCELERATEUR__ILOAD_POINT_COORDONNEES_01(niveau_du_point_de_coordonnees_01 \
,BLOC( \
bILOAD_POINT_COORDONNEES_01; \
) \
,Xf_effective \
,Yf_effective \
,NomDeLaFonctionCourante QD@@__ \
,imageA \
); \
/* Utilisation de l'accelerateur... */ \
/* */ \
/* Le 20120929165544, {Xf_effective,Yf_effective} a remplace {Xf,Yf} */ \
/* suite au probleme 'v $xig/fonct$vv$DEF 20120929145125'... */ \
Eblock \
/* Acces a un point de coordonnees dans [0,1]... */
#define TRANSFORMATION_GEOMETRIQUE_2D_Xf(Xf,Yf) \
gTRANSFORMATION_GEOMETRIQUE_3D_Fxyz(NomFonctionCourant QD@@__ _____matrice_de_transformation \
,SOUS(Xf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Xf) \
,SOUS(Yf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Yf) \
,NomFonctionCourant QD@@__ _____Zf \
,cx \
,NomFonctionCourant QD@@__ _____Post___Translation_Xf \
)
#define TRANSFORMATION_GEOMETRIQUE_2D_Yf(Xf,Yf) \
gTRANSFORMATION_GEOMETRIQUE_3D_Fxyz(NomFonctionCourant QD@@__ _____matrice_de_transformation \
,SOUS(Xf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Xf) \
,SOUS(Yf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Yf) \
,NomFonctionCourant QD@@__ _____Zf \
,cy \
,NomFonctionCourant QD@@__ _____Post___Translation_Yf \
)
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# define INITIALISATION_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE(Xf_apres_reechantillonnage,Yf_apres_reechantillonnage,tX,tY) \
/* ATTENTION, l'absence de 'Bblock' et de 'Eblock' est due au 'PUSH_ECHANTILLONNAGE' qui */ \
/* suit... */ \
\
gINITIALISATION_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE \
(Xf_apres_reechantillonnage \
,Yf_apres_reechantillonnage \
,FZERO \
,FZERO \
,NomFonctionCourant QD@@__ _____utiliser_pasX_et_pasY \
,NomFonctionCourant QD@@__ _____pasX \
,NomFonctionCourant QD@@__ _____pasY \
); \
\
/* ATTENTION, l'absence de 'Bblock' et de 'Eblock' est due au 'PUSH_ECHANTILLONNAGE' qui */ \
/* suit... */ \
\
/* Initialisation des operations et definition des donnees utiles... */
# define __DENORMALISE_DU_NIVEAU_INTERPOLE(niveau_interpole) \
NEUT(niveau_interpole) \
/* Normalisation_du_niveau interpole. */
# define RANGEMENT_DU_NIVEAU_INTERPOLE(niveau_interpole,imageR,X_apres_reechantillonnage,Y_apres_reechantillonnage) \
Bblock \
EGAL(niveau_du_point_de_coordonnees_01,niveau_interpole_avant_le_reechantillonnage); \
Eblock \
/* Renvoi du niveau interpole... */
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E " S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# define ECHANTILLONNAGE_DENORMALISE_DE_L_IMAGE(x,y) \
FLOT(Fload_point(imageA \
,x,y \
,periodiser_X \
,periodiser_Y \
,symetriser_X \
,symetriser_Y \
,prolonger_X \
,prolonger_Y \
,niveau_hors_image \
) \
) \
/* Fonction d'echantillonage "entier" de l'image dans [0,1[. */
# define ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(x,y) \
FLOT(Fload_point(imageA \
,x,y \
,periodiser_X \
,periodiser_Y \
,symetriser_X \
,symetriser_Y \
,prolonger_X \
,prolonger_Y \
,niveau_hors_image \
) \
) \
/* Fonction d'echantillonage "entier" de l'image dans [0,1[. */
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
DEFV(Common,DEFV(Logical,SINT(Fload_point_coordonnees_01_____appliquer_une_matrice_de_transformation,FAUX)));
DEFV(Common,DEFV(matrixF_3D,SINS(Fload_point_coordonnees_01_____matrice_de_transformation
,IstructH103(IstructL03(FU___,FZERO,FZERO)
,IstructL03(FZERO,FU___,FZERO)
,IstructL03(FZERO,FZERO,FU___)
)
)
)
);
DEFV(Common,DEFV(Float,SINT(Fload_point_coordonnees_01_____PreAntiTranslation_Xf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(Fload_point_coordonnees_01_____Post___Translation_Xf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(Fload_point_coordonnees_01_____PreAntiTranslation_Yf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(Fload_point_coordonnees_01_____Post___Translation_Yf,NEUT(FDU))));
/* Definition d'une eventuelle matrice de transformation neutre par defaut... */
/* neutre par defaut... */
/* */
/* On notera la notation "PreAnti" qui signifie que les translations de ce type sont en */
/* fait appliquees via un 'SOUS(...)', alors que les translations de type "Post" passent */
/* par un 'ADD2(...)' ('v $xiii/vecteurs$DEF gTRANSFORMATION_GEOMETRIQUE_3D_Fxyz') via un */
/* 'LIN3(...)'. */
DEFV(Common,DEFV(Float,SINT(Fload_point_coordonnees_01_____Zf,FZmin)));
/* Coordonnee 'Zf' a priori inutile, on ne sait jamais... */
DEFV(Common,DEFV(Logical,SINT(Fload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement,VRAI)));
/* Pour choisir entre interpoler ('VRAI' et alors suivant l'indicateur de choix suivant */
/* 'Fload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire') ou pas ('FAUX'). */
DEFV(Common,DEFV(Float,SINT(Fload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_X
,NE_PAS_BLOQUER_L_INTERPOLATION_X
)
)
);
DEFV(Common,DEFV(Float,SINT(Fload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Y
,NE_PAS_BLOQUER_L_INTERPOLATION_Y
)
)
);
/* Parametres d'interpolation des coordonnees barycentriques. */
/* */
/* Ils permettent d'etre plus selectifs que le paramatre global definit ci-dessus */
/* ('Fload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement'). */
/* */
/* On notera que cette possibilite a ete introduite ici par symetrie avec */
/* 'FFAload_point_coordonnees_01(...)', plus que par interet ou utilite... */
DEFV(Common,DEFV(Logical,SINT(Fload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire,FAUX)));
/* Pour choisir entre 'VOISINAGE_POINT_BILINEAIRE(...)' et 'VOISINAGE_POINT_BICUBIQUE(...)'. */
DEFV(Common,DEFV(Logical,SINT(Fload_point_coordonnees_01_____utiliser_pasX_et_pasY,VRAI)));
/* Meme remarque que 'Fload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire' */
DEFV(Common,DEFV(Int,SINT(Fload_point_coordonnees_01_____pasX,PasX)));
DEFV(Common,DEFV(Int,SINT(Fload_point_coordonnees_01_____pasY,PasY)));
/* Si 'IL_NE_FAUT_PAS(Fload_point_coordonnees_01_____utiliser_pasX_et_pasY), donne */
/* {pasX,pasY} a utiliser... */
DEFV(Common,DEFV(FonctionP,Fload_point_coordonnees_01(imageA
,Xf,Yf
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
)
)
)
/* Fonction introduite le 20091203092546... */
DEFV(Argument,DEFV(image,imageA));
/* Image contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
/* Coordonnees {Xf,Yf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est symetrique ou pas. */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] doit etre prolonge a l'exterieur comme il */
/* est au bord... */
DEFV(Argument,DEFV(genere_p,niveau_hors_image));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-image". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Float,INIT(Xf_effective,Xf));
DEFV(Float,INIT(Yf_effective,Yf));
/* Coordonnees effectives... */
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01,FLOT__NIVEAU_UNDEF));
/* Niveau du point {Xf,Yf}. */
/*..............................................................................................................................*/
ILOAD_POINT_COORDONNEES_01;
RETU(GENP(niveau_du_point_de_coordonnees_01));
Eblock
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# undef ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE
# undef ECHANTILLONNAGE_DENORMALISE_DE_L_IMAGE
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E " N O N S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S : */
/* */
/*************************************************************************************************************************************/
BFonctionF
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# define ECHANTILLONNAGE_DENORMALISE_DE_L_IMAGE(x,y) \
FFload_point(imageA \
,x,y \
,periodiser_X \
,periodiser_Y \
,symetriser_X \
,symetriser_Y \
,prolonger_X \
,prolonger_Y \
,niveau_hors_image \
) \
/* Fonction d'echantillonage "entier" de l'image dans [0,1[. */
# define ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE(x,y) \
FFload_point(imageA \
,x,y \
,periodiser_X \
,periodiser_Y \
,symetriser_X \
,symetriser_Y \
,prolonger_X \
,prolonger_Y \
,niveau_hors_image \
) \
/* Fonction d'echantillonage "entier" de l'image dans [0,1[. */
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_____appliquer_une_matrice_de_transformation,FAUX)));
DEFV(Common,DEFV(matrixF_3D,SINS(FFload_point_coordonnees_01_____matrice_de_transformation
,IstructH103(IstructL03(FU___,FZERO,FZERO)
,IstructL03(FZERO,FU___,FZERO)
,IstructL03(FZERO,FZERO,FU___)
)
)
)
);
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_____PreAntiTranslation_Xf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_____Post___Translation_Xf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_____PreAntiTranslation_Yf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_____Post___Translation_Yf,NEUT(FDU))));
/* Definition d'une eventuelle matrice de transformation (introduite le 20080802115907), */
/* neutre par defaut... */
/* */
/* Les "Pre" et "Post" translations ont ete introduites le 20080803093325. On notera la */
/* notation "PreAnti" qui signifie que les translations de ce type sont en fait appliquees */
/* via un 'SOUS(...)', alors que les translations de type "Post" passent par un 'ADD2(...)' */
/* via un 'LIN3(...)' ('v $xiii/vecteurs$DEF gTRANSFORMATION_GEOMETRIQUE_3D_Fxyz'). */
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_____Zf,FZmin)));
/* Coordonnee 'Zf' a priori inutile introduite le 20080805102942, on ne sait jamais... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement,VRAI)));
/* Pour choisir entre interpoler ('VRAI' et alors suivant l'indicateur de choix suivant */
/* 'FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire') ou pas ('FAUX'). */
/* Cet indicateur a ete introduit le 20080926132449... */
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_X
,NE_PAS_BLOQUER_L_INTERPOLATION_X
)
)
);
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Y
,NE_PAS_BLOQUER_L_INTERPOLATION_Y
)
)
);
/* Parametres d'interpolation des coordonnees barycentriques introduits le 20080930163349. */
/* Ils permettent d'etre plus selectifs que le paramatre global definit ci-dessus */
/* ('FFload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement'). */
/* */
/* On notera que cette possibilite a ete introduite ici par symetrie avec */
/* 'FFAload_point_coordonnees_01(...)', plus que par interet ou utilite... */
/* */
/* Le 20081001092211, cette possibilite a ete etendue a 'VOISINAGE_POINT_BILINEAIRE(...)' */
/* alors qu'avant cette date, elle etait limitee a 'VOISINAGE_POINT_BICUBIQUE(...)'... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire,FAUX)));
/* Pour choisir entre 'VOISINAGE_POINT_BILINEAIRE(...)' et 'VOISINAGE_POINT_BICUBIQUE(...)' */
/* (introduit le 20050322112315). Le choix par defaut correspond a la compatibilite avec ce */
/* existait anterieurement a cette date... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_____utiliser_pasX_et_pasY,VRAI)));
/* Meme remarque que 'FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire' */
/* (introduit le 20041107175457 car manquait...). */
DEFV(Common,DEFV(Int,SINT(FFload_point_coordonnees_01_____pasX,PasX)));
DEFV(Common,DEFV(Int,SINT(FFload_point_coordonnees_01_____pasY,PasY)));
/* Si 'IL_NE_FAUT_PAS(FFload_point_coordonnees_01_____utiliser_pasX_et_pasY), donne */
/* {pasX,pasY} a utiliser... */
DEFV(Common,DEFV(FonctionF,FFload_point_coordonnees_01(imageA
,Xf,Yf
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
)
)
)
DEFV(Argument,DEFV(imageF,imageA));
/* Image contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
/* Coordonnees {Xf,Yf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est symetrique ou pas. Ceci a ete */
/* introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] doit etre prolonge a l'exterieur comme il */
/* est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_image));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-image". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Float,INIT(Xf_effective,Xf));
DEFV(Float,INIT(Yf_effective,Yf));
/* Coordonnees effectives introduites le 20080728211430... */
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01,FLOT__NIVEAU_UNDEF));
/* Niveau du point {Xf,Yf}. */
/*..............................................................................................................................*/
ILOAD_POINT_COORDONNEES_01;
RETU(niveau_du_point_de_coordonnees_01);
Eblock
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \
)
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# undef ECHANTILLONNAGE_NORMALISE_DE_L_IMAGE
# undef ECHANTILLONNAGE_DENORMALISE_DE_L_IMAGE
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
EFonctionF
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
# undef RANGEMENT_DU_NIVEAU_INTERPOLE
# undef __DENORMALISE_DU_NIVEAU_INTERPOLE
# undef INITIALISATION_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
|| (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#undef TRANSFORMATION_GEOMETRIQUE_2D_Yf
#undef TRANSFORMATION_GEOMETRIQUE_2D_Xf
#undef ILOAD_POINT_COORDONNEES_01
#undef ACCELERATEUR__ILOAD_POINT_COORDONNEES_01
#undef ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__PONDERATEUR
#undef ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__DERNIERE_ENTREE
#undef ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE
#undef ACCELERATEUR__ILOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES
#undef GENERATION_DE_L_ACCELERATEUR__ILOAD_POINT_COORDONNEES_01
#undef bILOAD_POINT_COORDONNEES_01
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E */
/* A V E C C O O R D O N N E E S F L O T T A N T E S I N D I R E C T E S : */
/* */
/*************************************************************************************************************************************/
BFonctionF
/* ATTENTION : on notera que toutes les variables qui suivent (jusqu'a celles qui sont */
/* relatives a 'imageAX' et a 'imageAY') ont un nom qui se termine par un "_". Ceci est */
/* du a l'usage qui est fait de ces noms dans : */
/* */
/* SAUVEGARDES_POUR_ACCES_INDIRECT_AUX_COORDONNEES(VIDE); --------------- */
/* | */
/* En effet, lors des : | */
/* | */
/* SAUVEGARDES_POUR_ACCES_INDIRECT_AUX_COORDONNEES(Im); ------- | */
/* | | */
/* les concatenations suivantes : | | */
/* | | */
/* ..._ ## Im | | */
/* | | */
/* sont faites et generent donc des variables du type : | | */
/* | | */
/* ..._imageAX <-----------------------------------------------| | */
/* ..._imageAY <----------------------------------------------- | */
/* | */
/* ou ainsi 'imageAX' et a 'imageAY' sont isoles de ce qui precede par un "_", d'ou | */
/* les "_" terminaux ci-apres qui correspondent donc a des variables du type : | */
/* | */
/* ..._VIDE <------------------------------------------------------------ */
/* */
/* ou "VIDE" est vide... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____periodiser_X_,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____periodiser_Y_,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____symetriser_X_,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____symetriser_Y_,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____prolonger_X_,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____prolonger_Y_,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(FFload_point_coordonnees_01_indirectes_____niveau_hors_image_,FXmin)));
/* Parametrage de l'acces a 'imageAX' via 'FFload_point_coordonnees_01(...). */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_
,FAUX
)
)
);
DEFV(Common,DEFV(matrixF_3D,SINS(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_
,IstructH103(IstructL03(FU___,FZERO,FZERO)
,IstructL03(FZERO,FU___,FZERO)
,IstructL03(FZERO,FZERO,FU___)
)
)
)
);
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Xf_,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____Post___Translation_Xf_,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Yf_,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____Post___Translation_Yf_,NEUT(FDU))));
/* Definition d'une eventuelle matrice de transformation neutre par defaut... */
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____Zf_,FZmin)));
/* Coordonnee 'Zf' a priori inutile, mais on ne sait jamais... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____interpoler_bilineairement_ou_bicubiquement_
,VRAI
)
)
);
/* Pour choisir entre interpoler ('VRAI' et alors suivant l'indicateur de choix suivant */
/* 'FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_') ou pas */
/* ('FAUX'). */
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_X_
,NE_PAS_BLOQUER_L_INTERPOLATION_X
)
)
);
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_Y_
,NE_PAS_BLOQUER_L_INTERPOLATION_Y
)
)
);
/* Parametres d'interpolation des coordonnees barycentriques. */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_,VRAI)));
/* Pour choisir entre 'VOISINAGE_POINT_BILINEAIRE(...)' et 'VOISINAGE_POINT_BICUBIQUE(...)'. */
/* */
/* Le 20090508182032 la valeur par defaut est passee de 'FAUX' a 'VRAI' afin d'eviter les */
/* problemes de rebond. On notera que l'on ne peut en faire autant avec l'indicateur */
/* 'FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire' pour des raisons */
/* de compatibilite anterieure... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____utiliser_pasX_et_pasY_,VRAI)));
DEFV(Common,DEFV(Int,SINT(FFload_point_coordonnees_01_indirectes_____pasX_,PasX)));
DEFV(Common,DEFV(Int,SINT(FFload_point_coordonnees_01_indirectes_____pasY_,PasY)));
/* Si 'IL_NE_FAUT_PAS(FFload_point_coordonnees_01_indirectes_____utiliser_pasX_et_pasY_), */
/* donne {pasX,pasY} a utiliser... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____periodiser_X_imageAX,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____periodiser_Y_imageAX,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____symetriser_X_imageAX,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____symetriser_Y_imageAX,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____prolonger_X_imageAX,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____prolonger_Y_imageAX,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(FFload_point_coordonnees_01_indirectes_____niveau_hors_image_imageAX,FXmin)));
/* Parametrage de l'acces a 'imageAX' via 'FFload_point_coordonnees_01(...). */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_imageAX
,FAUX
)
)
);
DEFV(Common,DEFV(matrixF_3D,SINS(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAX
,IstructH103(IstructL03(FU___,FZERO,FZERO)
,IstructL03(FZERO,FU___,FZERO)
,IstructL03(FZERO,FZERO,FU___)
)
)
)
);
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Xf_imageAX,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____Post___Translation_Xf_imageAX,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Yf_imageAX,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____Post___Translation_Yf_imageAX,NEUT(FDU))));
/* Definition d'une eventuelle matrice de transformation neutre par defaut... */
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____Zf_imageAX,FZmin)));
/* Coordonnee 'Zf' a priori inutile, mais on ne sait jamais... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____interpoler_bilineairement_ou_bicubiquement_imageAX
,VRAI
)
)
);
/* Pour choisir entre interpoler ('VRAI' et alors suivant l'indicateur de choix suivant */
/* 'FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire') ou pas */
/* ('FAUX'). */
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_X_imageAX
,NE_PAS_BLOQUER_L_INTERPOLATION_X
)
)
);
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_Y_imageAX
,NE_PAS_BLOQUER_L_INTERPOLATION_Y
)
)
);
/* Parametres d'interpolation des coordonnees barycentriques. */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_imageAX,VRAI)));
/* Pour choisir entre 'VOISINAGE_POINT_BILINEAIRE(...)' et 'VOISINAGE_POINT_BICUBIQUE(...)'. */
/* */
/* Le 20090508182032 la valeur par defaut est passee de 'FAUX' a 'VRAI' afin d'eviter les */
/* problemes de rebond. */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____utiliser_pasX_et_pasY_imageAX,VRAI)));
DEFV(Common,DEFV(Int,SINT(FFload_point_coordonnees_01_indirectes_____pasX_imageAX,PasX)));
DEFV(Common,DEFV(Int,SINT(FFload_point_coordonnees_01_indirectes_____pasY_imageAX,PasY)));
/* Si 'IL_NE_FAUT_PAS(FFload_point_coordonnees_01_indirectes_____utiliser_pasX_et_pasY_...), */
/* donne {pasX,pasY} a utiliser... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____periodiser_X_imageAY,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____periodiser_Y_imageAY,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____symetriser_X_imageAY,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____symetriser_Y_imageAY,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____prolonger_X_imageAY,FAUX)));
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____prolonger_Y_imageAY,FAUX)));
DEFV(Common,DEFV(genere_Float,SINT(FFload_point_coordonnees_01_indirectes_____niveau_hors_image_imageAY,FYmin)));
/* Parametrage de l'acces a 'imageAY' via 'FFload_point_coordonnees_01(...). */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_imageAY
,FAUX
)
)
);
DEFV(Common,DEFV(matrixF_3D,SINS(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_imageAY
,IstructH103(IstructL03(FU___,FZERO,FZERO)
,IstructL03(FZERO,FU___,FZERO)
,IstructL03(FZERO,FZERO,FU___)
)
)
)
);
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Xf_imageAY,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____Post___Translation_Xf_imageAY,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Yf_imageAY,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____Post___Translation_Yf_imageAY,NEUT(FDU))));
/* Definition d'une eventuelle matrice de transformation neutre par defaut... */
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____Zf_imageAY,FZmin)));
/* Coordonnee 'Zf' a priori inutile, mais on ne sait jamais... */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____interpoler_bilineairement_ou_bicubiquement_imageAY
,VRAI
)
)
);
/* Pour choisir entre interpoler ('VRAI' et alors suivant l'indicateur de choix suivant */
/* 'FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire') ou pas */
/* ('FAUX'). */
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_X_imageAY
,NE_PAS_BLOQUER_L_INTERPOLATION_X
)
)
);
DEFV(Common,DEFV(Float,SINT(FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_Y_imageAY
,NE_PAS_BLOQUER_L_INTERPOLATION_Y
)
)
);
/* Parametres d'interpolation des coordonnees barycentriques. */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_imageAY,VRAI)));
/* Pour choisir entre 'VOISINAGE_POINT_BILINEAIRE(...)' et 'VOISINAGE_POINT_BICUBIQUE(...)'. */
/* */
/* Le 20090508182032 la valeur par defaut est passee de 'FAUX' a 'VRAI' afin d'eviter les */
/* problemes de rebond. */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____utiliser_pasX_et_pasY_imageAY,VRAI)));
DEFV(Common,DEFV(Int,SINT(FFload_point_coordonnees_01_indirectes_____pasX_imageAY,PasX)));
DEFV(Common,DEFV(Int,SINT(FFload_point_coordonnees_01_indirectes_____pasY_imageAY,PasY)));
/* Si 'IL_NE_FAUT_PAS(FFload_point_coordonnees_01_indirectes_____utiliser_pasX_et_pasY_...) */
/* donne {pasX,pasY} a utiliser... */
#define SAUVEGARDES_POUR_ACCES_INDIRECT_AUX_COORDONNEES(Im) \
/* Procedure introduite le 20090508131612. */ \
Bblock \
BSaveModifyVariable(Float \
,FFload_point_coordonnees_01_____PreAntiTranslation_Xf \
,FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Xf_ ## Im \
); \
BSaveModifyVariable(Float \
,FFload_point_coordonnees_01_____Post___Translation_Xf \
,FFload_point_coordonnees_01_indirectes_____Post___Translation_Xf_ ## Im \
); \
BSaveModifyVariable(Float \
,FFload_point_coordonnees_01_____PreAntiTranslation_Yf \
,FFload_point_coordonnees_01_indirectes_____PreAntiTranslation_Yf_ ## Im \
); \
BSaveModifyVariable(Float \
,FFload_point_coordonnees_01_____Post___Translation_Yf \
,FFload_point_coordonnees_01_indirectes_____Post___Translation_Yf_ ## Im \
); \
BSaveModifyVariable(Float \
,FFload_point_coordonnees_01_____Zf \
,FFload_point_coordonnees_01_indirectes_____Zf_ ## Im \
); \
BSaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement \
,FFload_point_coordonnees_01_indirectes_____interpoler_bilineairement_ou_bicubiquement_ ## Im \
); \
BSaveModifyVariable(Float \
,FFload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_X \
,FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_X_ ## Im \
); \
BSaveModifyVariable(Float \
,FFload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Y \
,FFload_point_coordonnees_01_indirectes_____ponderation_du_barycentre_d_interpolation_Y_ ## Im \
); \
BSaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire \
,FFload_point_coordonnees_01_indirectes_____utiliser_l_interpolation_bilineaire_ ## Im \
); \
BSaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____utiliser_pasX_et_pasY \
,FFload_point_coordonnees_01_indirectes_____utiliser_pasX_et_pasY_ ## Im \
); \
BSaveModifyVariable(Int \
,FFload_point_coordonnees_01_____pasX \
,FFload_point_coordonnees_01_indirectes_____pasX_ ## Im \
); \
BSaveModifyVariable(Int \
,FFload_point_coordonnees_01_____pasY \
,FFload_point_coordonnees_01_indirectes_____pasY_ ## Im \
); \
BSaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____appliquer_une_matrice_de_transformation \
,FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_ ## Im \
); \
\
begin_nouveau_block \
Bblock \
DEFV(matrixF_3D,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_____matrice_de_transformation); \
TRANSFERT_MATRICE_3D(EnTete_de_sauvegardM ## FFload_point_coordonnees_01_____matrice_de_transformation \
,FFload_point_coordonnees_01_____matrice_de_transformation \
); \
TRANSFERT_MATRICE_3D(FFload_point_coordonnees_01_____matrice_de_transformation \
,FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_ ## Im \
); \
/* Parametrage des arguments "implicites" de 'FFload_point_coordonnees_01(...)' avec */ \
/* sauvegarde preliminaire... */
#define RESTAURATIONS_POUR_ACCES_INDIRECT_AUX_COORDONNEES \
/* Procedure introduite le 20090508131612. */ \
TRANSFERT_MATRICE_3D(FFload_point_coordonnees_01_____matrice_de_transformation \
,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_____matrice_de_transformation \
); \
\
Eblock \
end_nouveau_block \
\
ESaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____appliquer_une_matrice_de_transformation \
); \
ESaveModifyVariable(Int \
,FFload_point_coordonnees_01_____pasY \
); \
ESaveModifyVariable(Int \
,FFload_point_coordonnees_01_____pasX \
); \
ESaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____utiliser_pasX_et_pasY \
); \
ESaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire \
); \
ESaveModifyVariable(Float \
,FFload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Y \
); \
ESaveModifyVariable(Float \
,FFload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_X \
); \
ESaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement \
); \
ESaveModifyVariable(Float \
,FFload_point_coordonnees_01_____Zf \
); \
ESaveModifyVariable(Float \
,FFload_point_coordonnees_01_____Post___Translation_Yf \
); \
ESaveModifyVariable(Float \
,FFload_point_coordonnees_01_____PreAntiTranslation_Yf \
); \
ESaveModifyVariable(Float \
,FFload_point_coordonnees_01_____Post___Translation_Xf \
); \
ESaveModifyVariable(Float \
,FFload_point_coordonnees_01_____PreAntiTranslation_Xf \
); \
/* Restauration des arguments "implicites" de 'FFload_point_coordonnees_01(...)'. */ \
Eblock \
/* Procedure introduite le 20090506125515. */
#define ACCES_INDIRECT_AUX_COORDONNEES(XYf_indirecte,Im,Xf,Yf) \
Bblock \
SAUVEGARDES_POUR_ACCES_INDIRECT_AUX_COORDONNEES(Im); \
\
EGAL(XYf_indirecte \
,FFload_point_coordonnees_01(Im \
,Xf \
,Yf \
,FFload_point_coordonnees_01_indirectes_____periodiser_X_ ## Im \
,FFload_point_coordonnees_01_indirectes_____periodiser_Y_ ## Im \
,FFload_point_coordonnees_01_indirectes_____symetriser_X_ ## Im \
,FFload_point_coordonnees_01_indirectes_____symetriser_Y_ ## Im \
,FFload_point_coordonnees_01_indirectes_____prolonger_X_ ## Im \
,FFload_point_coordonnees_01_indirectes_____prolonger_Y_ ## Im \
,FFload_point_coordonnees_01_indirectes_____niveau_hors_image_ ## Im \
) \
); \
/* Acces indirect a l'une des coordonnees 'X' ou 'Y'... */ \
\
RESTAURATIONS_POUR_ACCES_INDIRECT_AUX_COORDONNEES; \
Eblock \
/* Procedure introduite le 20090506125515. */
DEFV(Common,DEFV(Logical,SINT(FFload_point_coordonnees_01_indirectes_____iterer_l_indirection,FAUX)));
DEFV(Common,DEFV(Int,SINT(FFload_point_coordonnees_01_indirectes_____nombre_d_iterations_de_l_indirection,ZERO)));
/* Introduit le 20090510221521 afin que 'FFload_point_coordonnees_01_indirectes(...)' */
/* soit plus que la "succession" de trois 'FFload_point_coordonnees_01(...)'. */
/* */
/* Le 20200510103543, "__________nombre_d_iterations_de_l_indirection" incomprehensible a */
/* ete remplace par "_____nombre_d_iterations_de_l_indirection" plus "habituel"... */
DEFV(Common,DEFV(FonctionF,FFload_point_coordonnees_01_indirectes(imageA
,Xf,Yf
,imageAX,imageAY
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
)
)
)
/* Fonction introduite le 20090506104004. */
DEFV(Argument,DEFV(imageF,imageA));
/* Image contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
/* Coordonnees {Xf,Yf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(imageF,imageAX));
DEFV(Argument,DEFV(imageF,imageAY));
/* Images contenant la definition de l'adressage indirect pour les coordonnees 'X' et 'Y'... */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est symetrique ou pas. */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] doit etre prolonge a l'exterieur comme il */
/* est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_image));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-image". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(genere_Float,INIT(Xf_indirecte,Xf));
DEFV(genere_Float,INIT(Yf_indirecte,Yf));
/* Coordonnees indirectes. Le 20090510221521, les valeurs initiales 'FLOT__UNDEF' ont ete */
/* emplacees par {Xf,Yf} a cause de la possibilite d'iterations de l'indirection... */
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01_indirectes,FLOT__NIVEAU_UNDEF));
/* Niveau du point {Xf_indirecte,Yf_indirecte}. */
/*..............................................................................................................................*/
Test(IL_NE_FAUT_PAS(FFload_point_coordonnees_01_indirectes_____iterer_l_indirection))
Bblock
ACCES_INDIRECT_AUX_COORDONNEES(Xf_indirecte,imageAX,Xf,Yf)
ACCES_INDIRECT_AUX_COORDONNEES(Yf_indirecte,imageAY,Xf,Yf)
/* Acces indirect aux coordonnees. */
Eblock
ATes
Bblock
Repe(FFload_point_coordonnees_01_indirectes_____nombre_d_iterations_de_l_indirection)
Bblock
DEFV(Float,INIT(Xf_itere,FLOT__UNDEF));
DEFV(Float,INIT(Yf_itere,FLOT__UNDEF));
ACCES_INDIRECT_AUX_COORDONNEES(Xf_itere,imageAX,Xf_indirecte,Yf_indirecte)
ACCES_INDIRECT_AUX_COORDONNEES(Yf_itere,imageAY,Xf_indirecte,Yf_indirecte)
/* Acces indirect aux coordonnees. */
EGAL(Xf_indirecte,Xf_itere);
EGAL(Yf_indirecte,Yf_itere);
Eblock
ERep
Eblock
ETes
SAUVEGARDES_POUR_ACCES_INDIRECT_AUX_COORDONNEES(VIDE);
EGAL(niveau_du_point_de_coordonnees_01_indirectes
,FFload_point_coordonnees_01(imageA
,Xf_indirecte,Yf_indirecte
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
)
);
RESTAURATIONS_POUR_ACCES_INDIRECT_AUX_COORDONNEES;
RETU(niveau_du_point_de_coordonnees_01_indirectes);
Eblock
#undef RESTAURATIONS_POUR_ACCES_INDIRECT_AUX_COORDONNEES
#undef ACCES_INDIRECT_AUX_COORDONNEES
#undef SAUVEGARDES_POUR_ACCES_INDIRECT_AUX_COORDONNEES
EFonctionF
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E " N O N S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S */
/* E T A V E C C O N T R O L E D E S I N T E R P O L A T I O N S : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Common,DEFV(FonctionF,gFFload_point_coordonnees_01(imageA
,Xf,Yf
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
,interpoler_bilineairement_ou_bicubiquement
,utiliser_l_interpolation_bilineaire
)
)
)
/* Fonction introduite le 20150528101138... */
DEFV(Argument,DEFV(imageF,imageA));
/* Image contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
/* Coordonnees {Xf,Yf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est symetrique ou pas. Ceci a ete */
/* introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] doit etre prolonge a l'exterieur comme il */
/* est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_image));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-image". */
DEFV(Argument,DEFV(Logical,interpoler_bilineairement_ou_bicubiquement));
DEFV(Argument,DEFV(Logical,utiliser_l_interpolation_bilineaire));
/* Controle des interpolations... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01,FLOT__NIVEAU_UNDEF));
/* Niveau du point {Xf,Yf}. */
/*..............................................................................................................................*/
BSaveModifyVariable(Logical
,FFload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement
,interpoler_bilineairement_ou_bicubiquement
);
BSaveModifyVariable(Logical
,FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire
,utiliser_l_interpolation_bilineaire
);
EGAL(niveau_du_point_de_coordonnees_01
,FFload_point_coordonnees_01(imageA
,Xf,Yf
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
)
);
ESaveModifyVariable(Logical
,FFload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire
);
ESaveModifyVariable(Logical
,FFload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement
);
RETU(niveau_du_point_de_coordonnees_01);
Eblock
EFonctionF
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E " N O N S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S */
/* E T A V E C S U P E R - C O N T R O L E D E S I N T E R P O L A T I O N S : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Common,DEFV(FonctionF,sgFFload_point_coordonnees_01(imageA
,Xf,Yf
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
,interpoler_bilineairement_ou_bicubiquement
,utiliser_l_interpolation_bilineaire
,eviter_les_fortes_discontinuites
,epsilon_detection_des_fortes_discontinuites
)
)
)
/* Fonction introduite le 20170301142825... */
DEFV(Argument,DEFV(imageF,imageA));
/* Image contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
/* Coordonnees {Xf,Yf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est symetrique ou pas. */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] doit etre prolonge a l'exterieur comme il */
/* est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_image));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-image". */
DEFV(Argument,DEFV(Logical,interpoler_bilineairement_ou_bicubiquement));
DEFV(Argument,DEFV(Logical,utiliser_l_interpolation_bilineaire));
/* Controle des interpolations... */
DEFV(Argument,DEFV(Logical,eviter_les_fortes_discontinuites));
DEFV(Argument,DEFV(Float,epsilon_detection_des_fortes_discontinuites));
/* Super-controle des interpolations... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01,FLOT__NIVEAU_UNDEF));
/* Niveau du point {Xf,Yf}. */
/*..............................................................................................................................*/
BSaveModifyVariable(Logical
,bILOAD_POINT_COORDONNEES_01_____eviter_les_fortes_discontinuites
,eviter_les_fortes_discontinuites
);
BSaveModifyVariable(Float
,bILOAD_POINT_COORDONNEES_01_____epsilon_detection_des_fortes_discontinuites
,epsilon_detection_des_fortes_discontinuites
);
EGAL(niveau_du_point_de_coordonnees_01
,gFFload_point_coordonnees_01(imageA
,Xf,Yf
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
,niveau_hors_image
,interpoler_bilineairement_ou_bicubiquement
,utiliser_l_interpolation_bilineaire
)
);
ESaveModifyVariable(Float
,bILOAD_POINT_COORDONNEES_01_____epsilon_detection_des_fortes_discontinuites
);
ESaveModifyVariable(Logical
,bILOAD_POINT_COORDONNEES_01_____eviter_les_fortes_discontinuites
);
RETU(niveau_du_point_de_coordonnees_01);
Eblock
EFonctionF
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " S T A N D A R D " D ' U N A L B U M : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FAload_point(albumA
,X,Y,Z
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
)
)
)
DEFV(Argument,DEFV(album,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
DEFV(Argument,DEFV(Int,Z));
/* Coordonnees {X,Y,Z} du point argument. On notera qu'avec : */
/* */
/* Z=Zmin */
/* */
/* un 'album' peut simuler une 'image'... */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
/* Ceci a ete introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
DEFV(Argument,DEFV(genere_p,niveau_hors_album));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-album". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Int,INIT(coordonnee_X,UNDEF));
DEFV(Int,INIT(coordonnee_Y,UNDEF));
DEFV(Int,INIT(coordonnee_Z,UNDEF));
/* Coordonnees {X,Y,Z} du point argument apres d'eventuelles transformations... */
DEFV(genere_p,INIT(point,niveau_hors_album));
/* Valeur du point courant initialise a priori sur la situation "hors-album". */
/*..............................................................................................................................*/
Test(I3OU(VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_X,symetriser_X,prolonger_X)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Y,symetriser_Y,prolonger_Y)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Z,symetriser_Z,prolonger_Z)
)
)
Bblock
PRINT_ATTENTION("une seule des options {periodiser,symetriser,prolonger} peut etre VRAI -la premiere 'VRAI' l'emporte-");
Eblock
ATes
Bblock
Eblock
ETes
PERIODISER_SYMETRISER_PROLONGER(X);
PERIODISER_SYMETRISER_PROLONGER(Y);
PERIODISER_SYMETRISER_PROLONGER(Z);
/* Eventuellement, periodisation et prolongement des axes... */
Test(TEST_DANS_L_ALBUM(coordonnee_X,coordonnee_Y,coordonnee_Z))
Bblock
EGAL(point,Aload_point(albumA,coordonnee_X,coordonnee_Y,coordonnee_Z));
/* Acces au point recherche apres ses eventuelles transformations... */
Eblock
ATes
Bblock
Eblock
ETes
RETU(point);
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N A L B U M : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Common,DEFV(FonctionF,FFAload_point(albumA
,X,Y,Z
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
)
)
)
DEFV(Argument,DEFV(albumF,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
DEFV(Argument,DEFV(Int,Z));
/* Coordonnees {X,Y,Z} du point argument. On notera qu'avec : */
/* */
/* Z=Zmin */
/* */
/* un 'album' peut simuler une 'image'... */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
/* Ceci a ete introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_album));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-album". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Int,INIT(coordonnee_X,UNDEF));
DEFV(Int,INIT(coordonnee_Y,UNDEF));
DEFV(Int,INIT(coordonnee_Z,UNDEF));
/* Coordonnees {X,Y,Z} du point argument apres d'eventuelles transformations... */
DEFV(genere_Float,INIT(point,niveau_hors_album));
/* Valeur du point courant initialise a priori sur la situation "hors-album". */
/*..............................................................................................................................*/
Test(I3OU(VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_X,symetriser_X,prolonger_X)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Y,symetriser_Y,prolonger_Y)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Z,symetriser_Z,prolonger_Z)
)
)
Bblock
PRINT_ATTENTION("une seule des options {periodiser,symetriser,prolonger} peut etre VRAI -la premiere 'VRAI' l'emporte-");
Eblock
ATes
Bblock
Eblock
ETes
PERIODISER_SYMETRISER_PROLONGER(X);
PERIODISER_SYMETRISER_PROLONGER(Y);
PERIODISER_SYMETRISER_PROLONGER(Z);
/* Eventuellement, periodisation et prolongement des axes... */
Test(TEST_DANS_L_ALBUM(coordonnee_X,coordonnee_Y,coordonnee_Z))
Bblock
EGAL(point,AloadF_point(albumA,coordonnee_X,coordonnee_Y,coordonnee_Z));
/* Acces au point recherche apres ses eventuelles transformations... */
Eblock
ATes
Bblock
Eblock
ETes
RETU(point);
Eblock
EFonctionF
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N A L B U M */
/* A V E C C O O R D O N N E E S F L O T T A N T E S : */
/* */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * ** * * * * * ** * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * ** * * * * * ** */
/* * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* */
/* ATTENTION : */
/* */
/* Je note le 20060601101800 lors du travail sur */
/* l'album 'v $xiirs/SPHE.93.2D' que tout cela fonctionne */
/* tres bien, sauf s'il y une discontinuite dans l'album. */
/* Cela se voit par exemple, si l'album represente un */
/* angle auquel cas une discontinuite possible sera un */
/* passage de 2.pi a 0 ce qui ne se voit pas en tant que tel */
/* si cet angle est ensuite l'argument d'une fonction periodique */
/* de periode 2.pi (tel 'COSX(...)' ou 'SINX(...)'...). */
/* */
/*************************************************************************************************************************************/
#define QREX(x) \
nPREX(x,pasX_effectif)
#define QREY(y) \
nPREY(y,pasY_effectif)
#define QREZ(Z) \
nPREZ(Z,pasZ_effectif)
/* Procedures introduites le 20180508190107 en choisissant des noms ressemblant a */
/* 'PRE[XYZ]' en prenant comme premiere lettre ("Q") la suivante alphabetique de "P"... */
/* Ces noms peuvent paraitre "etranges", mais ils sont destines a ne pas "perturber" les */
/* lignes les utilisant... */
#define TUCX(x) \
nSUCX(x,pasX_effectif)
#define TUCY(y) \
nSUCY(y,pasY_effectif)
#define TUCZ(Z) \
nSUCZ(Z,pasZ_effectif)
/* Procedures introduites le 20180508190107 en choisissant des noms ressemblant a */
/* 'SUC[XYZ]' en prenant comme premiere lettre ("T") la suivante alphabetique de "S"... */
/* Ces noms peuvent paraitre "etranges", mais ils sont destines a ne pas "perturber" les */
/* lignes les utilisant... */
#define bALOAD_POINT_COORDONNEES_01(mi,mi_initial,Ma,MA_initial) \
/* Les arguments {mi,Ma} furent introduits le 20100702143507... */ \
/* */ \
/* Je note le 20101129165756 que les coordonnees {Xf,Yf,Zf} doivent etre dans l'espace */ \
/* [0,1]x[0,1]x[0,1] et que si ce n'est pas le cas, 'CALCUL_POINT_ENTIER_COURANT(...)' */ \
/* renvoie le 'niveau_hors_album'. C'est ce qui fut la source du probleme rencontre lors */ \
/* du calcul des stereogrammes 'v $xiac/INTE.41.2$R16', 'v $xiac/LYAP.91.2$R16', */ \
/* 'v $xiac/LYAP.B1.2$R16' et 'v $xiac/LYAP.E5.2$R16'... */ \
/* */ \
/* Le 20120309180208, 'ALOAD_POINT_COORDONNEES_01' est devenu 'bALOAD_POINT_COORDONNEES_01' */ \
/* ("b" pour "Basic") pour preparer la mise en place d'un eventuel accelerateur utilisant */ \
/* du "hash-coding"... */ \
Bblock \
DEFV(Int,INIT(X,UNDEF)); \
DEFV(Int,INIT(Y,UNDEF)); \
DEFV(Int,INIT(Z,UNDEF)); \
/* Coordonnees entieres {X,Y,Z} "par defaut"... */ \
\
DEFV(Int,INIT(pasX_effectif,UNDEF)); \
DEFV(Int,INIT(pasY_effectif,UNDEF)); \
DEFV(Int,INIT(pasZ_effectif,UNDEF)); \
/* {pasX,pasY,pasZ} effectifs... */ \
\
DEFV(Float,INIT(fonction___au_point_uUvVwW,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=U,v=V,w=W). */ \
\
EGAL(mi,mi_initial); \
EGAL(Ma,MA_initial); \
/* Initialisation de la recherche des extrema... */ \
\
EGAL(X,_cDENORMALISE_OX(Xf_effective)); \
EGAL(Y,_cDENORMALISE_OY(Yf_effective)); \
EGAL(Z,_cDENORMALISE_OZ(Zf_effective)); \
/* Coordonnees entieres {X,Y,Z} "par defaut" calculee ici le 20080728211430... */ \
/* */ \
/* Je rappelle le 20101207164145 que ce passage en entier se fait via les procedures */ \
/* '_cDENORMALISE_AXES(...)', 'gINTE(...)' et 'FLIN(...)'. Alors le parametre "programmable" */ \
/* 'v $xiii/Images$STR DENORMALISE_AXES_____epsilon' joue un role peut-etre fondamental */ \
/* ('v $xiii/di_album$FON 20101207144433')... */ \
\
Test(IL_FAUT(NomFonctionCourant QD@@__ _____utiliser_pasX_et_pasY_et_pasZ)) \
Bblock \
EGAL(pasX_effectif,pasX); \
EGAL(pasY_effectif,pasY); \
EGAL(pasZ_effectif,pasZ); \
Eblock \
ATes \
Bblock \
EGAL(pasX_effectif,NomFonctionCourant QD@@__ _____pasX); \
EGAL(pasY_effectif,NomFonctionCourant QD@@__ _____pasY); \
EGAL(pasZ_effectif,NomFonctionCourant QD@@__ _____pasZ); \
Eblock \
ETes \
\
Test(IL_FAUT(NomFonctionCourant QD@@__ _____interpoler_bilineairement_ou_bicubiquement)) \
/* Test introduit le 20080930141651... */ \
Bblock \
DEFV(pointF_3D,barycentre); \
/* Pour calculer les coordonnees barycentriques du point flottant {Xf,Yf,Zf} par rapport */ \
/* a son voisin entier {X,Y,Z} "par defaut"... */ \
/* voisins entiers... */ \
\
DEFV(Float,INIT(fonction___au_point_u0v0w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=0,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u1v0w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=0,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u0v1w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=+1,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u1v1w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=+1,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u0v0w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=0,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_u1v0w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=0,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_u0v1w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=+1,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_u1v1w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=+1,w=+1). */ \
\
DEFV(Float,INIT(fonction___au_point_uUv0w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=U,v=0,w=0), */ \
DEFV(Float,INIT(fonction___au_point_uUv1w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=U,v=+1,w=0), */ \
DEFV(Float,INIT(fonction___au_point_uUv0w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=U,v=0,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_uUv1w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=U,v=+1,w=+1), */ \
\
DEFV(Float,INIT(fonction___au_point_uUvVw0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=U,v=V,w=0), */ \
DEFV(Float,INIT(fonction___au_point_uUvVw1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=U,v=V,w=+1). */ \
\
INITIALISATION_POINT_3D(barycentre \
,MUL2(NomFonctionCourant QD@@__ _____ponderation_du_barycentre_d_interpolation_X \
,DIVI(SOUS(F__cDENORMALISE_OX(Xf_effective),FLOT(X)) \
,FLOT(pasX_effectif) \
) \
) \
,MUL2(NomFonctionCourant QD@@__ _____ponderation_du_barycentre_d_interpolation_Y \
,DIVI(SOUS(F__cDENORMALISE_OY(Yf_effective),FLOT(Y)) \
,FLOT(pasY_effectif) \
) \
) \
,MUL2(NomFonctionCourant QD@@__ _____ponderation_du_barycentre_d_interpolation_Z \
,DIVI(SOUS(F__cDENORMALISE_OZ(Zf_effective),FLOT(Z)) \
,FLOT(pasZ_effectif) \
) \
) \
); \
/* Calcul des coordonnees barycentriques {u,v,w} alias */ \
/* {ASD1(barycentre,x),ASD1(barycentre,y),ASD1(barycentre,z)} du point {X,Y,Z} courant */ \
/* par rapport a la maille courante ; on n'oubliera pas que : */ \
/* */ \
/* [(1-u)*(1-v)*(1-w)] */ \
/* +[u*(1-v)*(1-w)] */ \
/* +[u*v*(1-w)] */ \
/* +[(1-u)*v*(1-w)] */ \
/* +[(1-u)*(1-v)*w] */ \
/* +[u*(1-v)*w] */ \
/* +[u*v*w] */ \
/* +[(1-u)*v*w] = 1. */ \
/* */ \
/* Les ponderations introduites le 20080930155146 permettent de jouer independemment sur */ \
/* les trois coordonnees : ainsi, par exemple, le triplet {1,1,0} bloquera l'interpolation */ \
/* selon 'Z'... */ \
\
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v0w0,NEUT(NEUT(X)),NEUT(NEUT(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v0w0,NEUT(TUCX(X)),NEUT(NEUT(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v1w0,NEUT(TUCX(X)),NEUT(TUCY(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v1w0,NEUT(NEUT(X)),NEUT(TUCY(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v0w1,NEUT(NEUT(X)),NEUT(NEUT(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v0w1,NEUT(TUCX(X)),NEUT(NEUT(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v1w1,NEUT(TUCX(X)),NEUT(TUCY(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v1w1,NEUT(NEUT(X)),NEUT(TUCY(Y)),NEUT(TUCZ(Z)),mi,Ma); \
\
Test(IL_FAUT(NomFonctionCourant QD@@__ _____utiliser_l_interpolation_bilineaire)) \
/* L'interpolation bilineaire a finalement ete introduite le 20050621112633... */ \
Bblock \
EGAL(fonction___au_point_uUv0w0 \
,INTERPOLATION_LINEAIRE(fonction___au_point_u0v0w0 \
,fonction___au_point_u1v0w0 \
,ASD1(barycentre,x) \
) \
); \
EGAL(fonction___au_point_uUv1w0 \
,INTERPOLATION_LINEAIRE(fonction___au_point_u0v1w0 \
,fonction___au_point_u1v1w0 \
,ASD1(barycentre,x) \
) \
); \
EGAL(fonction___au_point_uUv0w1 \
,INTERPOLATION_LINEAIRE(fonction___au_point_u0v0w1 \
,fonction___au_point_u1v0w1 \
,ASD1(barycentre,x) \
) \
); \
EGAL(fonction___au_point_uUv1w1 \
,INTERPOLATION_LINEAIRE(fonction___au_point_u0v1w1 \
,fonction___au_point_u1v1w1 \
,ASD1(barycentre,x) \
) \
); \
/* Calcul de la valeur de la fonction sur des aretes horizontales du cube de base... */ \
EGAL(fonction___au_point_uUvVw0 \
,INTERPOLATION_LINEAIRE(fonction___au_point_uUv0w0 \
,fonction___au_point_uUv1w0 \
,ASD1(barycentre,y) \
) \
); \
EGAL(fonction___au_point_uUvVw1 \
,INTERPOLATION_LINEAIRE(fonction___au_point_uUv0w1 \
,fonction___au_point_uUv1w1 \
,ASD1(barycentre,y) \
) \
); \
/* Calcul de la valeur de la fonction sur des segments verticaux du cube de base... */ \
EGAL(fonction___au_point_uUvVwW \
,INTERPOLATION_LINEAIRE(fonction___au_point_uUvVw0 \
,fonction___au_point_uUvVw1 \
,ASD1(barycentre,z) \
) \
); \
Eblock \
ATes \
Bblock \
DEFV(Float,INIT(fonction___au_point_u9v0w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=-1,v=0,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u2v0w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+2,v=0,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u9v1w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=-1,v=+1,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u2v1w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+2,v=+1,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u9v0w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=-1,v=0,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_u2v0w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+2,v=0,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_u9v1w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=-1,v=+1,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_u2v1w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+2,v=+1,w=+1). */ \
DEFV(Float,INIT(fonction___au_point_u0v9w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=-1,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u1v9w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=-1,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u0v2w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=+2,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u1v2w0,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=+2,w=0), */ \
DEFV(Float,INIT(fonction___au_point_u0v9w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=-1,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_u1v9w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=-1,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_u0v2w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=+2,w=+1), */ \
DEFV(Float,INIT(fonction___au_point_u1v2w1,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=+2,w=+1). */ \
DEFV(Float,INIT(fonction___au_point_u0v0w9,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=0,w=-1), */ \
DEFV(Float,INIT(fonction___au_point_u1v0w9,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=0,w=-1), */ \
DEFV(Float,INIT(fonction___au_point_u0v1w9,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=+1,w=-1), */ \
DEFV(Float,INIT(fonction___au_point_u1v1w9,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=+1,w=-1), */ \
DEFV(Float,INIT(fonction___au_point_u0v0w2,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=0,w=+2), */ \
DEFV(Float,INIT(fonction___au_point_u1v0w2,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=0,w=+2), */ \
DEFV(Float,INIT(fonction___au_point_u0v1w2,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=0,v=+1,w=+2), */ \
DEFV(Float,INIT(fonction___au_point_u1v1w2,FLOT__UNDEF)); \
/* Valeur de la fonction au point (u=+1,v=+1,w=+2). */ \
\
DEFV(Float,INIT(derivee_Du_au_point_u0v0w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'u' de la fonction au point (u=0,v=0,w=0), */ \
DEFV(Float,INIT(derivee_Du_au_point_u1v0w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'u' de la fonction au point (u=+1,v=0,w=0), */ \
DEFV(Float,INIT(derivee_Du_au_point_u0v1w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'u' de la fonction au point (u=0,v=+1,w=0), */ \
DEFV(Float,INIT(derivee_Du_au_point_u1v1w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'u' de la fonction au point (u=+1,v=+1,w=0), */ \
DEFV(Float,INIT(derivee_Du_au_point_u0v0w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'u' de la fonction au point (u=0,v=0,w=+1), */ \
DEFV(Float,INIT(derivee_Du_au_point_u1v0w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'u' de la fonction au point (u=+1,v=0,w=+1), */ \
DEFV(Float,INIT(derivee_Du_au_point_u0v1w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'u' de la fonction au point (u=0,v=+1,w=+1), */ \
DEFV(Float,INIT(derivee_Du_au_point_u1v1w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'u' de la fonction au point (u=+1,v=+1,w=+1). */ \
\
DEFV(Float,INIT(derivee_Dv_au_point_u0v0w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=0,v=0,w=0), */ \
DEFV(Float,INIT(derivee_Dv_au_point_u1v0w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=+1,v=0,w=0), */ \
DEFV(Float,INIT(derivee_Dv_au_point_u0v1w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=0,v=+1,w=0), */ \
DEFV(Float,INIT(derivee_Dv_au_point_u1v1w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=+1,v=+1,w=0), */ \
DEFV(Float,INIT(derivee_Dv_au_point_u0v0w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=0,v=0,w=+1), */ \
DEFV(Float,INIT(derivee_Dv_au_point_u1v0w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=+1,v=0,w=+1), */ \
DEFV(Float,INIT(derivee_Dv_au_point_u0v1w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=0,v=+1,w=+1), */ \
DEFV(Float,INIT(derivee_Dv_au_point_u1v1w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=+1,v=+1,w=+1). */ \
DEFV(Float,INIT(derivee_Dv_au_point_uUv0w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=U,v=0,w=0), */ \
DEFV(Float,INIT(derivee_Dv_au_point_uUv1w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=U,v=+1,w=0), */ \
DEFV(Float,INIT(derivee_Dv_au_point_uUv0w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=U,v=0,w=+1), */ \
DEFV(Float,INIT(derivee_Dv_au_point_uUv1w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'v' de la fonction au point (u=U,v=+1,w=+1). */ \
\
DEFV(Float,INIT(derivee_Dw_au_point_u0v0w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=0,v=0,w=0), */ \
DEFV(Float,INIT(derivee_Dw_au_point_u1v0w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=+1,v=0,w=0), */ \
DEFV(Float,INIT(derivee_Dw_au_point_u0v1w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=0,v=+1,w=0), */ \
DEFV(Float,INIT(derivee_Dw_au_point_u1v1w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=+1,v=+1,w=0), */ \
DEFV(Float,INIT(derivee_Dw_au_point_u0v0w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=0,v=0,w=+1), */ \
DEFV(Float,INIT(derivee_Dw_au_point_u1v0w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=+1,v=0,w=+1), */ \
DEFV(Float,INIT(derivee_Dw_au_point_u0v1w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=0,v=+1,w=+1), */ \
DEFV(Float,INIT(derivee_Dw_au_point_u1v1w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=+1,v=+1,w=+1). */ \
DEFV(Float,INIT(derivee_Dw_au_point_uUv0w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=U,v=0,w=0), */ \
DEFV(Float,INIT(derivee_Dw_au_point_uUv1w0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=U,v=+1,w=0), */ \
DEFV(Float,INIT(derivee_Dw_au_point_uUv0w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=U,v=0,w=+1), */ \
DEFV(Float,INIT(derivee_Dw_au_point_uUv1w1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=U,v=+1,w=+1). */ \
DEFV(Float,INIT(derivee_Dw_au_point_uUvVw0,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=U,v=V,w=0), */ \
DEFV(Float,INIT(derivee_Dw_au_point_uUvVw1,FLOT__UNDEF)); \
/* Valeur de la derivee partielle en 'w' de la fonction au point (u=U,v=V,w=+1). */ \
\
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v0w9,NEUT(NEUT(X)),NEUT(NEUT(Y)),NEUT(QREZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v0w9,NEUT(TUCX(X)),NEUT(NEUT(Y)),NEUT(QREZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v1w9,NEUT(TUCX(X)),NEUT(TUCY(Y)),NEUT(QREZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v1w9,NEUT(NEUT(X)),NEUT(TUCY(Y)),NEUT(QREZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u9v0w0,NEUT(QREX(X)),NEUT(NEUT(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v9w0,NEUT(NEUT(X)),NEUT(QREY(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v9w0,NEUT(TUCX(X)),NEUT(QREY(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u2v0w0,TUCX(TUCX(X)),NEUT(NEUT(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u2v1w0,TUCX(TUCX(X)),NEUT(TUCY(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v2w0,NEUT(TUCX(X)),TUCY(TUCY(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v2w0,NEUT(NEUT(X)),TUCY(TUCY(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u9v1w0,NEUT(QREX(X)),NEUT(TUCY(Y)),NEUT(NEUT(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u9v0w1,NEUT(QREX(X)),NEUT(NEUT(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v9w1,NEUT(NEUT(X)),NEUT(QREY(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v9w1,NEUT(TUCX(X)),NEUT(QREY(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u2v0w1,TUCX(TUCX(X)),NEUT(NEUT(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u2v1w1,TUCX(TUCX(X)),NEUT(TUCY(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v2w1,NEUT(TUCX(X)),TUCY(TUCY(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v2w1,NEUT(NEUT(X)),TUCY(TUCY(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u9v1w1,NEUT(QREX(X)),NEUT(TUCY(Y)),NEUT(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v0w2,NEUT(NEUT(X)),NEUT(NEUT(Y)),TUCZ(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v0w2,NEUT(TUCX(X)),NEUT(NEUT(Y)),TUCZ(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u1v1w2,NEUT(TUCX(X)),NEUT(TUCY(Y)),TUCZ(TUCZ(Z)),mi,Ma); \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_u0v1w2,NEUT(NEUT(X)),NEUT(TUCY(Y)),TUCZ(TUCZ(Z)),mi,Ma); \
/* Calcul des valeurs de la fonction aux points entiers voisins du point flottant... */ \
/* finies... */ \
\
DERIVATION_NUMERIQUE(derivee_Du_au_point_u0v0w0 \
,fonction___au_point_u9v0w0 \
,fonction___au_point_u1v0w0 \
,pasX_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Du_au_point_u1v0w0 \
,fonction___au_point_u0v0w0 \
,fonction___au_point_u2v0w0 \
,pasX_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Du_au_point_u1v1w0 \
,fonction___au_point_u0v1w0 \
,fonction___au_point_u2v1w0 \
,pasX_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Du_au_point_u0v1w0 \
,fonction___au_point_u9v1w0 \
,fonction___au_point_u1v1w0 \
,pasX_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Du_au_point_u0v0w1 \
,fonction___au_point_u9v0w1 \
,fonction___au_point_u1v0w1 \
,pasX_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Du_au_point_u1v0w1 \
,fonction___au_point_u0v0w1 \
,fonction___au_point_u2v0w1 \
,pasX_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Du_au_point_u1v1w1 \
,fonction___au_point_u0v1w1 \
,fonction___au_point_u2v1w1 \
,pasX_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Du_au_point_u0v1w1 \
,fonction___au_point_u9v1w1 \
,fonction___au_point_u1v1w1 \
,pasX_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dv_au_point_u0v0w0 \
,fonction___au_point_u0v9w0 \
,fonction___au_point_u0v1w0 \
,pasY_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dv_au_point_u1v0w0 \
,fonction___au_point_u1v9w0 \
,fonction___au_point_u1v1w0 \
,pasY_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dv_au_point_u1v1w0 \
,fonction___au_point_u1v0w0 \
,fonction___au_point_u1v2w0 \
,pasY_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dv_au_point_u0v1w0 \
,fonction___au_point_u0v0w0 \
,fonction___au_point_u0v2w0 \
,pasY_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dv_au_point_u0v0w1 \
,fonction___au_point_u0v9w1 \
,fonction___au_point_u0v1w1 \
,pasY_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dv_au_point_u1v0w1 \
,fonction___au_point_u1v9w1 \
,fonction___au_point_u1v1w1 \
,pasY_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dv_au_point_u1v1w1 \
,fonction___au_point_u1v0w1 \
,fonction___au_point_u1v2w1 \
,pasY_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dv_au_point_u0v1w1 \
,fonction___au_point_u0v0w1 \
,fonction___au_point_u0v2w1 \
,pasY_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dw_au_point_u0v0w0 \
,fonction___au_point_u0v0w9 \
,fonction___au_point_u0v0w1 \
,pasZ_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dw_au_point_u1v0w0 \
,fonction___au_point_u1v0w9 \
,fonction___au_point_u1v0w1 \
,pasZ_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dw_au_point_u1v1w0 \
,fonction___au_point_u1v1w9 \
,fonction___au_point_u1v1w1 \
,pasZ_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dw_au_point_u0v1w0 \
,fonction___au_point_u0v1w9 \
,fonction___au_point_u0v1w1 \
,pasZ_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dw_au_point_u0v0w1 \
,fonction___au_point_u0v0w0 \
,fonction___au_point_u0v0w2 \
,pasZ_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dw_au_point_u1v0w1 \
,fonction___au_point_u1v0w0 \
,fonction___au_point_u1v0w2 \
,pasZ_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dw_au_point_u1v1w1 \
,fonction___au_point_u1v1w0 \
,fonction___au_point_u1v1w2 \
,pasZ_effectif \
); \
DERIVATION_NUMERIQUE(derivee_Dw_au_point_u0v1w1 \
,fonction___au_point_u0v1w0 \
,fonction___au_point_u0v1w2 \
,pasZ_effectif \
); \
/* Calcul des derivees partielles en 'u', 'v' et 'w' aux points du cube de base par des */ \
/* differences finies a l'aide des differentes valeurs aux points du maillage... */ \
\
EGAL(derivee_Dv_au_point_uUv0w0 \
,INTERPOLATION_LINEAIRE(derivee_Dv_au_point_u0v0w0 \
,derivee_Dv_au_point_u1v0w0 \
,ASD1(barycentre,x) \
) \
); \
EGAL(derivee_Dv_au_point_uUv1w0 \
,INTERPOLATION_LINEAIRE(derivee_Dv_au_point_u0v1w0 \
,derivee_Dv_au_point_u1v1w0 \
,ASD1(barycentre,x) \
) \
); \
EGAL(derivee_Dv_au_point_uUv0w1 \
,INTERPOLATION_LINEAIRE(derivee_Dv_au_point_u0v0w1 \
,derivee_Dv_au_point_u1v0w1 \
,ASD1(barycentre,x) \
) \
); \
EGAL(derivee_Dv_au_point_uUv1w1 \
,INTERPOLATION_LINEAIRE(derivee_Dv_au_point_u0v1w1 \
,derivee_Dv_au_point_u1v1w1 \
,ASD1(barycentre,x) \
) \
); \
EGAL(derivee_Dw_au_point_uUv0w0 \
,INTERPOLATION_LINEAIRE(derivee_Dw_au_point_u0v0w0 \
,derivee_Dw_au_point_u1v0w0 \
,ASD1(barycentre,x) \
) \
); \
EGAL(derivee_Dw_au_point_uUv1w0 \
,INTERPOLATION_LINEAIRE(derivee_Dw_au_point_u0v1w0 \
,derivee_Dw_au_point_u1v1w0 \
,ASD1(barycentre,x) \
) \
); \
EGAL(derivee_Dw_au_point_uUv0w1 \
,INTERPOLATION_LINEAIRE(derivee_Dw_au_point_u0v0w1 \
,derivee_Dw_au_point_u1v0w1 \
,ASD1(barycentre,x) \
) \
); \
EGAL(derivee_Dw_au_point_uUv1w1 \
,INTERPOLATION_LINEAIRE(derivee_Dw_au_point_u0v1w1 \
,derivee_Dw_au_point_u1v1w1 \
,ASD1(barycentre,x) \
) \
); \
/* Calcul des derivees partielles en 'u', 'v' et 'w' sur des aretes horizontales du cube de */ \
/* base par des interpolations lineaires a partir des sommets voisins (on notera que l'on */ \
/* ne peut utiliser d'interpolation cubique, puisqu'on ne connait pas encore les derivees). */ \
EGAL(derivee_Dw_au_point_uUvVw0 \
,INTERPOLATION_LINEAIRE(derivee_Dw_au_point_uUv0w0 \
,derivee_Dw_au_point_uUv1w0 \
,ASD1(barycentre,y) \
) \
); \
EGAL(derivee_Dw_au_point_uUvVw1 \
,INTERPOLATION_LINEAIRE(derivee_Dw_au_point_uUv0w1 \
,derivee_Dw_au_point_uUv1w1 \
,ASD1(barycentre,y) \
) \
); \
/* Calcul des derivees partielles en 'u', 'v' et 'w' sur des segments verticaux du cube de */ \
/* base par des interpolations lineaires a partir des sommets voisins (on notera que l'on */ \
/* ne peut utiliser d'interpolation cubique, puisqu'on ne connait pas encore les derivees). */ \
\
EGAL(fonction___au_point_uUv0w0 \
,INTERPOLATION_CUBIQUE(fonction___au_point_u0v0w0 \
,derivee_Du_au_point_u0v0w0 \
,fonction___au_point_u1v0w0 \
,derivee_Du_au_point_u1v0w0 \
,ASD1(barycentre,x) \
) \
); \
EGAL(fonction___au_point_uUv1w0 \
,INTERPOLATION_CUBIQUE(fonction___au_point_u0v1w0 \
,derivee_Du_au_point_u0v1w0 \
,fonction___au_point_u1v1w0 \
,derivee_Du_au_point_u1v1w0 \
,ASD1(barycentre,x) \
) \
); \
EGAL(fonction___au_point_uUv0w1 \
,INTERPOLATION_CUBIQUE(fonction___au_point_u0v0w1 \
,derivee_Du_au_point_u0v0w1 \
,fonction___au_point_u1v0w1 \
,derivee_Du_au_point_u1v0w1 \
,ASD1(barycentre,x) \
) \
); \
EGAL(fonction___au_point_uUv1w1 \
,INTERPOLATION_CUBIQUE(fonction___au_point_u0v1w1 \
,derivee_Du_au_point_u0v1w1 \
,fonction___au_point_u1v1w1 \
,derivee_Du_au_point_u1v1w1 \
,ASD1(barycentre,x) \
) \
); \
/* Calcul de la valeur de la fonction sur des aretes horizontales du cube de base... */ \
\
EGAL(fonction___au_point_uUvVw0 \
,INTERPOLATION_CUBIQUE(fonction___au_point_uUv0w0 \
,derivee_Dv_au_point_uUv0w0 \
,fonction___au_point_uUv1w0 \
,derivee_Dv_au_point_uUv1w0 \
,ASD1(barycentre,y) \
) \
); \
EGAL(fonction___au_point_uUvVw1 \
,INTERPOLATION_CUBIQUE(fonction___au_point_uUv0w1 \
,derivee_Dv_au_point_uUv0w1 \
,fonction___au_point_uUv1w1 \
,derivee_Dv_au_point_uUv1w1 \
,ASD1(barycentre,y) \
) \
); \
/* Calcul de la valeur de la fonction sur des segments verticaux du cube de base... */ \
\
EGAL(fonction___au_point_uUvVwW \
,INTERPOLATION_CUBIQUE(fonction___au_point_uUvVw0 \
,derivee_Dw_au_point_uUvVw0 \
,fonction___au_point_uUvVw1 \
,derivee_Dw_au_point_uUvVw1 \
,ASD1(barycentre,z) \
) \
); \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
CALCUL_POINT_ENTIER_COURANT(fonction___au_point_uUvVwW,NEUT(NEUT(X)),NEUT(NEUT(Y)),NEUT(NEUT(Z)),mi,Ma); \
/* La possibilite de ne pas interpoler a ete introduite le 20080930141651... */ \
Eblock \
ETes \
\
EGAL(niveau_du_point_de_coordonnees_01,fonction___au_point_uUvVwW); \
/* Et enfin, niveau cherche... */ \
Eblock \
/* Procedure introduite le 20091202184549 dans le but de generer plusieurs fonctions */ \
/* realisant cette operation, mais avec des types d'albums differents... */
#define GENERATION_DE_L_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01 \
GENERATION_DE_L_ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS \
(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01 \
/* On notera que l'on utilise le nom 'S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01' pour */ \
/* les donnees de l'accelerateur et non pas 'ACCELERATEUR__ALOAD_POINT_COORDONNEES_01' */ \
/* car, en effet, ce dernier nom est aussi celui de la procedure d'acceleration et donc */ \
/* si ce nom etait utilise, il y aurait substitution par la definition de l'accelerateur */ \
/* a suivre... */ \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,DEFV(Local,DEFV(Float,DdTb1(POINTERf \
,S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_1 \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,ADRESSE_NON_ENCORE_DEFINIE \
) \
) \
); \
DEFV(Local,DEFV(Float,DdTb1(POINTERf \
,S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_2 \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,ADRESSE_NON_ENCORE_DEFINIE \
) \
) \
); \
DEFV(Local,DEFV(Float,DdTb1(POINTERf \
,S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_3 \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,ADRESSE_NON_ENCORE_DEFINIE \
) \
) \
); \
/* Donne les trois arguments de l'entree courante (si elle est valide...). */ \
) \
/* Donnees de l'accelerateur a trois arguments... */
#define ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
TRON(DIVI(dimXYZ,GRO2(CENT)),CENT,CENT_MILLE)
#define ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE \
ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS__PREMIERE_ENTREE
#define ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__DERNIERE_ENTREE \
LSTX(ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
)
#define ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PONDERATEUR \
ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS__PONDERATEUR
/* Parametres fondamentaux. */ \
/* */ \
/* Le 20120314091930, je fais des chronometrages concernant 'HORNER_1_02(...)' pour etudier */ \
/* l'influence de la valeur de 'ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PONDERATEUR' (dit */ \
/* "PONDERATEUR". Ces chronometrages sont fait avec 'time' sur une seule occurence de */ \
/* '$xci/accumule.42$X' dans le calcul de l'image 'v $xiirk/JWIG.32.2'. On notera (et c'est */ \
/* l'objet de ce test) qu'une valeur unite pour 'PONDERATEUR' remplace donc le calcul d'un */ \
/* polynome par une simple somme : */ \
/* */ \
/* AccelerateurALoadPoint=FAUX 34.330u 0.110s 0:34.68 99.3% */ \
/* */ \
/* AccelerateurALoadPoint=VRAI PONDERATEUR=7 19.830u 0.070s 0:20.11 98.9% */ \
/* AccelerateurALoadPoint=VRAI PONDERATEUR=1 19.070u 0.050s 0:19.52 97.9% */ \
/* */ \
/* Il semble donc que de remplacer le polynome par la simple somme soit rentable : c'est */ \
/* donc ce qui est fait a cette date... */
#define ACCELERATEUR__ALOAD_POINT_COORDONNEES_01(valeur_fonction,calcul_fonction,Argument_1,Argument_2,Argument_3,fonction,objet) \
/* Procedure introduite le 20120310094505... */ \
/* */ \
/* L'argument 'fonction' a ete introduit le 20120316160116. */ \
Bblock \
ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS \
(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01 \
,S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____utiliser_l_accelerateur \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__DERNIERE_ENTREE \
,BLOC( \
Bblock \
MdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_1 \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
MdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_2 \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
MdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_3 \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
/* Allocation de la memoire des listes d'Arguments. */ \
Eblock \
) \
,BLOC( \
Bblock \
EGAL(IdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_1 \
,INDX(index_d_initialisation,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE) \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,FLOT__UNDEF \
); \
EGAL(IdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_2 \
,INDX(index_d_initialisation,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE) \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,FLOT__UNDEF \
); \
EGAL(IdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_3 \
,INDX(index_d_initialisation,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE) \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,FLOT__UNDEF \
); \
/* Initialisation des listes d'Arguments. */ \
Eblock \
) \
,HORNER_1_02(ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PONDERATEUR \
,Argument_1 \
,Argument_2 \
,Argument_3 \
) \
/* Calcul d'une fonction des trois arguments : */ \
/* */ \
/* 2 1 0 */ \
/* Argument1.P + Argument2.P + Argument3.P */ \
/* */ \
/* ou 'P' represente le 'PONDERATEUR' (arbitraire...). */ \
/* */ \
/* Cette methode repose sur le programme 'v $xtc/HashCode.01$c'... */ \
,I3ET(IFEQ(IdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_1 \
,index_d_acceleration \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_1 \
) \
,IFEQ(IdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_2 \
,index_d_acceleration \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_2 \
) \
,IFEQ(IdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_3 \
,index_d_acceleration \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_3 \
) \
) \
/* Est-ce la liste {Argument_1,Argument_2,Argument_3} memorisee ? */ \
,BLOC( \
Bblock \
EGAL(IdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_1 \
,index_d_acceleration \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_1 \
); \
EGAL(IdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_2 \
,index_d_acceleration \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_2 \
); \
EGAL(IdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_3 \
,index_d_acceleration \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
) \
,Argument_3 \
); \
Eblock \
) \
,BLOC( \
Bblock \
FdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_3 \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
FdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_2 \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
FdTb1(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____Argument_1 \
,ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES \
,Float,ADRESSE_NON_ENCORE_DEFINIE \
); \
/* Desallocation de la memoire des listes d'Arguments (introduite le 20120311092945). */ \
/* */ \
/* On notera qu'a priori on n'utilisera jamais cette sequence puisqu'en effet, on ne sait */ \
/* jamais que c'est la derniere fois. C'est introduit malgre tout par "symetrie"... */ \
Eblock \
) \
,valeur_fonction \
,BLOC(calcul_fonction) \
,fonction \
,objet \
) \
Eblock
DEFV(Common,DEFV(Logical,PINT(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____utiliser_l_accelerateur,VRAI)));
/* Indique si l'accelerateur doit etre utilise ou pas (mis ici le 20120310142305 depuis */
/* 'v $xig/fonct$vv$DEF 20120310142011'... */
DEFV(Common,DEFV(Logical,PINT(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____fermer_l_accelerateur,FAUX)));
/* Indique si l'accelerateur doit etre ferme (introduit le 20120311092945)... */
/* */
/* Ainsi, pour fermer l'accelerateur, il suffirait de faire : */
/* */
/* EGAL(S_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01_____fermer_l_accelerateur,VRAI); */
/* */
/* puis d'appeler (une derniere fois...) : */
/* */
/* FAload_point_coordonnees_01(...) */
/* */
/* ou encore : */
/* */
/* FFAload_point_coordonnees_01(...) */
/* */
/* (qui utilisent 'ALOAD_POINT_COORDONNEES_01(...)') avec des parametres dont la valeur */
/* a peu d'importance (a condition evidemment qu'ils soient licites...). Mais cela ne serait */
/* pas tres "elegant" car, en effet, cela obligerait a mettre la sequence qui precede dans */
/* dans le code de tous les appelants des fonctions 'FAload_point_coordonnees_01(...)' */
/* et 'FFAload_point_coordonnees_01(...)', ce qui rendrait "visible" de l'exterieur */
/* l'accelerateur, alors que l'idee est qu'il soit justement "invisible". Or enfin et de */
/* nouveau, on ne peut rendre cette "fermeture" automatique car, en effet, il n'y a aucune */
/* facon, en toute generalite, de connaitre le dernier appel a ces fonctions... */
GENERATION_DE_L_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01;
/* Generation des donnees utiles a l'accelerateur (mise en place le 20120310071434). */
#define ALOAD_POINT_COORDONNEES_01(mi,mi_initial,Ma,MA_initial) \
Bblock \
Test(IL_FAUT(NomFonctionCourant QD@@__ _____appliquer_une_matrice_de_transformation)) \
Bblock \
EGAL(Xf_effective,TRANSFORMATION_GEOMETRIQUE_3D_Xf(Xf,Yf,Zf)); \
EGAL(Yf_effective,TRANSFORMATION_GEOMETRIQUE_3D_Yf(Xf,Yf,Zf)); \
EGAL(Zf_effective,TRANSFORMATION_GEOMETRIQUE_3D_Zf(Xf,Yf,Zf)); \
/* La possibilite de transformer {Xf,Yf,Zf} fut introduite le 20080802120636... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
ACCELERATEUR__ALOAD_POINT_COORDONNEES_01(niveau_du_point_de_coordonnees_01 \
,BLOC( \
bALOAD_POINT_COORDONNEES_01(mi,mi_initial,Ma,MA_initial); \
) \
,Xf_effective \
,Yf_effective \
,Zf_effective \
,NomDeLaFonctionCourante QD@@__ \
,albumA \
); \
/* Le 20120310071434, l'accelerateur fut mis en place... */ \
/* */ \
/* On notera que 'v $xig/fonct$vv$DEF index_d_acceleration' a une bonne allure aleatoire, */ \
/* ce qui est bon pour du "hash-coding". */ \
/* */ \
/* Le 20120310095428, le chronometrage de '$xci/accumule.42$X', sur '$LACT19', pour le */ \
/* calcul de l'image 'v $xiirk/JWIG.32.2' donne les durees d'accumulation suivantes : */ \
/* */ \
/* "AccelerateurFonctions=FAUX" : 36 secondes */ \
/* "AccelerateurFonctions=VRAI" : 21 secondes */ \
/* */ \
/* ce qui fait une amelioration de l'ordre de 40%, ce qui est pas mal ! On notera que le */ \
/* chronometrage a ete fait avec : */ \
/* */ \
/* d */ \
/* execRVB $xci/accumule.42$X ... */ \
/* d */ \
/* */ \
/* ce qui signifie que l'on inclue ainsi l'"overhead" de 'execRVB' soit environ deux */ \
/* secondes (sur '$LACT19'). */ \
/* */ \
/* Le 20120929165544, {Xf_effective,Yf_effective,Zf_effective} a remplace {Xf,Yf,Zf} */ \
/* suite au probleme 'v $xig/fonct$vv$DEF 20120929145125'... */ \
Eblock \
/* Procedure introduite le 20120309180208 pour preparer la mise en place d'un eventuel */ \
/* accelerateur utilisant du "hash-coding"... */
#define TRANSFORMATION_GEOMETRIQUE_3D_Xf(Xf,Yf,Zf) \
gTRANSFORMATION_GEOMETRIQUE_3D_Fxyz(NomFonctionCourant QD@@__ _____matrice_de_transformation \
,SOUS(Xf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Xf) \
,SOUS(Yf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Yf) \
,SOUS(Zf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Zf) \
,cx \
,NomFonctionCourant QD@@__ _____Post___Translation_Xf \
)
#define TRANSFORMATION_GEOMETRIQUE_3D_Yf(Xf,Yf,Zf) \
gTRANSFORMATION_GEOMETRIQUE_3D_Fxyz(NomFonctionCourant QD@@__ _____matrice_de_transformation \
,SOUS(Xf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Xf) \
,SOUS(Yf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Yf) \
,SOUS(Zf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Zf) \
,cy \
,NomFonctionCourant QD@@__ _____Post___Translation_Yf \
)
#define TRANSFORMATION_GEOMETRIQUE_3D_Zf(Xf,Yf,Zf) \
gTRANSFORMATION_GEOMETRIQUE_3D_Fxyz(NomFonctionCourant QD@@__ _____matrice_de_transformation \
,SOUS(Xf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Xf) \
,SOUS(Yf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Yf) \
,SOUS(Zf,NomFonctionCourant QD@@__ _____PreAntiTranslation_Zf) \
,cz \
,NomFonctionCourant QD@@__ _____Post___Translation_Zf \
)
#define DERIVATION_NUMERIQUE(derivee,fonction_origine,fonction_extremite,pas_du_maillage) \
Bblock \
EGAL(derivee \
,DERIVATION_PARTIELLE(fonction_origine \
,fonction_extremite \
,FLOT(DOUB(pas_du_maillage)) \
) \
); \
Eblock \
/* Calcul de la derivee numerique d'une fonction... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N A L B U M " S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S : */
/* */
/*************************************************************************************************************************************/
BFonctionP
#define CALCUL_POINT_ENTIER_COURANT(fonction,x,y,z,minimum,maximum) \
/* Les arguments {minimum,maximum} furent introduits le 20100702143507... */ \
Bblock \
EGAL(fonction \
,FLOT(FAload_point(albumA \
,x,y,z \
,periodiser_X,periodiser_Y,periodiser_Z \
,symetriser_X,symetriser_Y,symetriser_Z \
,prolonger_X,prolonger_Y,prolonger_Z \
,niveau_hors_album \
) \
) \
); \
/* Calcul de la fonction. */ \
\
EGAL(minimum,MIN2(minimum,fonction)); \
EGAL(maximum,MAX2(maximum,fonction)); \
/* Rercherche des extrema de la fonction (introduite le 20100702143507)... */ \
Eblock \
/* Acces au point courant de coordonnees entieres {x,y,z}. */
DEFV(Common,DEFV(Logical,SINT(FAload_point_coordonnees_01_____appliquer_une_matrice_de_transformation,FAUX)));
DEFV(Common,DEFV(matrixF_3D,SINS(FAload_point_coordonnees_01_____matrice_de_transformation
,IstructH103(IstructL03(FU___,FZERO,FZERO)
,IstructL03(FZERO,FU___,FZERO)
,IstructL03(FZERO,FZERO,FU___)
)
)
)
);
DEFV(Common,DEFV(Float,SINT(FAload_point_coordonnees_01_____PreAntiTranslation_Xf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FAload_point_coordonnees_01_____Post___Translation_Xf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FAload_point_coordonnees_01_____PreAntiTranslation_Yf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FAload_point_coordonnees_01_____Post___Translation_Yf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FAload_point_coordonnees_01_____PreAntiTranslation_Zf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FAload_point_coordonnees_01_____Post___Translation_Zf,NEUT(FDU))));
/* Definition d'une eventuelle matrice de transformation neutre par defaut... */
/* neutre par defaut... */
/* */
/* On notera la notation "PreAnti" qui signifie que les translations de ce type sont en */
/* fait appliquees via un 'SOUS(...)', alors que les translations de type "Post" passent */
/* par un 'ADD2(...)' ('v $xiii/vecteurs$DEF gTRANSFORMATION_GEOMETRIQUE_3D_Fxyz') via un */
/* 'LIN3(...)'. */
DEFV(Common,DEFV(Logical,SINT(FAload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement,VRAI)));
/* Pour choisir entre interpoler ('VRAI' et alors suivant l'indicateur de choix suivant */
/* 'FAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire') ou pas ('FAUX'). */
DEFV(Common,DEFV(Float,SINT(FAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_X
,NE_PAS_BLOQUER_L_INTERPOLATION_X
)
)
);
DEFV(Common,DEFV(Float,SINT(FAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Y
,NE_PAS_BLOQUER_L_INTERPOLATION_Y
)
)
);
DEFV(Common,DEFV(Float,SINT(FAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Z
,NE_PAS_BLOQUER_L_INTERPOLATION_Z
)
)
);
/* Parametres d'interpolation des coordonnees barycentriques. */
/* */
/* Ils permettent d'etre plus selectifs que le paramatre global definit ci-dessus */
/* ('FAload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement'). Par */
/* exemple en utilisant le triplet {1,1,0}, il n'y aura pas interpolation selon la */
/* coordonnee 'Z' (utile pour 'v $xci/deformi.11$K interpolerX='). */
DEFV(Common,DEFV(Logical,SINT(FAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire,FAUX)));
/* Afin de choisir entre l'interpolation bicubique et l'interpolation bilineaire... */
DEFV(Common,DEFV(Logical,SINT(FAload_point_coordonnees_01_____utiliser_pasX_et_pasY_et_pasZ,VRAI)));
DEFV(Common,DEFV(Int,SINT(FAload_point_coordonnees_01_____pasX,PasX)));
DEFV(Common,DEFV(Int,SINT(FAload_point_coordonnees_01_____pasY,PasY)));
DEFV(Common,DEFV(Int,SINT(FAload_point_coordonnees_01_____pasZ,PasZ)));
/* Si 'IL_NE_FAUT_PAS(FAload_point_coordonnees_01_____utiliser_pasX_et_pasY_et_pasZ)', */
/* donne {pasX,pasY,pasZ} a utiliser ci-apres... */
DEFV(Common,DEFV(genere_p,SINT(FAload_point_coordonnees_01_____niveau_minimal,NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_p,SINT(FAload_point_coordonnees_01_____niveau_maximal,NIVEAU_UNDEF)));
/* Afin de pouvoir renvoyer les extrema (introduits le 20100702143507). */
DEFV(Common,DEFV(FonctionP,FAload_point_coordonnees_01(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
)
)
)
/* Fonction introduite le 20091203092546... */
DEFV(Argument,DEFV(album,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees {Xf,Yf,Zf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
DEFV(Argument,DEFV(genere_p,niveau_hors_album));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-album". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Float,INIT(Xf_effective,Xf));
DEFV(Float,INIT(Yf_effective,Yf));
DEFV(Float,INIT(Zf_effective,Zf));
/* Coordonnees effectives mises ici depuis 'bALOAD_POINT_COORDONNEES_01' le 20120929165544 */
/* suite au probleme 'v $xig/fonct$vv$DEF 20120929145125' qui a necessite cette "sortie"... */
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01,FLOT__NIVEAU_UNDEF));
/* Niveau du point {Xf,Yf,Zf}. */
/*..............................................................................................................................*/
ALOAD_POINT_COORDONNEES_01(FAload_point_coordonnees_01_____niveau_minimal,BLANC
,FAload_point_coordonnees_01_____niveau_maximal,NOIR
);
RETU(GENP(niveau_du_point_de_coordonnees_01));
Eblock
#undef CALCUL_POINT_ENTIER_COURANT
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N A L B U M " N O N S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S : */
/* */
/*************************************************************************************************************************************/
BFonctionF
#define CALCUL_POINT_ENTIER_COURANT(fonction,x,y,z,minimum,maximum) \
/* Les arguments {minimum,maximum} furent introduits le 20100702143507... */ \
Bblock \
EGAL(fonction \
,FFAload_point(albumA \
,x,y,z \
,periodiser_X,periodiser_Y,periodiser_Z \
,symetriser_X,symetriser_Y,symetriser_Z \
,prolonger_X,prolonger_Y,prolonger_Z \
,niveau_hors_album \
) \
); \
/* Calcul de la fonction. */ \
\
EGAL(minimum,MIN2(minimum,fonction)); \
EGAL(maximum,MAX2(maximum,fonction)); \
/* Rercherche des extrema de la fonction (introduite le 20100702143507)... */ \
Eblock \
/* Acces au point courant de coordonnees entieres {x,y,z}. */
DEFV(Common,DEFV(Logical,SINT(FFAload_point_coordonnees_01_____appliquer_une_matrice_de_transformation,FAUX)));
DEFV(Common,DEFV(matrixF_3D,SINS(FFAload_point_coordonnees_01_____matrice_de_transformation
,IstructH103(IstructL03(FU___,FZERO,FZERO)
,IstructL03(FZERO,FU___,FZERO)
,IstructL03(FZERO,FZERO,FU___)
)
)
)
);
DEFV(Common,DEFV(Float,SINT(FFAload_point_coordonnees_01_____PreAntiTranslation_Xf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFAload_point_coordonnees_01_____Post___Translation_Xf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFAload_point_coordonnees_01_____PreAntiTranslation_Yf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFAload_point_coordonnees_01_____Post___Translation_Yf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFAload_point_coordonnees_01_____PreAntiTranslation_Zf,NEUT(FDU))));
DEFV(Common,DEFV(Float,SINT(FFAload_point_coordonnees_01_____Post___Translation_Zf,NEUT(FDU))));
/* Definition d'une eventuelle matrice de transformation (introduite le 20080802115907), */
/* neutre par defaut... */
/* */
/* Les "Pre" et "Post" translations ont ete introduites le 20080803093325. On notera la */
/* notation "PreAnti" qui signifie que les translations de ce type sont en fait appliquees */
/* via un 'SOUS(...)', alors que les translations de type "Post" passent par un 'ADD2(...)' */
/* via un 'LIN3(...)' ('v $xiii/vecteurs$DEF gTRANSFORMATION_GEOMETRIQUE_3D_Fxyz'). */
DEFV(Common,DEFV(Logical,SINT(FFAload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement,VRAI)));
/* Pour choisir entre interpoler ('VRAI' et alors suivant l'indicateur de choix suivant */
/* 'FFAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire') ou pas ('FAUX'). */
/* Cet indicateur a ete introduit le 20080930141651... */
DEFV(Common,DEFV(Float,SINT(FFAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_X
,NE_PAS_BLOQUER_L_INTERPOLATION_X
)
)
);
DEFV(Common,DEFV(Float,SINT(FFAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Y
,NE_PAS_BLOQUER_L_INTERPOLATION_Y
)
)
);
DEFV(Common,DEFV(Float,SINT(FFAload_point_coordonnees_01_____ponderation_du_barycentre_d_interpolation_Z
,NE_PAS_BLOQUER_L_INTERPOLATION_Z
)
)
);
/* Parametres d'interpolation des coordonnees barycentriques introduits le 20080930155146. */
/* Ils permettent d'etre plus selectifs que le paramatre global definit ci-dessus */
/* ('FFAload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement'). Par */
/* exemple en utilisant le triplet {1,1,0}, il n'y aura pas interpolation selon la */
/* coordonnee 'Z' (utile pour 'v $xci/deformi.11$K interpolerX='). */
DEFV(Common,DEFV(Logical,SINT(FFAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire,FAUX)));
/* En fait seule existe l'interpolation bicubique. Ceci est mis pour des raisons de */
/* symetrie avec 'FFload_point_coordonnees_01(...)'. Finalement, l'interpolation bilineaire */
/* fut introduite le 20050621112633... */
DEFV(Common,DEFV(Logical,SINT(FFAload_point_coordonnees_01_____utiliser_pasX_et_pasY_et_pasZ,VRAI)));
DEFV(Common,DEFV(Int,SINT(FFAload_point_coordonnees_01_____pasX,PasX)));
DEFV(Common,DEFV(Int,SINT(FFAload_point_coordonnees_01_____pasY,PasY)));
DEFV(Common,DEFV(Int,SINT(FFAload_point_coordonnees_01_____pasZ,PasZ)));
/* Si 'IL_NE_FAUT_PAS(FFAload_point_coordonnees_01_____utiliser_pasX_et_pasY_et_pasZ)', */
/* donne {pasX,pasY,pasZ} a utiliser ci-apres... */
DEFV(Common,DEFV(genere_Float,SINT(FFAload_point_coordonnees_01_____niveau_minimal,FLOT__NIVEAU_UNDEF)));
DEFV(Common,DEFV(genere_Float,SINT(FFAload_point_coordonnees_01_____niveau_maximal,FLOT__NIVEAU_UNDEF)));
/* Afin de pouvoir renvoyer les extrema (introduits le 20100702143507). */
DEFV(Common,DEFV(FonctionF,FFAload_point_coordonnees_01(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
)
)
)
/* Fonction introduite le 20050605170621... */
DEFV(Argument,DEFV(albumF,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees {Xf,Yf,Zf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
/* Ceci a ete introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_album));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-album". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Float,INIT(Xf_effective,Xf));
DEFV(Float,INIT(Yf_effective,Yf));
DEFV(Float,INIT(Zf_effective,Zf));
/* Coordonnees effectives mises ici depuis 'bALOAD_POINT_COORDONNEES_01' le 20120929165544 */
/* suite au probleme 'v $xig/fonct$vv$DEF 20120929145125' qui a necessite cette "sortie"... */
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01,FLOT__NIVEAU_UNDEF));
/* Niveau du point {Xf,Yf,Zf}. */
/*..............................................................................................................................*/
ALOAD_POINT_COORDONNEES_01(FFAload_point_coordonnees_01_____niveau_minimal,F_INFINI
,FFAload_point_coordonnees_01_____niveau_maximal,F_MOINS_L_INFINI
);
RETU(niveau_du_point_de_coordonnees_01);
Eblock
#undef CALCUL_POINT_ENTIER_COURANT
EFonctionF
#undef DERIVATION_NUMERIQUE
#undef TRANSFORMATION_GEOMETRIQUE_3D_Zf
#undef TRANSFORMATION_GEOMETRIQUE_3D_Yf
#undef TRANSFORMATION_GEOMETRIQUE_3D_Xf
#undef ALOAD_POINT_COORDONNEES_01
#undef ACCELERATEUR__ALOAD_POINT_COORDONNEES_01
#undef ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PONDERATEUR
#undef ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__DERNIERE_ENTREE
#undef ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__PREMIERE_ENTREE
#undef ACCELERATEUR__ALOAD_POINT_COORDONNEES_01__NOMBRE_D_ENTREES
#undef GENERATION_DE_L_ACCELERATEUR__ALOAD_POINT_COORDONNEES_01
/* Introduits le 20120311093932... */
#undef bALOAD_POINT_COORDONNEES_01
#undef TUCZ
#undef TUCY
#undef TUCX
#undef QREZ
#undef QREY
#undef QREX
#undef NomFonctionCourant
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N A L B U M " N O N S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S */
/* E T A V E C C O N T R O L E D E S I N T E R P O L A T I O N S : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Common,DEFV(FonctionF,gFFAload_point_coordonnees_01(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
,interpoler_bilineairement_ou_bicubiquement
,utiliser_l_interpolation_bilineaire
)
)
)
/* Fonction introduite le 20150528101138... */
DEFV(Argument,DEFV(albumF,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees {Xf,Yf,Zf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
/* Ceci a ete introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_album));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-album". */
DEFV(Argument,DEFV(Logical,interpoler_bilineairement_ou_bicubiquement));
DEFV(Argument,DEFV(Logical,utiliser_l_interpolation_bilineaire));
/* Controle des interpolations... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01,FLOT__NIVEAU_UNDEF));
/* Niveau du point {Xf,Yf,Zf}. */
/*..............................................................................................................................*/
BSaveModifyVariable(Logical
,FFAload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement
,interpoler_bilineairement_ou_bicubiquement
);
BSaveModifyVariable(Logical
,FFAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire
,utiliser_l_interpolation_bilineaire
);
EGAL(niveau_du_point_de_coordonnees_01
,FFAload_point_coordonnees_01(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
)
);
ESaveModifyVariable(Logical
,FFAload_point_coordonnees_01_____utiliser_l_interpolation_bilineaire
);
ESaveModifyVariable(Logical
,FFAload_point_coordonnees_01_____interpoler_bilineairement_ou_bicubiquement
);
RETU(niveau_du_point_de_coordonnees_01);
Eblock
EFonctionF
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N A L B U M " N O N S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S */
/* E T A V E C S U P E R - C O N T R O L E D E S I N T E R P O L A T I O N S : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Common,DEFV(FonctionF,sgFFAload_point_coordonnees_01(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
,interpoler_bilineairement_ou_bicubiquement
,utiliser_l_interpolation_bilineaire
,eviter_les_fortes_discontinuites
,epsilon_detection_des_fortes_discontinuites
)
)
)
/* Fonction introduite le 20150528101138... */
DEFV(Argument,DEFV(albumF,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees {Xf,Yf,Zf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
/* Ceci a ete introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_album));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-album". */
DEFV(Argument,DEFV(Logical,interpoler_bilineairement_ou_bicubiquement));
DEFV(Argument,DEFV(Logical,utiliser_l_interpolation_bilineaire));
/* Controle des interpolations... */
DEFV(Argument,DEFV(Logical,eviter_les_fortes_discontinuites));
DEFV(Argument,DEFV(Float,epsilon_detection_des_fortes_discontinuites));
/* Super-controle des interpolations... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01,FLOT__NIVEAU_UNDEF));
/* Niveau du point {Xf,Yf,Zf}. */
/*..............................................................................................................................*/
BSaveModifyVariable(Logical
,bILOAD_POINT_COORDONNEES_01_____eviter_les_fortes_discontinuites
,eviter_les_fortes_discontinuites
);
BSaveModifyVariable(Float
,bILOAD_POINT_COORDONNEES_01_____epsilon_detection_des_fortes_discontinuites
,epsilon_detection_des_fortes_discontinuites
);
EGAL(niveau_du_point_de_coordonnees_01
,gFFAload_point_coordonnees_01(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
,interpoler_bilineairement_ou_bicubiquement
,utiliser_l_interpolation_bilineaire
)
);
ESaveModifyVariable(Float
,bILOAD_POINT_COORDONNEES_01_____epsilon_detection_des_fortes_discontinuites
);
ESaveModifyVariable(Logical
,bILOAD_POINT_COORDONNEES_01_____eviter_les_fortes_discontinuites
);
RETU(niveau_du_point_de_coordonnees_01);
Eblock
EFonctionF
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N A L B U M " S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S ( V E R S I O N " E T E N D U E " ) : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(Logical,SINT(FAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal,FAUX)));
/* Afin de pouvoir renvoyer le maximum et non pas la valeur interpolee. */
DEFV(Common,DEFV(FonctionP,FAload_point_coordonnees_01_etendu(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
)
)
)
/* Fonction introduite le 20100703100826... */
DEFV(Argument,DEFV(album,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees {Xf,Yf,Zf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
DEFV(Argument,DEFV(genere_p,niveau_hors_album));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-album". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(genere_p,INIT(niveau_du_point_de_coordonnees_01
,FAload_point_coordonnees_01(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
)
)
);
/* Niveau du point {Xf,Yf,Zf}. */
/*..............................................................................................................................*/
RETU(CON01(IL_FAUT(FAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal)
,FAload_point_coordonnees_01_____niveau_maximal
,niveau_du_point_de_coordonnees_01
)
);
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N A L B U M " N O N S T A N D A R D " */
/* A V E C C O O R D O N N E E S F L O T T A N T E S ( V E R S I O N " E T E N D U E " ) : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Common,DEFV(Logical,SINT(FFAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal,FAUX)));
/* Afin de pouvoir renvoyer le maximum et non pas la valeur interpolee. */
DEFV(Common,DEFV(FonctionF,FFAload_point_coordonnees_01_etendu(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
)
)
)
/* Fonction introduite le 20100703100826... */
DEFV(Argument,DEFV(albumF,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Float,Xf));
DEFV(Argument,DEFV(Float,Yf));
DEFV(Argument,DEFV(Float,Zf));
/* Coordonnees {Xf,Yf,Zf} du point argument dans [0,1[. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
/* Ceci a ete introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
DEFV(Argument,DEFV(genere_Float,niveau_hors_album));
/* Niveau a forcer au cas ou les coordonnees transformees seraient "hors-album". */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(genere_Float,INIT(niveau_du_point_de_coordonnees_01
,FFAload_point_coordonnees_01(albumA
,Xf,Yf,Zf
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
,niveau_hors_album
)
)
);
/* Niveau du point {Xf,Yf,Zf}. */
/*..............................................................................................................................*/
RETU(CON01(IL_FAUT(FFAload_point_coordonnees_01_etendu_____renvoyer_le_niveau_maximal)
,FFAload_point_coordonnees_01_____niveau_maximal
,niveau_du_point_de_coordonnees_01
)
);
Eblock
EFonctionF
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R A N G E M E N T D ' U N P O I N T " S T A N D A R D " D ' U N E I M A G E : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,Fstore_point(point
,imageA
,X,Y
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
)
)
)
/* Fonction introduite le 20070207133120. */
DEFV(Argument,DEFV(genere_p,point));
/* Valeur du point courant. */
DEFV(Argument,DEFV(image,imageA));
/* Image contenant le point argument. */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
/* Coordonnees {X,Y} du point argument. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est symetrique ou pas. */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] doit etre prolonge a l'exterieur comme il */
/* est au bord... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(Int,INIT(coordonnee_X,UNDEF));
DEFV(Int,INIT(coordonnee_Y,UNDEF));
/* Coordonnees {X,Y} du point argument apres d'eventuelles transformations... */
/*..............................................................................................................................*/
Test(IFOU(VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_X,symetriser_X,prolonger_X)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Y,symetriser_Y,prolonger_Y)
)
)
Bblock
PRINT_ATTENTION("une seule des options {periodiser,symetriser,prolonger} peut etre VRAI -la premiere 'VRAI' l'emporte-");
Eblock
ATes
Bblock
Eblock
ETes
PERIODISER_SYMETRISER_PROLONGER(X);
PERIODISER_SYMETRISER_PROLONGER(Y);
/* Eventuellement, periodisation et prolongement des axes... */
Test(TEST_DANS_L_IMAGE(coordonnee_X,coordonnee_Y))
Bblock
store_point(point,imageA,coordonnee_X,coordonnee_Y,FVARIABLE);
/* Rangement du point apres ses eventuelles transformations... */
Eblock
ATes
Bblock
Eblock
ETes
RETU_ERROR;
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R A N G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Common,DEFV(FonctionF,FFstore_point(point
,imageA
,X,Y
,periodiser_X,periodiser_Y
,symetriser_X,symetriser_Y
,prolonger_X,prolonger_Y
)
)
)
/* Fonction introduite le 20070207133120. */
DEFV(Argument,DEFV(genere_Float,point));
/* Valeur du point courant. */
DEFV(Argument,DEFV(imageF,imageA));
/* Image contenant le point argument. */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
/* Coordonnees {X,Y} du point argument. */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] est symetrique ou pas. */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax] doit etre prolonge a l'exterieur comme il */
/* est au bord... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(Int,INIT(coordonnee_X,UNDEF));
DEFV(Int,INIT(coordonnee_Y,UNDEF));
/* Coordonnees {X,Y} du point argument apres d'eventuelles transformations... */
/*..............................................................................................................................*/
Test(IFOU(VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_X,symetriser_X,prolonger_X)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Y,symetriser_Y,prolonger_Y)
)
)
Bblock
PRINT_ATTENTION("une seule des options {periodiser,symetriser,prolonger} peut etre VRAI -la premiere 'VRAI' l'emporte-");
Eblock
ATes
Bblock
Eblock
ETes
PERIODISER_SYMETRISER_PROLONGER(X);
PERIODISER_SYMETRISER_PROLONGER(Y);
/* Eventuellement, periodisation et prolongement des axes... */
Test(TEST_DANS_L_IMAGE(coordonnee_X,coordonnee_Y))
Bblock
storeF_point(point,imageA,coordonnee_X,coordonnee_Y);
/* Rangement du point apres ses eventuelles transformations... */
Eblock
ATes
Bblock
Eblock
ETes
RETU_ERROR;
Eblock
EFonctionF
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R A N G E M E N T D ' U N P O I N T " S T A N D A R D " D ' U N A L B U M : */
/* */
/*************************************************************************************************************************************/
BFonctionP
DEFV(Common,DEFV(FonctionP,FAstore_point(point
,albumA
,X,Y,Z
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
)
)
)
/* Fonction introduite le 20070208125243. */
DEFV(Argument,DEFV(genere_p,point));
/* Valeur du point courant... */
DEFV(Argument,DEFV(album,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
DEFV(Argument,DEFV(Int,Z));
/* Coordonnees {X,Y,Z} du point argument. On notera qu'avec : */
/* */
/* Z=Zmin */
/* */
/* un 'album' peut simuler une 'image'... */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
/* Ceci a ete introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(Int,INIT(coordonnee_X,UNDEF));
DEFV(Int,INIT(coordonnee_Y,UNDEF));
DEFV(Int,INIT(coordonnee_Z,UNDEF));
/* Coordonnees {X,Y,Z} du point argument apres d'eventuelles transformations... */
/*..............................................................................................................................*/
Test(I3OU(VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_X,symetriser_X,prolonger_X)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Y,symetriser_Y,prolonger_Y)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Z,symetriser_Z,prolonger_Z)
)
)
Bblock
PRINT_ATTENTION("une seule des options {periodiser,symetriser,prolonger} peut etre VRAI -la premiere 'VRAI' l'emporte-");
Eblock
ATes
Bblock
Eblock
ETes
PERIODISER_SYMETRISER_PROLONGER(X);
PERIODISER_SYMETRISER_PROLONGER(Y);
PERIODISER_SYMETRISER_PROLONGER(Z);
/* Eventuellement, periodisation et prolongement des axes... */
Test(TEST_DANS_L_ALBUM(coordonnee_X,coordonnee_Y,coordonnee_Z))
Bblock
Astore_point(point,albumA,coordonnee_X,coordonnee_Y,coordonnee_Z);
/* Rangement du point apres ses eventuelles transformations... */
Eblock
ATes
Bblock
Eblock
ETes
RETU_ERROR;
Eblock
EFonctionP
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R A N G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N A L B U M : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Common,DEFV(FonctionF,FFAstore_point(point
,albumA
,X,Y,Z
,periodiser_X,periodiser_Y,periodiser_Z
,symetriser_X,symetriser_Y,symetriser_Z
,prolonger_X,prolonger_Y,prolonger_Z
)
)
)
/* Fonction introduite le 20070208125243. */
DEFV(Argument,DEFV(genere_Float,point));
/* Valeur du point courant... */
DEFV(Argument,DEFV(albumF,albumA));
/* Album contenant le point argument. */
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
DEFV(Argument,DEFV(Int,Z));
/* Coordonnees {X,Y,Z} du point argument. On notera qu'avec : */
/* */
/* Z=Zmin */
/* */
/* un 'album' peut simuler une 'image'... */
DEFV(Argument,DEFV(Logical,periodiser_X));
DEFV(Argument,DEFV(Logical,periodiser_Y));
DEFV(Argument,DEFV(Logical,periodiser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est periodique ou pas. */
DEFV(Argument,DEFV(Logical,symetriser_X));
DEFV(Argument,DEFV(Logical,symetriser_Y));
DEFV(Argument,DEFV(Logical,symetriser_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] est symetrique ou pas. */
/* Ceci a ete introduit le 20050721103203... */
DEFV(Argument,DEFV(Logical,prolonger_X));
DEFV(Argument,DEFV(Logical,prolonger_Y));
DEFV(Argument,DEFV(Logical,prolonger_Z));
/* Indique si l'espace [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax] doit etre prolonge a l'exterieur */
/* comme il est au bord... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
INIT_ERROR;
DEFV(Int,INIT(coordonnee_X,UNDEF));
DEFV(Int,INIT(coordonnee_Y,UNDEF));
DEFV(Int,INIT(coordonnee_Z,UNDEF));
/* Coordonnees {X,Y,Z} du point argument apres d'eventuelles transformations... */
/*..............................................................................................................................*/
Test(I3OU(VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_X,symetriser_X,prolonger_X)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Y,symetriser_Y,prolonger_Y)
,VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER(periodiser_Z,symetriser_Z,prolonger_Z)
)
)
Bblock
PRINT_ATTENTION("une seule des options {periodiser,symetriser,prolonger} peut etre VRAI -la premiere 'VRAI' l'emporte-");
Eblock
ATes
Bblock
Eblock
ETes
PERIODISER_SYMETRISER_PROLONGER(X);
PERIODISER_SYMETRISER_PROLONGER(Y);
PERIODISER_SYMETRISER_PROLONGER(Z);
/* Eventuellement, periodisation et prolongement des axes... */
Test(TEST_DANS_L_ALBUM(coordonnee_X,coordonnee_Y,coordonnee_Z))
Bblock
AstoreF_point(point,albumA,coordonnee_X,coordonnee_Y,coordonnee_Z);
/* Rangement du point apres ses eventuelles transformations... */
Eblock
ATes
Bblock
Eblock
ETes
RETU_ERROR;
Eblock
EFonctionF
#undef VALIDATION_DES_PARAMETRES_DE_PERIODISER_SYMETRISER_PROLONGER
=undef PERIODISER_SYMETRISER_PROLONGER
_______________________________________________________________________________________________________________________________________