/*************************************************************************************************************************************/ /* */ /* G E S T I O N D E S E X T R E M A D E S C O O R D O N N E E S E T D E S D E R I V E E S : */ /* */ /* */ /* Author of '$xrk/attractor.1C$I' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 1992??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E X T R E M A D E S C O O R D O N N E E S E T D E S D E R I V E E S : */ /* */ /*************************************************************************************************************************************/ #define EDITER_LES_EXTREMA \ FAUX \ /* Indique si l'on edite ('VRAI') a la fin la valeur des extrema de {x,y,z} et {dx,dy,dz} */ /* ou pas ('FAUX'). */ #TestADef EDITER_LES_EXTREMA_S_ILS_SONT_HORS_PREVISIONS \ VRAI \ /* Indique si l'on edite ('VRAI') a la fin la valeur des extrema de {x,y,z} et {dx,dy,dz} */ \ /* ou pas ('FAUX') lorsqu'ils sont en dehors de {?min_ESPACE,?max_ESPACE} et de */ \ /* {d?min_ESPACE,d?max_ESPACE} respectivement. Ceci a ete introduit le 20041112085834. */ #define DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES \ DEFV(Local,DEFV(Logical,INIT(editer_les_extrema,EDITER_LES_EXTREMA))); \ /* Indique si l'on edite ('VRAI') a la fin la valeur des extrema de {x,y,z} et {dx,dy,dz} */ \ /* ou pas ('FAUX'). */ \ DEFV(Local,DEFV(Logical,INIT(editer_les_extrema_s_ils_sont_hors_previsions \ ,EDITER_LES_EXTREMA_S_ILS_SONT_HORS_PREVISIONS \ ) \ ) \ ); \ /* Indique si l'on edite ('VRAI') a la fin la valeur des extrema de {x,y,z} et {dx,dy,dz} */ \ /* ou pas ('FAUX') lorsqu'ils sont en dehors de {?min_ESPACE,?max_ESPACE} et de */ \ /* {d?min_ESPACE,d?max_ESPACE} respectivement. Ceci a ete introduit le 20041112085834. */ \ DEFV(Local,DEFV(Float,INIT(minimum_de_cx,F_INFINI))); \ DEFV(Local,DEFV(Float,INIT(minimum_de_cy,F_INFINI))); \ DEFV(Local,DEFV(Float,INIT(minimum_de_cz,F_INFINI))); \ /* Definition du minimum de {x,y,z}, */ \ DEFV(Local,DEFV(Float,INIT(maximum_de_cx,F_MOINS_L_INFINI))); \ DEFV(Local,DEFV(Float,INIT(maximum_de_cy,F_MOINS_L_INFINI))); \ DEFV(Local,DEFV(Float,INIT(maximum_de_cz,F_MOINS_L_INFINI))); \ /* Definition du maximum de {x,y,z}. */ \ /* donnees utiles a la recherche des extrema des coordonnees. */ #TestADef PRENDRE_LA_VALEUR_ABSOLUE_DES_DIFFERENTIELLES \ FAUX #define DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_DERIVEES \ DEFV(Local,DEFV(Logical,INIT(prendre_la_valeur_absolue_des_differentielles \ ,PRENDRE_LA_VALEUR_ABSOLUE_DES_DIFFERENTIELLES \ ) \ ) \ ); \ /* Cei fut introduit le 20060131113621 pour resoudre un mystere rencontre avec, par */ \ /* exemple, 'v $xrs/CalabiYau.12$K'. En effet, si l'on cherche a colorier la variete */ \ /* avec les differentielles (sans texturage donc...), le passage d'un "patch" a l'autre */ \ /* se fait avec des discontinuites dans les couleurs. Cela vient du fait que les fonctions */ \ /* {Fx,Fy,Fz} sont symetriques par rapport a 'v' (et aussi par rapport a 'u', mais les */ \ /* essais faits a ce moment-la portaient sur 'v'). On a donc : */ \ /* */ \ /* F(u,+v) = F(u,-v) */ \ /* */ \ /* (ou 'F' designe l'une quelconque des trois fonctions {Fx,Fy,Fz}). Ainsi, avec les */ \ /* parametres suivants : */ \ /* */ \ /* dxFxu=0 dxFxv=1 dxFxuv=0 */ \ /* dyFyu=0 dyFyv=1 dyFyuv=0 */ \ /* dzFzu=0 dzFzv=1 dzFzuv=0 */ \ /* */ \ /* et donc en ne s'interessant qu'aux derivees partielles en 'v', les valeurs suivantes */ \ /* ont ete obtenues : */ \ /* */ \ /* Fx(0,+0.8) = -0.001828 */ \ /* Fx(0,+0.8-pv) = -0.004898 */ \ /* Fx(0,+0.8+pv) = +0.001202 */ \ /* */ \ /* et : */ \ /* */ \ /* Fx(0,-0.8) = -0.001828 = Fx(0,+0.8) */ \ /* Fx(0,-0.8-pv) = -0.001202 = Fx(0,+0.8+pv) */ \ /* Fx(0,-0.8+pv) = -0.004898 = Fx(0,+0.8-pv) */ \ /* */ \ /* (ou le pas 'pv' vaut 0.01) sachant que les points 'Fx(0,+0.8)' et 'Fx(0,-0.8)' */ \ /* appartiennent aux "patches" {k1=3,k2=1} et {k1=3,k2=2} respectivement, mais sont */ \ /* physiquement confondus. Ainsi donc : */ \ /* */ \ /* Fx(0,+v) = Fx(0,-v) */ \ /* */ \ /* Or : */ \ /* */ \ /* dFx(0,v) Fx(0,v+pv) - Fx(0,v-pv) */ \ /* ---------- = ------------------------- */ \ /* dv 2pv */ \ /* */ \ /* donc : */ \ /* */ \ /* dFx(0,+0.8) Fx(0,+0.8+pv) - Fx(0,+0.8-pv) */ \ /* ------------- = ------------------------------- */ \ /* dv 2pv */ \ /* */ \ /* dFx(0,-0.8) Fx(0,-0.8+pv) - Fx(0,-0.8-pv) */ \ /* ------------- = ------------------------------- */ \ /* dv 2pv */ \ /* */ \ /* Fx(0,+0.8-pv) - Fx(0,+0.8+pv) */ \ /* = ------------------------------- */ \ /* 2pv */ \ /* */ \ /* dFx(0,+0.8) */ \ /* = - ------------- */ \ /* dv */ \ /* */ \ /* d'ou la discontinuite dans les couleurs. Une solution est donc pour traiter ce cas */ \ /* de prendre la valeur absolue des differentielles si besoin est... */ \ /* */ \ /* Ce dispositif fut transfere ici depuis 'v $xrs/surfaces.14$I' le 20060201095118 pour */ \ /* en augmenter la portee... */ \ DEFV(Local,DEFV(Float,INIT(minimum_de_dcx,F_INFINI))); \ DEFV(Local,DEFV(Float,INIT(minimum_de_dcy,F_INFINI))); \ DEFV(Local,DEFV(Float,INIT(minimum_de_dcz,F_INFINI))); \ /* Definition du minimum de {dx,dy,dz}, */ \ DEFV(Local,DEFV(Float,INIT(maximum_de_dcx,F_MOINS_L_INFINI))); \ DEFV(Local,DEFV(Float,INIT(maximum_de_dcy,F_MOINS_L_INFINI))); \ DEFV(Local,DEFV(Float,INIT(maximum_de_dcz,F_MOINS_L_INFINI))); \ /* Definition du maximum de {dx,dy,dz}. */ \ /* donnees utiles a la recherche des extrema des derivees. */ #define DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES \ DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES \ DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_DERIVEES \ /* Donnees utiles a la recherche des extrema des coordonnees et des derivees. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E C H E R C H E D E S E X T R E M A D E S C O O R D O N N E E S E T D E S D E R I V E E S : */ /* */ /*************************************************************************************************************************************/ #define RECHERCHE_DES_EXTREMA_DES_COORDONNEES \ Bblock \ EGAL(minimum_de_cx,MIN2(minimum_de_cx,cx)); \ EGAL(minimum_de_cy,MIN2(minimum_de_cy,cy)); \ EGAL(minimum_de_cz,MIN2(minimum_de_cz,cz)); \ /* Calcul du minimum de {x,y,z}, */ \ EGAL(maximum_de_cx,MAX2(maximum_de_cx,cx)); \ EGAL(maximum_de_cy,MAX2(maximum_de_cy,cy)); \ EGAL(maximum_de_cz,MAX2(maximum_de_cz,cz)); \ /* Calcul du maximum de {x,y,z}. */ \ Eblock \ /* Recherche des extrema des coordonnees.. On notera que cette recherche n'est pas */ \ /* conditionnee par 'editer_les_extrema' car en effet, ces extrema pourraient etre utilises */ \ /* lors de la visualisation... */ #define RECHERCHE_DES_EXTREMA_DES_DERIVEES \ Bblock \ Test(IL_FAUT(prendre_la_valeur_absolue_des_differentielles)) \ Bblock \ EGAL(dcx,ABSO(dcx)); \ EGAL(dcy,ABSO(dcy)); \ EGAL(dcz,ABSO(dcz)); \ /* Introduit le 20060131120200 pour le probleme 'v $xrs/surfaces.14$I 20060131113621' et */ \ /* transfere ici depuis 'v $xrs/surfaces.12$I' le 20060201095118 pour en augmenter la */ \ /* portee... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(minimum_de_dcx,MIN2(minimum_de_dcx,dcx)); \ EGAL(minimum_de_dcy,MIN2(minimum_de_dcy,dcy)); \ EGAL(minimum_de_dcz,MIN2(minimum_de_dcz,dcz)); \ /* Calcul du minimum de {dx,dy,dz}, */ \ EGAL(maximum_de_dcx,MAX2(maximum_de_dcx,dcx)); \ EGAL(maximum_de_dcy,MAX2(maximum_de_dcy,dcy)); \ EGAL(maximum_de_dcz,MAX2(maximum_de_dcz,dcz)); \ /* Calcul du maximum de {dx,dy,dz}. */ \ Eblock \ /* Recherche des extrema des derivees.. On notera que cette recherche n'est pas */ \ /* conditionnee par 'editer_les_extrema' car en effet, ces extrema pourraient etre utilises */ \ /* lors de la visualisation... */ #define RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES \ Bblock \ RECHERCHE_DES_EXTREMA_DES_COORDONNEES; \ RECHERCHE_DES_EXTREMA_DES_DERIVEES; \ Eblock \ /* Recherche des extrema des coordonnees et des derivees. On notera que cette recherche */ \ /* n'est pas conditionnee par 'editer_les_extrema' car en effet, ces extrema pourraient */ \ /* etre utilises lors de la visualisation... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E D I T I O N D E S E X T R E M A D E S C O O R D O N N E E S E T D E S D E R I V E E S : */ /* */ /*************************************************************************************************************************************/ #define EDITION_DES_EXTREMA_DES_COORDONNEES \ Bblock \ Test(I3OU(IFOU(IFEXff(minimum_de_cx,Xmin_ESPACE,Xmax_ESPACE) \ ,IFEXff(maximum_de_cx,Xmin_ESPACE,Xmax_ESPACE) \ ) \ ,IFOU(IFEXff(minimum_de_cy,Ymin_ESPACE,Ymax_ESPACE) \ ,IFEXff(maximum_de_cy,Ymin_ESPACE,Ymax_ESPACE) \ ) \ ,IFOU(IFEXff(minimum_de_cz,Zmin_ESPACE,Zmax_ESPACE) \ ,IFEXff(maximum_de_cz,Zmin_ESPACE,Zmax_ESPACE) \ ) \ ) \ ) \ Bblock \ Test(IL_FAUT(editer_les_extrema_s_ils_sont_hors_previsions)) \ Bblock \ PRINT_ATTENTION("les extrema des coordonnees ne sont pas inclus dans les valeurs predefinies"); \ CAL1(Prer3("minimum predefini(x,y,z) = (%g,%g,%g)\n",Xmin_ESPACE,Ymin_ESPACE,Zmin_ESPACE)); \ /* Edition du minimum de {x,y,z}, */ \ CAL1(Prer3("maximum predefini(x,y,z) = (%g,%g,%g)\n",Xmax_ESPACE,Ymax_ESPACE,Zmax_ESPACE)); \ /* Edition du maximum de {x,y,z}. */ \ \ CAL1(Prer3("minimum(x,y,z) = (%g,%g,%g)\n",minimum_de_cx,minimum_de_cy,minimum_de_cz)); \ /* Edition du minimum de {x,y,z}, */ \ CAL1(Prer3("maximum(x,y,z) = (%g,%g,%g)\n",maximum_de_cx,maximum_de_cy,maximum_de_cz)); \ /* Edition du maximum de {x,y,z}. */ \ /* */ \ /* ATTENTION, avant le 19990224160933 {minimum_de_cx,minimum_de_cy,minimum_de_cz} et */ \ /* {maximum_de_cx,maximum_de_cy,maximum_de_cz} etaient edites ci-apres en faisant ici : */ \ /* */ \ /* EGAL(editer_les_extrema,CAL1_____executer); */ \ /* */ \ /* mais cela presentait un grave defaut car cela faisait sortir ces valeurs via des */ \ /* 'Prin3(...)' et donc, lorsque le programme correspondant utilisait l'option : */ \ /* */ \ /* IL_FAUT(lister_la_liste_des_points) */ \ /* */ \ /* via : */ \ /* */ \ /* lister_les_points=VRAI */ \ /* */ \ /* ces extrema se retrouvaient dans la liste des points, ce qui peut etre genant... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(editer_les_extrema)) \ Bblock \ CAL2(Prin3("minimum(x,y,z) = (%g,%g,%g)\n",minimum_de_cx,minimum_de_cy,minimum_de_cz)); \ /* Edition du minimum de {x,y,z}, */ \ CAL2(Prin3("maximum(x,y,z) = (%g,%g,%g)\n",maximum_de_cx,maximum_de_cy,maximum_de_cz)); \ /* Edition du maximum de {x,y,z}. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition des extrema des coordonnees. */ #define EDITION_DES_EXTREMA_DES_DERIVEES \ Bblock \ Test(I3OU(IFOU(IFET(IFEXff(minimum_de_dcx,dXmin_ESPACE,dXmax_ESPACE) \ ,IFNE(minimum_de_dcx,FLOT__UNDEF) \ ) \ ,IFET(IFEXff(maximum_de_dcx,dXmin_ESPACE,dXmax_ESPACE) \ ,IFNE(maximum_de_dcx,FLOT__UNDEF) \ ) \ ) \ ,IFOU(IFET(IFEXff(minimum_de_dcy,dYmin_ESPACE,dYmax_ESPACE) \ ,IFNE(minimum_de_dcy,FLOT__UNDEF) \ ) \ ,IFET(IFEXff(maximum_de_dcy,dYmin_ESPACE,dYmax_ESPACE) \ ,IFNE(maximum_de_dcy,FLOT__UNDEF) \ ) \ ) \ ,IFOU(IFET(IFEXff(minimum_de_dcz,dZmin_ESPACE,dZmax_ESPACE) \ ,IFNE(minimum_de_dcz,FLOT__UNDEF) \ ) \ ,IFET(IFEXff(maximum_de_dcz,dZmin_ESPACE,dZmax_ESPACE) \ ,IFNE(maximum_de_dcz,FLOT__UNDEF) \ ) \ ) \ ) \ ) \ Bblock \ /* Le test relatif a 'FLOT__UNDEF' a ete introduit le 20040326134721, lors de la mise */ \ /* au point de 'v $xrs/Mobius3D.11$K' pour lequel les derivees ne sont pas calculees... */ \ Test(IL_FAUT(editer_les_extrema_s_ils_sont_hors_previsions)) \ Bblock \ PRINT_ATTENTION("les extrema des derivees ne sont pas inclus dans les valeurs predefinies"); \ CAL1(Prer3("minimum predefini(dx,dy,dz) = (%g,%g,%g)\n",dXmin_ESPACE,dYmin_ESPACE,dZmin_ESPACE)); \ /* Edition du minimum de {dx,dy,dz}, */ \ CAL1(Prer3("maximum predefini(dx,dy,dz) = (%g,%g,%g)\n",dXmax_ESPACE,dYmax_ESPACE,dZmax_ESPACE)); \ /* Edition du maximum de {dx,dy,dz}. */ \ \ CAL1(Prer3("minimum(dx,dy,dz) = (%g,%g,%g)\n",minimum_de_dcx,minimum_de_dcy,minimum_de_dcz)); \ /* Edition du minimum de {dx,dy,dz}, */ \ CAL1(Prer3("maximum(dx,dy,dz) = (%g,%g,%g)\n",maximum_de_dcx,maximum_de_dcy,maximum_de_dcz)); \ /* Edition du maximum de {dx,dy,dz}. */ \ /* */ \ /* ATTENTION, avant le 19990401122242 {minimum_de_dcx,minimum_de_dcy,minimum_de_dcz} et */ \ /* {maximum_de_dcx,maximum_de_dcy,maximum_de_dcz} etaient edites ci-apres en faisant ici : */ \ /* */ \ /* EGAL(editer_les_extrema,CAL1_____executer); */ \ /* */ \ /* mais cela presentait un grave defaut car cela faisait sortir ces valeurs via des */ \ /* 'Prin3(...)' et donc, lorsque le programme correspondant utilisait l'option : */ \ /* */ \ /* IL_FAUT(lister_la_liste_des_points) */ \ /* */ \ /* via : */ \ /* */ \ /* lister_les_points=VRAI */ \ /* */ \ /* ces extrema se retrouvaient dans la liste des points, ce qui peut etre genant... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(editer_les_extrema)) \ Bblock \ CAL2(Prin3("minimum(dx,dy,dz) = (%g,%g,%g)\n",minimum_de_dcx,minimum_de_dcy,minimum_de_dcz)); \ /* Edition du minimum de {dx,dy,dz}, */ \ CAL2(Prin3("maximum(dx,dy,dz) = (%g,%g,%g)\n",maximum_de_dcx,maximum_de_dcy,maximum_de_dcz)); \ /* Edition du maximum de {dx,dy,dz}. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition des extrema des derivees. */ #define EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES \ Bblock \ EDITION_DES_EXTREMA_DES_COORDONNEES; \ EDITION_DES_EXTREMA_DES_DERIVEES; \ Eblock \ /* Edition des extrema des coordonnees et des derivees. */