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