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