/*************************************************************************************************************************************/ /* */ /* 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.31$I' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20040403112408). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /* :Debut_listMN_RUBAN_DE_MOBIUS_TRIDIMENSIONNEL_31: */ /*************************************************************************************************************************************/ /* */ /* 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.31$K') : */ /* */ /* Le ruban de Mobius tridimensionnel est */ /* defini dans un espace reel a 4 dimensions. 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). Le point courant {x1,x2,x3,x4} est alors */ /* defini par : */ /* */ /* v v */ /* x = R1.[u.cos(---) - w.sin(---)] */ /* 1 d d */ /* */ /* v v */ /* x = R2.[u.sin(---) + w.cos(---)] */ /* 2 d d */ /* */ /* x = R3.sin(v) */ /* 3 */ /* */ /* x = R4.cos(u) */ /* 4 */ /* */ /* avec en general : */ /* */ /* R1 = +2 */ /* R2 = +2 */ /* R3 = +1 */ /* R4 = +1 */ /* d = +4 */ /* */ /* 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_31: */ /*************************************************************************************************************************************/ /* */ /* */ /* 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 x1 + A x2 + A x3 + A x4 */ /* x xx1 xx2 xx3 xx4 */ /* */ /* F (u,v,w) = A x1 + A x2 + A x3 + A x4 */ /* y yx1 yx2 yx3 yx4 */ /* */ /* F (u,v,w) = A x1 + A x2 + A x3 + A x4 */ /* z zx1 zx2 zx3 zx4 */ /* */ /* 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_'. */ /* */ /*************************************************************************************************************************************/ __________pushdef(%%D%%x1%%F%%,x1_3) __________pushdef(%%D%%x2%%F%%,x2_3) __________pushdef(%%D%%x3%%F%%,x3_3) __________pushdef(%%D%%x4%%F%%,x4_3) __________pushdef(%%D%%coordonnee_u%%F%%,coordonnee_u_3) __________pushdef(%%D%%coordonnee_v%%F%%,coordonnee_v_3) __________pushdef(%%D%%coordonnee_w%%F%%,coordonnee_w_3) __________pushdef(%%D%%initialiser_les_coordonnees_u_v_w%%F%%,initialiser_les_coordonnees_u_v_w_3) /* En vue d'interpolation de surfaces pour eviter des doubles definitions (introduit le */ /* 20040501120144). */ DEFV(Local,DEFV(Float,x1)); DEFV(Local,DEFV(Float,x2)); DEFV(Local,DEFV(Float,x3)); DEFV(Local,DEFV(Float,x4)); /* Definition des coordonnees {x1,x2,x3,x4} de la variete reelle a 4 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_3(u,v,w) \ Bblock \ 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 \ 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... */ \ \ EGAL(x1,MUL2(parametre_R1,LIZ2(NEUT(u),COSX(DIVI(v,parametre_d)),NEGA(w),SINX(DIVI(v,parametre_d))))); \ EGAL(x2,MUL2(parametre_R2,LIZ2(NEUT(u),SINX(DIVI(v,parametre_d)),NEUT(w),COSX(DIVI(v,parametre_d))))); \ EGAL(x3,MUL2(parametre_R3,SINX(v))); \ EGAL(x4,MUL2(parametre_R4,COSX(u))); \ /* Pour des questions de qualite de la visualisation, sachant qu'il y a une projection */ \ /* 4D --> 3D qui vient tout compliquer, le 20040406110409, il y a eu la permutation */ \ /* suivante des quatre coordonnees : */ \ /* */ \ /* {x1,x2,x3,x4} --> {x4,x3,x1,x2} */ \ /* */ \ /* C'est aussi a cette date que furent introduits les parametres {R1,R2,R3,R4} destines */ \ /* a rendre l'objet plus homogene et plus symetrique.... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Calcul sur la variete reelle a 4 dimensions. */ BFonctionV DEFV(Local,DEFV(FonctionV,FMobius3D_3(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_3(u,v,w); /* Calcul, si besoin est, de {z1,z2}. */ RETU_VIDE; /* Introduit le 20071130135044... */ Eblock EFonctionV #undef GENERATION_DU_RUBAN_DE_MOBIUS_TRIDIMENSIONNEL_3 BFonctionF DEFV(Local,DEFV(FonctionF,FFx_Mobius3D_3(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_3(u,v,w)); /* Calcul, si besoin est, de {x1,x2,x3,x4}. */ RETU(PROJECTION_PARALLELE_01_4D_3D_X(x1,x2,x3,x4)); /* Calcul de : */ /* */ /* F (u,v,w) = A x1 + A x2 + A x3 + A x4 */ /* x xx1 xx2 xx3 xx4 */ /* */ /* 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_3(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_3(u,v,w)); /* Calcul, si besoin est, de {x1,x2,x3,x4}. */ RETU(PROJECTION_PARALLELE_01_4D_3D_Y(x1,x2,x3,x4)); /* Calcul de : */ /* */ /* F (u,v,w) = A x1 + A x2 + A x3 + A x4 */ /* y yx1 yx2 yx3 yx4 */ /* */ /* 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_3(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_3(u,v,w)); /* Calcul, si besoin est, de {x1,x2,x3,x4}. */ RETU(PROJECTION_PARALLELE_01_4D_3D_Z(x1,x2,x3,x4)); /* Calcul de : */ /* */ /* F (u,v,w) = A x1 + A x2 + A x3 + A x4 */ /* z zx1 zx2 zx3 zx4 */ /* */ /* 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_3(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_3(u,v,w) \ FFx_Mobius3D_3(u,v,w) \ /* Definition de la fonction F (u,v,w). */ \ /* x */ #define Fy_Mobius3D_3(u,v,w) \ FFy_Mobius3D_3(u,v,w) \ /* Definition de la fonction F (u,v,w). */ \ /* y */ #define Fz_Mobius3D_3(u,v,w) \ FFz_Mobius3D_3(u,v,w) \ /* Definition de la fonction F (u,v,w). */ \ /* z */ /* ATTENTION : on notera bien que les trois fonctions 'F?_Mobius3D_3(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'. */ __________popdef(%%D%%initialiser_les_coordonnees_u_v_w%%F%%) __________popdef(%%D%%coordonnee_w%%F%%) __________popdef(%%D%%coordonnee_v%%F%%) __________popdef(%%D%%coordonnee_u%%F%%) __________popdef(%%D%%x4%%F%%) __________popdef(%%D%%x3%%F%%) __________popdef(%%D%%x2%%F%%) __________popdef(%%D%%x1%%F%%) /* En vue d'interpolation de surfaces pour eviter des doubles definitions (introduit le */ /* 20040501121510). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_3 \ 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 20050628090002)... */