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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.