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