/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D ' U N " R U B A N D E M O B I U S " T R I D I M E N S I O N N E L : */
/* */
/* */
/* Author of '$xrs/Mobius3D.11$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20010525140949). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/* :Debut_listMN_RUBAN_DE_MOBIUS_TRIDIMENSIONNEL_11: */
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S T R O I S F O N C T I O N S ' F ' : */
/* */
/* */
/* Definition ('v $xrs/Mobius3D.11$K') : */
/* */
/* Le ruban de Mobius tridimensionnel est */
/* defini dans un espace reel a 4 dimensions */
/* (ou complexe a 2 dimensions {Z1,Z2}). Il est */
/* parametre a l'aide de 3 coordonnees {u,v,w} */
/* (en assimilant le ruban de Mobius tridimensionnel */
/* a un tore, la coordonnee 'v' decrit un grand cercle */
/* de ce tore). Posons : */
/* */
/* v v */
/* M(u,v,w) = u.cos(---) - w.sin(---) + tM */
/* d d */
/* */
/* v v */
/* N(u,v,w) = u.sin(---) + w.cos(---) + tN */
/* d d */
/* */
/* avec en general : */
/* */
/* d = +2 */
/* tM = -1 */
/* tN = 0 */
/* */
/* Le point courant {Z1,Z2} est alors defini par : */
/* */
/* i.v */
/* Z = M(u,v,w).e */
/* 1 */
/* */
/* v */
/* i.--- */
/* d */
/* Z = N(u,v,w).e */
/* 2 */
/* */
/* avec pour les parametres {u,v,w} : */
/* */
/* u E [ -p/8 , +p/8 ] */
/* */
/* v E [ -p , +p ] */
/* */
/* w E [ -p/8 , +p/8 ] */
/* */
/* (ou 'p' designe 'pi'). */
/* */
/* */
/*************************************************************************************************************************************/
/* :Fin_listMN_RUBAN_DE_MOBIUS_TRIDIMENSIONNEL_11: */
/*************************************************************************************************************************************/
/* */
/* */
/* Cette variete est donc a 4 dimensions, et la */
/* surface a 3 dimensions que l'on visualisera */
/* sera definie par : */
/* */
/* F (u,v,w) = A R(Z ) + A I(Z ) + A R(Z ) + A I(Z ) */
/* x xR1 1 xI1 1 xR2 2 xI2 2 */
/* */
/* F (u,v,w) = A R(Z ) + A I(Z ) + A R(Z ) + A I(Z ) */
/* y yR1 1 yI1 1 yR2 2 yI2 2 */
/* */
/* F (u,v,w) = A R(Z ) + A I(Z ) + A R(Z ) + A I(Z ) */
/* z zR1 1 zI1 1 zR2 2 zI2 2 */
/* */
/* (ou 'R(...)' et 'I(...)' designent respectivement */
/* les parties Reelle et Imaginaire). Une possible */
/* matrice 'A' sera : */
/* */
/* | 1 0 0 1 | */
/* | 0 1 0 1 | */
/* | 0 0 1 1 | */
/* */
/* Le 20040331085528 ont ete introduites les procedures */
/* de projection 'v $ximd/operator.1$FON PROJECTION_PARALLELE_01_4D_3D_'. */
/* */
/*************************************************************************************************************************************/
__________define(%%D%%z1%%F%%,z1_1)
__________define(%%D%%z2%%F%%,z2_1)
__________define(%%D%%coordonnee_u%%F%%,coordonnee_u_1)
__________define(%%D%%coordonnee_v%%F%%,coordonnee_v_1)
__________define(%%D%%coordonnee_w%%F%%,coordonnee_w_1)
__________define(%%D%%initialiser_les_coordonnees_u_v_w%%F%%,initialiser_les_coordonnees_u_v_w_1)
/* En vue d'interpolation de surfaces pour eviter des doubles definitions (introduit le */
/* 20040501115914). */
DEFV(Local,DEFV(complexe,z1));
DEFV(Local,DEFV(complexe,z2));
/* Definition des coordonnees {z1,z2} de la variete complexe a 2 dimensions. */
DEFV(Local,DEFV(Float,INIT(coordonnee_u,FLOT__UNDEF)));
DEFV(Local,DEFV(Float,INIT(coordonnee_v,FLOT__UNDEF)));
DEFV(Local,DEFV(Float,INIT(coordonnee_w,FLOT__UNDEF)));
/* Definition des coordonnees parametriques {u,v,w}. */
DEFV(Local,DEFV(Logical,INIT(initialiser_les_coordonnees_u_v_w,VRAI)));
/* Controle de l'initialisation des coordonnees parametriques {u,v,w}. */
#define GENERATION_DU_RUBAN_DE_MOBIUS_TRIDIMENSIONNEL_1(u,v,w) \
Bblock \
USs_GooF______CONDITIONNEL(activer__s_il_est_activable__et__si_utile__GooF_____compatibilite_20080124 \
,BLOC( \
Bblock \
/* Ceci a ete introduit le 20080125085911 sous cette forme... */ \
Test(IFOU(IL_FAUT(initialiser_les_coordonnees_u_v_w) \
,IFET(IL_NE_FAUT_PAS(initialiser_les_coordonnees_u_v_w) \
,I3OU(IFNE(u,coordonnee_u) \
,IFNE(v,coordonnee_v) \
,IFNE(w,coordonnee_w) \
) \
) \
) \
) \
Bblock \
DEFV(Float,INIT(fonction_M \
,LIN2(NEUT(u),COSX(DIVI(v,parametre_d)) \
,NEGA(w),SINX(DIVI(v,parametre_d)) \
,parametre_tM \
) \
) \
); \
/* Calcul de la fonction M(u,v,w). */ \
DEFV(Float,INIT(fonction_N \
,LIN2(NEUT(u),SINX(DIVI(v,parametre_d)) \
,NEUT(w),COSX(DIVI(v,parametre_d)) \
,parametre_tN \
) \
) \
); \
/* Calcul de la fonction N(u,v,w). */ \
\
EGAL(initialiser_les_coordonnees_u_v_w,FAUX); \
EGAL(coordonnee_u,u); \
EGAL(coordonnee_v,v); \
EGAL(coordonnee_w,w); \
/* Initialisation et optimisation du processus... */ \
\
Cinitialisation_polaire(z1,fonction_M,NEUT(v)); \
/* Calcul de : */ \
/* */ \
/* i.v */ \
/* z = M.e */ \
/* 1 */ \
/* */ \
Cinitialisation_polaire(z2,fonction_N,DIVI(v,parametre_d)); \
/* Calcul de : */ \
/* */ \
/* v */ \
/* i.--- */ \
/* d */ \
/* z = N.e */ \
/* 2 */ \
/* */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
) \
); \
Eblock \
/* Calcul sur la variete complexe a 2 dimensions. */
/* Avant le 20080125085911, il y avait ici : */
/* */
/* ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF */
/* */
/* ceci avait ete introduit le 20040423095730 dans le but de comprendre et resoudre le */
/* probleme decrit dans 'v $xiirs/$Fnota 20040330115702' et fut remplace le 20080125085911 */
/* par un 'USs_GooF______CONDITIONNEL(...)'. */
BFonctionV
DEFV(Local,DEFV(FonctionV,FMobius3D_1(u,v,w)))
DEFV(Argument,DEFV(Float,u));
DEFV(Argument,DEFV(Float,v));
DEFV(Argument,DEFV(Float,w));
/* Definition des coordonnees parametriques. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
GENERATION_DU_RUBAN_DE_MOBIUS_TRIDIMENSIONNEL_1(u,v,w);
/* Calcul, si besoin est, de {z1,z2}. */
RETU_VIDE;
/* Introduit le 20071130134947... */
Eblock
EFonctionV
#undef GENERATION_DU_RUBAN_DE_MOBIUS_TRIDIMENSIONNEL_1
BFonctionF
DEFV(Local,DEFV(FonctionF,FFx_Mobius3D_1(u,v,w)))
DEFV(Argument,DEFV(Float,u));
DEFV(Argument,DEFV(Float,v));
DEFV(Argument,DEFV(Float,w));
/* Definition des coordonnees parametriques. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
CALS(FMobius3D_1(u,v,w));
/* Calcul, si besoin est, de {z1,z2}. */
RETU(PROJECTION_PARALLELE_01_4D_3D_X(Reelle(z1)
,Imaginaire(z1)
,Reelle(z2)
,Imaginaire(z2)
)
);
/* Calcul de : */
/* */
/* F (u,v,w) = A R(Z ) + A I(Z ) + A R(Z ) + A I(Z ) */
/* x xR1 1 xI1 1 xR2 2 xI2 2 */
/* */
/* ATTENTION : on notera bien que 'Fx(u,v,w)' est la fonction projetee par l'operateur */
/* 'PROJECTION_PARALLELE_01_4D_3D_X(...)' et donc tridimensionnelle... */
Eblock
EFonctionF
BFonctionF
DEFV(Local,DEFV(FonctionF,FFy_Mobius3D_1(u,v,w)))
DEFV(Argument,DEFV(Float,u));
DEFV(Argument,DEFV(Float,v));
DEFV(Argument,DEFV(Float,w));
/* Definition des coordonnees parametriques. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
CALS(FMobius3D_1(u,v,w));
/* Calcul, si besoin est, de {z1,z2}. */
RETU(PROJECTION_PARALLELE_01_4D_3D_Y(Reelle(z1)
,Imaginaire(z1)
,Reelle(z2)
,Imaginaire(z2)
)
);
/* Calcul de : */
/* */
/* F (u,v,w) = A R(Z ) + A I(Z ) + A R(Z ) + A I(Z ) */
/* y yR1 1 yI1 1 yR2 2 yI2 2 */
/* */
/* ATTENTION : on notera bien que 'Fy(u,v,w)' est la fonction projetee par l'operateur */
/* 'PROJECTION_PARALLELE_01_4D_3D_Y(...)' et donc tridimensionnelle... */
Eblock
EFonctionF
BFonctionF
DEFV(Local,DEFV(FonctionF,FFz_Mobius3D_1(u,v,w)))
DEFV(Argument,DEFV(Float,u));
DEFV(Argument,DEFV(Float,v));
DEFV(Argument,DEFV(Float,w));
/* Definition des coordonnees parametriques. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
/*..............................................................................................................................*/
CALS(FMobius3D_1(u,v,w));
/* Calcul, si besoin est, de {z1,z2}. */
RETU(PROJECTION_PARALLELE_01_4D_3D_Z(Reelle(z1)
,Imaginaire(z1)
,Reelle(z2)
,Imaginaire(z2)
)
);
/* Calcul de : */
/* */
/* F (u,v,w) = A R(Z ) + A I(Z ) + A R(Z ) + A I(Z ) */
/* z zR1 1 zI1 1 zR2 2 zI2 2 */
/* */
/* ATTENTION : on notera bien que 'Fz(u,v,w)' est la fonction projetee par l'operateur */
/* 'PROJECTION_PARALLELE_01_4D_3D_Z(...)' et donc tridimensionnelle... */
Eblock
EFonctionF
/* ATTENTION : on notera bien que les trois fonctions 'F?_Mobius3D_1(u,v,w)' sont les */
/* fonctions projetees par les operateurs 'PROJECTION_PARALLELE_01_4D_3D_?(...)' et */
/* sont donc tridimensionnelles. Cela implique, par exemple, qu'une modification des */
/* parametres 'coefficient_de_projection_parallele_01_4D_3D_x?_?' modifie leur valeur */
/* et donc les valeurs des differentielles qui sont calculees eventuellement pour le */
/* coloriage dans 'v $xrs/volumes.12$I DERIVATION_PARTIELLE'. */
#define Fx_Mobius3D_1(u,v,w) \
FFx_Mobius3D_1(u,v,w) \
/* Definition de la fonction F (u,v,w). */ \
/* x */
#define Fy_Mobius3D_1(u,v,w) \
FFy_Mobius3D_1(u,v,w) \
/* Definition de la fonction F (u,v,w). */ \
/* y */
#define Fz_Mobius3D_1(u,v,w) \
FFz_Mobius3D_1(u,v,w) \
/* Definition de la fonction F (u,v,w). */ \
/* z */
/* ATTENTION : on notera bien que les trois fonctions 'F?_Mobius3D_1(u,v,w)' sont les */
/* fonctions projetees par les operateurs 'PROJECTION_PARALLELE_01_4D_3D_?(...)' et */
/* sont donc tridimensionnelles. Cela implique, par exemple, qu'une modification des */
/* parametres 'coefficient_de_projection_parallele_01_4D_3D_x?_?' modifie leur valeur */
/* et donc les valeurs des differentielles qui sont calculees eventuellement pour le */
/* coloriage dans 'v $xrs/volumes.12$I DERIVATION_PARTIELLE'. */
/* Avant le 20080125085911, il y avait ici : */
/* */
/* DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF */
/* */
/* ceci avait ete introduit le 20040423095730 dans le but de comprendre et resoudre le */
/* probleme decrit dans 'v $xiirs/$Fnota 20040330115702' et fut remplace le 20080125085911 */
/* par un 'USs_GooF______CONDITIONNEL(...)'. */
__________undefine(%%D%%initialiser_les_coordonnees_u_v_w%%F%%)
__________undefine(%%D%%coordonnee_w%%F%%)
__________undefine(%%D%%coordonnee_v%%F%%)
__________undefine(%%D%%coordonnee_u%%F%%)
__________undefine(%%D%%z2%%F%%)
__________undefine(%%D%%z1%%F%%)
/* En vue d'interpolation de surfaces pour eviter des doubles definitions (introduit le */
/* 20040501121719). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N I T I A L I S A T I O N S R E L A T I V E S A L A P S E U D O - P R O J E C T I O N : */
/* */
/*************************************************************************************************************************************/
#define Pxyz_Mobius3D_1 \
Bblock \
BLOC(VIDE;); \
Eblock \
/* Initialisations specifiques a ce volume destinees a permettre la reinjection des */ \
/* trois pseudo-projections {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} dans */ \
/* 'v $xrs/project3D.11$K' (introduit le 20050628085709)... */