_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* 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 _______________________________________________________________________________________________________________________________________