/*************************************************************************************************************************************/ /* */ /* 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)) \ )