/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S D E B A S E A U N E I M A G E : */
/* */
/* */
/* Definition : */
/* */
/* Ce fichier contient toutes les definitions */
/* de base de gestion et de manipulation d'une */
/* image raster, quelle que soit la definition. */
/* */
/* */
/* Author of '$xiii/mono_image$DEF' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19890000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* V A L I D A T I O N D E S I M A G E S S T A T I Q U E S : */
/* */
/*************************************************************************************************************************************/
#ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01
# define INITIALISATION_D_UNE_IMAGE_ET_VALIDATION_DES_IMAGES_STATIQUES(image_a_initialiser,sequence_d_initialisation,edit_nivo) \
Bblock \
BLOC(sequence_d_initialisation); \
Eblock \
/* Procedure verifiant les images lors de leur initialisation et les initialisant... */
#Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01
#Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01
#ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02
# define INITIALISATION_D_UNE_IMAGE_ET_VALIDATION_DES_IMAGES_STATIQUES(image_a_initialiser,sequence_d_initialisation,edit_nivo) \
/* Cette definition a ete transportee de 'v $xiii/mono_image$FON' a ici le 20090317090736 */ \
/* afin de pouvoir etre utilisee dans 'v $xiii/files$FON'... */ \
Bblock \
Test(IFNE(image_a_initialiser,STATIQUE_UNDEF)) \
Bblock \
BLOC(sequence_d_initialisation); \
Eblock \
ATes \
Bblock \
PRINT_ERREUR("une image a initialiser est 'Statique' et n'a pas de memoire allouee"); \
PRINT_ERREUR("verifier alors que 'GET_ARGUMENTSv(...)' est utilisee dans cette commande"); \
/* Ce phenomene peut se produire lorsque 'GET_ARGUMENTSv(...)' n'a pas ete utilisee alors */ \
/* qu'elle est necessaire (ce fut le cas le 19990603133319 avec 'v $xci/contours.12$K'). */ \
/* Un cas plus rare consisterait a avoir oublie la declaration d'une image statique dans */ \
/* 'v $xig/fonct$vv$DEF ACTION_INITIALE_SUR_LES_IMAGES_STATIQUES_GET_ARGUMENTSv'. */ \
BLOC(edit_nivo); \
/* On notera que l'on ne peut pas editer le niveau d'initialisation car on ne connait pas */ \
/* son type simplement... */ \
\
PRINT_ERREUR("les memoires physiques et virtuelles sont certainement insuffisantes"); \
PRINT_ERREUR("il est preferable d'aborter ce programme"); \
\
Abort(ERREUR23); \
/* Le 19991129083831, j'ai ajoute cette sortie "brutale" car, en effet, si ce message */ \
/* apparait c'est que l'on a, par exemple, fait un : */ \
/* */ \
/* XYmax 20000 20000 */ \
/* */ \
/* et que la memoire (physique et virtuelle) ne suffit pas. Ce message apparait donc apres */ \
/* une allocation memoire qui a echouee... */ \
Eblock \
ETes \
Eblock \
/* Procedure verifiant les images lors de leur initialisation et les initialisant... */
#Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02
#Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N I T I A L I S A T I O N D ' U N E I M A G E Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
#define gIIinitialisation(les_images_sont_standards,imageR,FimageR,valeur,Fvaleur) \
/* L'argument 'Fvaleur' en complement de 'valeur' a ete introduit le 20111020090634... */ \
gCALC(EST_VRAI(les_images_sont_standards) \
,Iinitialisation(imageR,valeur) \
,IFinitialisation(FimageR,Fvaleur) \
) \
/* Initialisation d'une image quelconque ("standard" ou "flottante"). */ \
/* */ \
/* Jusqu'au 20111027090451, il y a eu par erreur 'IIinitialisation(...)' ci-dessus a la */ \
/* place de 'Iinitialisation(...)'. Cela s'est vu lors de l'introduction de '$LACT19'... */
#define gInettoyage(les_images_sont_standards,imageR,FimageR) \
gCALC(EST_VRAI(les_images_sont_standards) \
,Iinitialisation(imageR,Iinitialisation_____valeur_pour_gInettoyage) \
,IFinitialisation(FimageR,IFinitialisation_____valeur_pour_gInettoyage) \
) \
/* Nettoyage d'une image quelconque ("standard" ou "flottante"). */ \
/* */ \
/* Le 20090527110837, la fonction 'Inoir(...)' a ete remplacee par 'Iinitialisation(...)' et */ \
/* les '..._____valeur_pour_gInettoyage' ont ete introduites pour 'v $xci/scroll$K pour_gI'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N I T I A L I S A T I O N D ' U N E I M A G E P A R U N E F O N C T I O N : */
/* */
/* */
/* Nota : */
/* */
/* Le 20100209085255 la quatrieme coordonnee */
/* 't' a ete introduite afin que ces procedures */
/* soient compatibles avec les quaternions. Malgre */
/* ce passage a la quatrieme dimension, le nom '3D' */
/* a ete conserve (et non pas remplace par '4D') */
/* afin de n'avoir pas a recompiler tout ce qui */
/* refere ces procedures et donnees (en particulier */
/* les 'Common's...). */
/* */
/*************************************************************************************************************************************/
#define ACCES_A_UN_CHAMP_3D_____OEX \
MAX2(ABSO(ACCES_A_UN_CHAMP_3D_____OX),ABSO(ACCES_A_UN_CHAMP_3D_____EX)) \
/* Pour simplifier ce qui suit... */
#define ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D(x,y,z,t,ASID1,trans_champ,scale) \
OPC5(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20100210) \
,HOMO \
,SE15 \
,COND(IL_FAUT(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_dans_un_carre) \
,MUL2(ASID1(scale,cx) \
,CARRE_OX_PAR_RAPPORT_A_OY(_____cNORMALISE_OX(SOUS(x \
,_lDENORMALISE_OX(ASID1(trans_champ,dx)) \
) \
) \
) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128) \
,MUL2(ASID1(scale,cx) \
,COND(EST_VRAI(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees) \
,SUPER_cNORMALISE_OX(SOUS(x,SUPER_lDENORMALISE_OX(ASID1(trans_champ,dx)))) \
,SOUS(FLOT(x),ASID1(trans_champ,dx)) \
) \
) \
,AXPB(ASID1(scale,cx) \
,COND(EST_VRAI(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees) \
,SUPER_cNORMALISE_OX(x) \
,FLOT(x) \
) \
,NEGA(ASID1(trans_champ,dx)) \
) \
) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128) \
,MUL2(ASID1(scale,cx),SOUS(COORDONNEE_BARYCENTRIQUE_MINIMALE,ASID1(trans_champ,dx))) \
,AXPB(ASID1(scale,cx),COORDONNEE_BARYCENTRIQUE_MINIMALE,NEGA(ASID1(trans_champ,dx))) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128) \
,MUL2(ASID1(scale,cx),SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE,ASID1(trans_champ,dx))) \
,AXPB(ASID1(scale,cx),COORDONNEE_BARYCENTRIQUE_MAXIMALE,NEGA(ASID1(trans_champ,dx))) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_UN_CHAMP_3D_____centrer_X) \
,ACCES_A_UN_CHAMP_3D_____OX \
,NEGA(ACCES_A_UN_CHAMP_3D_____OEX) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_UN_CHAMP_3D_____centrer_X) \
,ACCES_A_UN_CHAMP_3D_____EX \
,NEUT(ACCES_A_UN_CHAMP_3D_____OEX) \
) \
) \
/* Acces a la coordonnee 'X' pour 'ACCES_A_UN_CHAMP_3D(...)'. La possibilite de ne pas */ \
/* utiliser 'CARRE_OX_PAR_RAPPORT_A_OY(...)' a ete introduite le 20041107133617 afin de */ \
/* pouvoir garantir, par exemple, de generer une periode d'un sinus le long de 'dimX' et */ \
/* de 'dimY' dans 'v $xci/sinus$K GENERATION_DU_CHAMP_DEMANDE'. On notera que suivant */ \
/* que l'on met les coordonnees dans un carre ou pas, la translation 'trans_champ' n'est */ \
/* pas utilisee de la meme facon (bien que ces deux facons soient equivalentes a epsilon */ \
/* pres...) ; cela est volontaire (pour alleger la formulation...). */ \
/* */ \
/* Le 20060117150450, '_____cNORMALISE_OX(...)' est devenu 'SUPER_cDENORMALISE_OX(...)' */ \
/* pour etendre les possibilites... */ \
/* */ \
/* Le 20060607181630, 'ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees' */ \
/* fut introduit... */ \
/* */ \
/* Le 20061128141549, 'ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128' */ \
/* fut introduit ; simultanement, pour 'ASID1(trans_champ,dx)' un 'NEGA(...)' qui, par */ \
/* erreur, manquait fut ajoute... */ \
/* */ \
/* Le 20061128160857 je note que la difference entre le mode normal et le mode "compatible" */ \
/* ne se manifeste que si l'echelle ('v $xiii/mono_image$FON coeffF_2D.POINTERs.echelle.') */ \
/* relative a 'X' ('ASID1(scale,cx)') differe de 1... */ \
/* */ \
/* Le 20100210091932 la fenetre de renormalisation des coordonnees {{OX,OY},{EX,EY}} fut */ \
/* introduite... */ \
/* */ \
/* Pour connaitre les effets de 'CARRE_OX_PAR_RAPPORT_A_OY(...)' voir les experiences */ \
/* 'v $xiii/mono_image$FON 20100210110346'... */ \
/* */ \
/* Le 20100917095419 je note la difficulte (voire l'impossibilite...) d'utiliser */ \
/* 'trans_champ' s'il differe de la valeur par defaut {1/2,1/2} et ce a cause de la */ \
/* renormalisation {ACCES_A_UN_CHAMP_3D_____OX,ACCES_A_UN_CHAMP_3D_____EX}. Des valeurs */ \
/* anormales sont alors produites par la formule ci-dessus. Au passage, quelle est */ \
/* l'utilite de translater le champ et donc les coordonnees, si celles-ci sont ensuite */ \
/* renormalisees ? */ \
/* */ \
/* Le 20170602125906 fut introduite la possibilite de centre {OX,EX}... */
#define ACCES_A_UN_CHAMP_3D_____OEY \
MAX2(ABSO(ACCES_A_UN_CHAMP_3D_____OY),ABSO(ACCES_A_UN_CHAMP_3D_____EY)) \
/* Pour simplifier ce qui suit... */
#define ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D(x,y,z,t,ASID1,trans_champ,scale) \
OPC5(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20100210) \
,HOMO \
,SE15 \
,COND(IL_FAUT(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_dans_un_carre) \
,MUL2(ASID1(scale,cy) \
,CARRE_OY_PAR_RAPPORT_A_OY(_____cNORMALISE_OY(SOUS(y \
,_lDENORMALISE_OY(ASID1(trans_champ,dy)) \
) \
) \
) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20061128) \
,MUL2(ASID1(scale,cy) \
,COND(EST_VRAI(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees) \
,SUPER_cNORMALISE_OY(SOUS(y,SUPER_lDENORMALISE_OY(ASID1(trans_champ,dy)))) \
,SOUS(FLOT(y),ASID1(trans_champ,dy)) \
) \
) \
,AXPB(ASID1(scale,cy) \
,COND(EST_VRAI(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees) \
,SUPER_cNORMALISE_OY(y) \
,FLOT(y) \
) \
,NEGA(ASID1(trans_champ,dy)) \
) \
) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20061128) \
,MUL2(ASID1(scale,cy),SOUS(COORDONNEE_BARYCENTRIQUE_MINIMALE,ASID1(trans_champ,dy))) \
,AXPB(ASID1(scale,cy),COORDONNEE_BARYCENTRIQUE_MINIMALE,NEGA(ASID1(trans_champ,dy))) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20061128) \
,MUL2(ASID1(scale,cy),SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE,ASID1(trans_champ,dy))) \
,AXPB(ASID1(scale,cy),COORDONNEE_BARYCENTRIQUE_MAXIMALE,NEGA(ASID1(trans_champ,dy))) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_UN_CHAMP_3D_____centrer_Y) \
,ACCES_A_UN_CHAMP_3D_____OY \
,NEGA(ACCES_A_UN_CHAMP_3D_____OEY) \
) \
,COND(IL_NE_FAUT_PAS(ACCES_A_UN_CHAMP_3D_____centrer_Y) \
,ACCES_A_UN_CHAMP_3D_____EY \
,NEUT(ACCES_A_UN_CHAMP_3D_____OEY) \
) \
) \
/* Acces a la coordonnee 'Y' pour 'ACCES_A_UN_CHAMP_3D(...)'. La possibilite de ne pas */ \
/* utiliser 'CARRE_OY_PAR_RAPPORT_A_OY(...)' a ete introduite le 20041107133617 afin de */ \
/* pouvoir garantir, par exemple, de generer une periode d'un sinus le long de 'dimY' et */ \
/* de 'dimY' dans 'v $xci/sinus$K GENERATION_DU_CHAMP_DEMANDE'. On notera que suivant */ \
/* que l'on met les coordonnees dans un carre ou pas, la translation 'trans_champ' n'est */ \
/* pas utilisee de la meme facon (bien que ces deux facons soient equivalentes a epsilon */ \
/* pres...) ; cela est volontaire (pour alleger la formulation et d'autre part, meme si */ \
/* 'CARRE_OY_PAR_RAPPORT_A_OY(...)' est neutre, cela donne des resultats legerements */ \
/* differents numeriquement...). */ \
/* */ \
/* Le 20060117150450, '_____cNORMALISE_OY(...)' est devenu 'SUPER_cDENORMALISE_OY(...)' */ \
/* pour etendre les possibilites... */ \
/* */ \
/* Le 20060607181630, 'ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees' */ \
/* fut introduit... */ \
/* */ \
/* Le 20061128141549, 'ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128' */ \
/* fut introduit ; simultanement, pour 'ASID1(trans_champ,dy)' un 'NEGA(...)' qui, par */ \
/* erreur, manquait fut ajoute... */ \
/* */ \
/* Le 20061128160857 je note que la difference entre le mode normal et le mode "compatible" */ \
/* ne se manifeste que si l'echelle ('v $xiii/mono_image$FON coeffF_2D.POINTERs.echelle.') */ \
/* relative a 'Y' ('ASID1(scale,cy)') differe de 1... */ \
/* */ \
/* Le 20100210091932 la fenetre de renormalisation des coordonnees {{OX,OY},{EX,EY}} fut */ \
/* introduite... */ \
/* */ \
/* Pour connaitre les effets de 'CARRE_OY_PAR_RAPPORT_A_OY(...)' voir les experiences */ \
/* 'v $xiii/mono_image$FON 20100210110346'... */ \
/* */ \
/* Le 20100917095419 je note la difficulte (voire l'impossibilite...) d'utiliser */ \
/* 'trans_champ' s'il differe de la valeur par defaut {1/2,1/2} et ce a cause de la */ \
/* renormalisation {ACCES_A_UN_CHAMP_3D_____OY,ACCES_A_UN_CHAMP_3D_____EY}. Des valeurs */ \
/* anormales sont alors produites par la formule ci-dessus. Au passage, quelle est */ \
/* l'utilite de translater le champ et donc les coordonnees, si celles-ci sont ensuite */ \
/* renormalisees ? */ \
/* */ \
/* Le 20170602125906 fut introduite la possibilite de centre {OY,EY}... */
#define ACCES_A_UN_CHAMP_3D(amplificateur_de_la_fonction,Acces,Fonction,translateur_de_la_fonction,x,y,z,t,ASID1,trans_champ,scale) \
AXPB(amplificateur_de_la_fonction \
,Acces(Fonction)(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D(x,y,z,t,ASID1,trans_champ,scale) \
,ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D(x,y,z,t,ASID1,trans_champ,scale) \
,z \
,t \
) \
,translateur_de_la_fonction \
) \
/* Macro d'acces a un point donne {x,y,z} d'un champ suivant une translation definie par */ \
/* 'trans_champ' accedee par 'ASID1' ('ASI1' ou 'ASD1'). La fonction definissant */ \
/* le champ est definie par 'Fonction' et accedee par 'Acces' ('RIEN' ou 'fPOINTEUR'). On */ \
/* notera le 'SCAL(...,dimY,dimX)' destine a faire que les axes soient orthonormes, meme si */ \
/* l'image generee n'est pas carree (voir par exemple 'Pal'). ATTENTION, pendant longtemps */ \
/* la denormalisation des coordonnees a ete entouree par un 'DPRE(...)' que j'ai supprime */ \
/* car je n'en voyais pas la justification... */
#define EXTERIEUR_D_UN_CHAMP_3D \
FZERO \
/* Valeur a donner aux points exterieurs a un champ defini par 'ACCES_A_UN_CHAMP_3D(...)'. */
#define Zf_ARGUMENT_INUTILE \
FZERO
#define Tf_ARGUMENT_INUTILE \
FZERO
/* Valeur a donner a la coordonnee 'z' lorsqu'elle est inutile. Il est plus astucieux */
/* d'utiliser 'FZERO' que 'FLOT__ARGUMENT_INUTILE' au cas ou 'z' serait quand meme utilisee, */
/* 'FZERO' etant plus "neutre" que 'FLOT__ARGUMENT_INUTILE'. La coordonnee 't' a ete */
/* introduite le 20100209085255... */
#define ACCES_A_UN_CHAMP(amplificateur_de_la_fonction,Acces,Fonction,translateur_de_la_fonction,x,y,ASID1,trans_champ,scale) \
ACCES_A_UN_CHAMP_3D(amplificateur_de_la_fonction \
,Acces \
,Fonction \
,translateur_de_la_fonction \
,x,y,Zf_ARGUMENT_INUTILE,Tf_ARGUMENT_INUTILE \
,ASID1 \
,trans_champ \
,scale \
) \
/* Macro standard d'acces a un point donne {x,y} d'un champ. Ce niveau supplementaire a ete */ \
/* introduit le 19961030073736 afin de ne pas avoir a modifier de nombreux fichiers lors de */ \
/* l'introduction de l'argument 'Zf' dans les fonctions du type 'Igenere_champ(...)' dans */ \
/* 'v $xiii/mono_image$FON Igenere_champ'. */
#define ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_TRANSFORME(x,y,z,t,ASID1,trans_champ,scale) \
Xf_transformee
#define ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_TRANSFORME(x,y,z,t,ASID1,trans_champ,scale) \
Yf_transformee
#define ACCES_A_LA_COORDONNEE_Z_D_UN_CHAMP_3D_TRANSFORME(x,y,z,t,ASID1,trans_champ,scale) \
Zf_transformee
#define ACCES_A_LA_COORDONNEE_T_D_UN_CHAMP_3D_TRANSFORME(x,y,z,t,ASID1,trans_champ,scale) \
Tf_transformee
/* Acces aux coordonnees {x,y,z} transformees geometriquement (introduit le 20060516094343). */
#define ACCES_A_UN_CHAMP_3D_TRANSFORME(amplificateur_fonction,Acces,Fonction,translateur_fonction,x,y,z,ASID1,trans_champ,scale) \
Ftraitement_des_points_d_un_champ(amplificateur_fonction \
,Acces(Fonction)(Xf_transformee \
,Yf_transformee \
,Zf_transformee \
,Tf_transformee \
) \
,translateur_fonction \
) \
/* Macro d'acces a un point donne {x,y,z} d'un champ, apres transformation geometrique des */ \
/* coordonnees {x,y,z}. Ceci fut introduit le 20060516094343... */ \
/* */ \
/* ATTENTION : on notera que le triplet argument {x,y,z} ne sert a rien et n'est la que par */ \
/* symetrie avec la procedure 'ACCES_A_UN_CHAMP_3D(...). En fait, au triplet {x,y,z} est */ \
/* substitue le triplet {Xf_transformee,Yf_transformee,Zf_transformee} qui seul est utile. */ \
/* */ \
/* Le 20150408094048, 'Ftraitement_des_points_d_un_champ(...)' a remplace 'AXPB(...)'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N I T I A L I S A T I O N D ' U N E I M A G E Q U E L C O N Q U E P A R U N E F O N C T I O N : */
/* */
/*************************************************************************************************************************************/
#define gIgenere_champ(les_images_sont_standards,imageR,FimageR,amplificateur_Fxy,Fxy,translateur_Fxy,translation,echelle,Zf,Tf) \
gCALC(EST_VRAI(les_images_sont_standards) \
,Igenere_champ(imageR,amplificateur_Fxy,Fxy,translateur_Fxy,translation,echelle,Zf,Tf) \
,IFgenere_champ(FimageR,amplificateur_Fxy,Fxy,translateur_Fxy,translation,echelle,Zf,Tf) \
) \
/* Initialisation d'une image quelconque ("standard" ou "flottante") par une fonction. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H O I X D E L A F A C O N D E C A L C U L E R L E T R E F L E : */
/* */
/*************************************************************************************************************************************/
#nodefine FACON_DE_CALCULER_LE_CHAMP_TREFLE_VERSION_01 \
/* Cette facon de calculer le trefle utilise une fonction periodique dans le plan, ce qui */ \
/* provoque une alternance de maxima et de minima quand on s'eloigne vers l'infini ; elle */ \
/* est de la forme : */ \
/* */ \
/* posons : */ \
/* */ \
/* rho */ \
/* R(X,Y) = Cr.---------------------------- + Pr */ \
/* Cc.cos(Ct.theta + Pt) + Tc */ \
/* */ \
/* */ \
/* W ^ */ \
/* * | * */ \
/* * * | * * seule la partie correspondant */ \
/* * * | * * a U>0 est utilisee. */ \
/* * * | * * */ \
/* * * | * * */ \
/* ------------------*------------------*-------------------*-------------------*-> */ \
/* * *| * * U */ \
/* * * | * * */ \
/* W = Cs.sin(U) + Ts * * | * * */ \
/* * * | * * */ \
/* * | * */ \
/* */ \
/* on a alors : */ \
/* */ \
/* F(X,Y) = Cs.sin[R(X,Y)] + Ts */ \
/* */ \
/* la periodicite etant introduite par la fonction 'sin'. */
#define FACON_DE_CALCULER_LE_CHAMP_TREFLE_VERSION_02 \
/* Cette facon de calculer le trefle utilise une fonction non periodique dans le plan, */ \
/* ce qui fait que l'on ne rencontre qu'un maximum, pour tendre vers zero a l'infini ; elle */ \
/* est de la forme : */ \
/* */ \
/* posons : */ \
/* */ \
/* rho */ \
/* R(X,Y) = Cr.---------------------------- + Pr */ \
/* Cc.cos(Ct.theta + Pt) + Tc */ \
/* */ \
/* 2.r */ \
/* U W ^ */ \
/* W = Cs.----------- + Co * | * */ \
/* 4.r * * | * * seule la partie correspondant */ \
/* U + Ts * * | * * a U>0 est utilisee. */ \
/* * * | * * */ \
/* * * * * | * * * * */ \
/* ------------------------------------***----------------------------------------> */ \
/* | U */ \
/* | */ \
/* */ \
/* on a alors : */ \
/* */ \
/* 2.r */ \
/* R(X,Y) */ \
/* F(X,Y) = Cs.--------------- + Co */ \
/* 4.r */ \
/* R(X,Y) + Ts */ \
/* */ \
/* la non periodicite etant introduite par une fonction "polynomiale" ; de plus, plus */ \
/* le demi-exposant 'r' est grand, plus la "double-bosse" de la courbe ci-dessus est */ \
/* etroite... */
#nodefine FACON_DE_CALCULER_LE_CHAMP_TREFLE_VERSION_03 \
/* Cette facon de calculer le trefle utilise une fonction non periodique dans le plan, */ \
/* ce qui fait que l'on ne rencontre qu'un maximum, pour tendre vers zero a l'infini ; elle */ \
/* est de la forme : */ \
/* */ \
/* posons : */ \
/* */ \
/* rho */ \
/* R(X,Y) = Cr.---------------------------- + Pr */ \
/* Cc.cos(Ct.theta + Pt) + Tc */ \
/* */ \
/* r */ \
/* - ----.u */ \
/* r Ts W ^ */ \
/* W = Cs.u .e + Co | * */ \
/* | * . * seule la partie relative */ \
/* (avec r>1 et Ts>0) | * . * a U>0 est utilisee. */ \
/* | * . * */ \
/* | * . * * * */ \
/* -------------------------------------**----------------------------------------> */ \
/* | Ts U */ \
/* | */ \
/* */ \
/* on a alors : */ \
/* */ \
/* r */ \
/* - ----.R(X,Y) */ \
/* r Ts */ \
/* F(X,Y) = Cs.R(X,Y) .e + Co */ \
/* */ \
/* */ \
/* la non periodicite etant introduite par les exponentielles ; de plus, plus */ \
/* le exposant 'r' est grand, plus la "bosse" de la courbe ci-dessus est etroite, */ \
/* les points d'inflexion etant en : */ \
/* */ \
/* 1 */ \
/* h.(1 +/- -----) */ \
/* ___ */ \
/* \/ r */ \
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H O I X D E L A F A C O N D E C A L C U L E R L E " C H A P E A U M E X I C A I N " : */
/* */
/*************************************************************************************************************************************/
#nodefine FACON_DE_CALCULER_LE_CHAMP_CHAPEAU_MEXICAIN_VERSION_01 \
/* Cette facon de calculer le "chapeau mexicain" utilise la fonction suivante : */ \
/* */ \
/* 4 2 */ \
/* F(X,Y) = c.[c4.R + c2.R + t] */ \
/* */
#define FACON_DE_CALCULER_LE_CHAMP_CHAPEAU_MEXICAIN_VERSION_02 \
/* Cette facon de calculer le "chapeau mexicain" utilise la fonction suivante : */ \
/* */ \
/* a b.R */ \
/* F(X,Y) = c.[R .e + t] */ \
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H O I X D E L A F A C O N D E C A L C U L E R L E C H A M P E L L I P S O I D A L : */
/* */
/*************************************************************************************************************************************/
#nodefine FACON_DE_CALCULER_LE_CHAMP_ELLIPSOIDAL_VERSION_01 \
/* Cette facon de calculer le champ ellipsoidal utilise la fonction suivante : */ \
/* */ \
/* 2 2 2 */ \
/* | X | | Y | | Z | */ \
/* F(X,Y,Z) = |---| + |---| + |---| - 1 */ \
/* | A | | B | | C | */ \
/* */ \
/* (ceci fut introduit le 20061128085009). */
#define FACON_DE_CALCULER_LE_CHAMP_ELLIPSOIDAL_VERSION_02 \
/* Cette facon de calculer le champ ellipsoidal utilise la fonction suivante : */ \
/* */ \
/* 2 2 2 */ \
/* X Y Z */ \
/* F(X,Y,Z) = ---- + ---- + ---- - D */ \
/* A B C */ \
/* */ \
/* (ceci fut introduit le 20061128085009). Cela permet aussi bien ellipsoides */ \
/* (A>0, B>0, C>0 et D>0) que des hyperboloides (A>0, B<0, C>0 et D>0 ou D<0). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N I T I A L I S A T I O N D ' U N E I M A G E P A R U N E I T E R A T I O N : */
/* */
/*************************************************************************************************************************************/
#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)) \
)
# ifdef SYSTEME_DPX5000_SPIX_CC
# ifdef LACT11
# TestADef BUG_SYSTEME_DPX5000_SPIX_CC_LACT11_ZONE_DE_SWAP_01 \
/* Sur 'SYSTEME_DPX5000_SPIX_CC', le compilateur 'cc' a besoin d'une zone de swap enorme */ \
/* pour compiler les 'Iterated Function Set' ; etant superieure a celle qui est disponible, */ \
/* depuis qu'il y a 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02', on ne peut plus compiler. */ \
/* Ceci est valable sur la machine 'LACT11'... */
# Aifdef LACT11
# Eifdef LACT11
# Aifdef SYSTEME_DPX5000_SPIX_CC
# Eifdef SYSTEME_DPX5000_SPIX_CC
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
)
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
)
# ifdef SYSTEME_NWS3000_NEWSOS_CC
# TestADef BUG_SYSTEME_NWS3000_NEWSOS_CC_EDITION_DE_LIENS_01 \
/* Sur 'SYSTEME_NWS3000_NEWSOS_CC', le compilateur 'cc' lorsqu'il compile les fonctions */ \
/* relatives a l'initialisation d'une image par une iteration produit un binaire errone, */ \
/* qui donne a l'edition de liens le message d'erreur suivant : */ \
/* */ \
/* ld: */ \
/* Object file format error in:... relocation entry for non-relocatable symbol in .text */ \
/* section for entry... */ \
/* */ \
/* la seule solution que j'ai trouve est donc d'inhiber la compilation de ces modules... */
# Aifdef SYSTEME_NWS3000_NEWSOS_CC
# Eifdef SYSTEME_NWS3000_NEWSOS_CC
# ifdef SYSTEME_NWS3000_NEWSOS_2CC
# TestADef BUG_SYSTEME_NWS3000_NEWSOS_2CC_EDITION_DE_LIENS_01 \
/* Sur 'SYSTEME_NWS3000_NEWSOS_2CC', le compilateur 'cc' lorsqu'il compile les fonctions */ \
/* relatives a l'initialisation d'une image par une iteration produit un binaire errone, */ \
/* qui donne a l'edition de liens le message d'erreur suivant : */ \
/* */ \
/* ld: */ \
/* Object file format error in:... relocation entry for non-relocatable symbol in .text */ \
/* section for entry... */ \
/* */ \
/* la seule solution que j'ai trouve est donc d'inhiber la compilation de ces modules... */
# Aifdef SYSTEME_NWS3000_NEWSOS_2CC
# Eifdef SYSTEME_NWS3000_NEWSOS_2CC
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \
)
#if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \
)
#if ( (defined(BUG_SYSTEME_DPX5000_SPIX_CC_LACT11_ZONE_DE_SWAP_01)) \
|| (defined(BUG_SYSTEME_NWS3000_NEWSOS_CC_EDITION_DE_LIENS_01)) \
|| (defined(BUG_SYSTEME_NWS3000_NEWSOS_2CC_EDITION_DE_LIENS_01)) \
)
# nodefine __VERSION__COMPILER_LA_FONCTION_Iiteration_champ \
/* Certains bugs SYSTEMEs empechent la compilation de la fonction 'Iiteration_champ(...)' */ \
/* et de tout ce qui l'accompagne... */
#Aif ( (defined(BUG_SYSTEME_DPX5000_SPIX_CC_LACT11_ZONE_DE_SWAP_01)) \
|| (defined(BUG_SYSTEME_NWS3000_NEWSOS_CC_EDITION_DE_LIENS_01)) \
|| (defined(BUG_SYSTEME_NWS3000_NEWSOS_2CC_EDITION_DE_LIENS_01)) \
)
# define __VERSION__COMPILER_LA_FONCTION_Iiteration_champ \
/* Certains bugs SYSTEMEs empechent la compilation de la fonction 'Iiteration_champ(...)' */ \
/* et de tout ce qui l'accompagne... */
#Eif ( (defined(BUG_SYSTEME_DPX5000_SPIX_CC_LACT11_ZONE_DE_SWAP_01)) \
|| (defined(BUG_SYSTEME_NWS3000_NEWSOS_CC_EDITION_DE_LIENS_01)) \
|| (defined(BUG_SYSTEME_NWS3000_NEWSOS_2CC_EDITION_DE_LIENS_01)) \
)