/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   R E L A T I V E S   A   L A   D E R I V A T I O N   F O R M E L L E                                */
/*        D ' U N   P S E U D O - T O R E   A   D E U X   T R O U S  :                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrs/huit.11$I' :                                                                                               */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 20161202100124).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* Le 20161209103742, afin de mettre a jour 'v $ximd/DerivFormel.1$DEF' systematiquement,    */
                                        /* j'ai essaye de mettre ici :                                                               */
                                        /*                                                                                           */
                                        /*                  #system   "$xi/DerivFormel$Z"                                            */
                                        /*                                                                                           */
                                        /* ou encore :                                                                               */
                                        /*                                                                                           */
                                        /*                  -system   "$xi/DerivFormel$Z"                                            */
                                        /*                                                                                           */
                                        /* mais cela ne peut marcher aussi simplement car, en effet, les sorties de ce $Z' se        */
                                        /* retrouvent dans le fichier '$c' que l'on genere. De plus, on ne peut pas non plus         */
                                        /* supprimer ces dernieres car, en effet, on a besoin de les voir au cas ou...               */
                                        /*                                                                                           */
                                        /* Le 20161209153738 la solution 'v $xrs/huit.11$K 20161209153632' a ete implementee...      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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/huit.11$K') :                                                                                          */
/*                                                                                                                                   */
/*                    Le pseudo-tore a deux trous est defini parametriquement                                                        */
/*                  en fonction des deux parametres 'u'                                                                              */
/*                  (appele aussi 'distance polaire' ou                                                                              */
/*                  'theta' ou encore 'latitude') et 'v'                                                                             */
/*                  (appele aussi 'longitude' ou 'phi') :                                                                            */
/*                                                                                                                                   */
/*                                      Choix(u,v) = +1     si v < M.(4.pi/D)                                                        */
/*                                                 = -1     sinon                                                                    */
/*                                                                                                                                   */
/*                                                                   __________                                                      */
/*                                                                  / A+cos(v)                                                       */
/*                                      XPlan(u,v) = R.Choix(u,v).\/ ----------                                                      */
/*                                                                       B                                                           */
/*                                                                                                                                   */
/*                                                      sin(v)                                                                       */
/*                                      YPlan(u,v) = R.--------                                                                      */
/*                                                       C                                                                           */
/*                                                                              Definition d'une courbe plane en forme de "8".       */
/*                                                                                                                                   */
/*                                      dXPlan(u,v) = d#XPlan(u,v)                                                                   */
/*                                      dYPlan(u,v) = d#YPlan(u,v)                                                                   */
/*                                                                              La tangente T est donc {+dXPlan(u,v),+dYPlan(u,v).   */
/*                                                                                                                                   */
/*                                      Psi(u,v) = arctg(-dXPlan(u,v),+dYPlan(u,v))                                                  */
/*                                                                              La normale N est orthogonale a la tangente T         */
/*                                                                              et est donc {+dYPlan(u,v),-dXPlan(u,v)}.             */
/*                                                                                                                                   */
/*                                      Xellipse(u,v) = Ra.cos(u)                                                                    */
/*                                      Yellipse(u,v) = 0                                                                            */
/*                                      Zellipse(u,v) = Rb.sin(u)                                                                    */
/*                                                                              Definition d'une ellipse dans le plan {OX,OZ}.       */
/*                                                                                                                                   */
/*                                      F (u,v) = [Xellipse(u,v)*cos(psi)] - [Yellipse(u,v)*sin(psi)] + XPlan(u,v)                   */
/*                                       x                                                                                           */
/*                                                                                                                                   */
/*                                      F (u,v) = [Xellipse(u,v)*sin(psi)] + [Yellipse(u,v)*cos(psi)] + YPlan(u,v)                   */
/*                                       y                                                                                           */
/*                                                                                                                                   */
/*                                      F (u,v) = Zellipse(u,v)                                                                      */
/*                                       z                                                                                           */
/*                                                                              Definition d'une ellipse dont le centre est le point */
/*                                                                              courant {XPlan(u,v),YPlan(u,v),0} et situee dans le  */
/*                                                                              plan {N,OZ}.                                         */
/*                                                                                                                                   */
/*                  et (parametres par defaut) :                                                                                     */
/*                                                                                                                                   */
/*                                      M=1                                                                                          */
/*                                      D=2                                                                                          */
/*                                      R=1                                                                                          */
/*                                      A=1                                                                                          */
/*                                      B=2                                                                                          */
/*                                      C=2                                                                                          */
/*                                                                                                                                   */
/*                  avec :                                                                                                           */
/*                                                                                                                                   */
/*                                      u E [ 0 , 2.p ]                                                                              */
/*                                                                                                                                   */
/*                                      v E [ 0 , 4.p ]                                                                              */
/*                                                                                                                                   */
/*                  (ou 'p' designe 'pi').                                                                                           */
/*                                                                                                                                   */
/*                    A cause de la derivee 'd#XPlan(u,v)' qui                                                                       */
/*                  fait descendre 'A+cos(v)' en denominateur,                                                                       */
/*                  il est imperatif que :                                                                                           */
/*                                                                                                                                   */
/*                                      A+cos(v) # 0                                                                                 */
/*                                                                                                                                   */
/*                  Si par malheur :                                                                                                 */
/*                                                                                                                                   */
/*                                      A+cos(v) = 0                                                                                 */
/*                                                                                                                                   */
/*                  il convient d'ajouter un 'epsilon' a 'v'                                                                         */
/*                  afin de supprimer cette nullite, d'ou la                                                                         */
/*                  fonction 'v_corrige(v)' qui remplacera 'v'                                                                       */
/*                  dans les definitions de 'Fx(u,v)' et de                                                                          */
/*                  'Fy(u,v)'.                                                                                                       */
/*                                                                                                                                   */
/*                    Ainsi, la coordonnee 'u' decrit la petite                                                                      */
/*                  ellipse (de "rayons" 'Ra' et 'Rb') et 'v'                                                                        */
/*                  decrit la courbe en forme de '8'.                                                                                */
/*                                                                                                                                   */
/*                    Tout ceci est tres inspire de 'v $xtc/huit.03$c'                                                               */
/*                  en faisant :                                                                                                     */
/*                                                                                                                                   */
/*                                      u = phi   E [0,2.p]                                                                          */
/*                                      v = theta E [0,4.p]                                                                          */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION, il est imperatif que les fonctions derivables formellement soient definies     */
                                        /* dans un fichier a part afin qu'elles ne soient pas l'objet d'une double definition. En    */
                                        /* effet, on trouve dans 'v $xcc/cpp$Z' :                                                    */
                                        /*                                                                                           */
                                        /*                  $CA  $module$w                                                           */
                                        /*                                 | $xcp/cpp$X          ... -c$PASSE_D -e$PASSE_5           */
                                        /*                                                                              > $fichierR  */
                                        /*                                                                                           */
                                        /* Ainsi, si par exemple la definition de 'Fx(u,v)' etait faite localement dans le           */
                                        /* fichier '$xrf/recursif.11$K', cette definition apparaitrait deux fois dans le fichier     */
                                        /* '$module$w' : une premiere fois en tete, provenant de '$PASSE_D' ou l'on ne trouve que    */
                                        /* les definitions du type '-define ...', puis une deuxieme fois a la suite, la ou se trouve */
                                        /* concatene au fichier '$module$W' des '-define ...' le fichier '$fichierA' a compiler...   */

#define   gChoix(u,v)                                                                                                                   \
                    COND(IFLT(MODF(v,minimum_de_v,maximum_de_v),SCAL(maximum_de_v,parametre_D,parametre_M))                             \
                        ,NEUT(FU)                                                                                                       \
                        ,NEGA(FU)                                                                                                       \
                         )
#define   gd_Choix(u,v)                                                                                                                 \
                    d_FCONSTANTES
                                        /* Il s'agit de '#define's et non pas de '-define's afin de ne pas deriver ces expressions.  */
                                        /*                                                                                           */
                                        /* ATTENTION : c'est bien 'd_FCONSTANTES' et non pas 'd_FVARIABLES_DE_DERIVATION'...         */

BFonctionF

DEFV(Local,DEFV(FonctionF,Choix(u,v)))
                                        /* Introduit sous forme de fonction et non pas de 'define' afin de garantir une compilation  */
                                        /* sans probleme...                                                                          */
DEFV(Argument,DEFV(Float,u));
DEFV(Argument,DEFV(Float,v));
                                        /* Definition des coordonnees parametriques.                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(gChoix(u,v));
     Eblock

EFonctionF

BFonctionF

DEFV(Local,DEFV(FonctionF,d_Choix(u,v)))
                                        /* Introduit sous forme de fonction et non pas de 'define' afin de garantir une compilation  */
                                        /* sans probleme...                                                                          */
DEFV(Argument,DEFV(Float,u));
DEFV(Argument,DEFV(Float,v));
                                        /* Definition des coordonnees parametriques.                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(gd_Choix(u,v));
     Eblock

EFonctionF

#define   v_corrige(v)                                                                                                                  \
                    COND(IFGT(ADD2(parametre_A,COSX(v)),igEPSILON),v,SOUS(v,igEPSILON))
#define   d_v_corrige(v)                                                                                                                \
                    d_FVARIABLES_DE_DERIVATION
                                        /* Il s'agit de '#define's et non pas de '-define's afin de ne pas deriver ces expressions.  */

#include  xrs/huit.11.1.I"
                                        /* Definition de l'equation de la courbe en "8" dans le plan {OX,OY} :                       */
                                        /*                                                                                           */
                                        /*                                 /\            /\                                          */
                                        /*                                /  \          /  \                                         */
                                        /*                               /    \        /    \                                        */
                                        /*                              /      \      /      \                                       */
                                        /*                             /  --->  \    /  <---  \                                      */
                                        /*                  u = 2.p   /       |  \  /  |       \  u = 0                              */
                                        /*                           /        |   \/   |        \                                    */
                                        /*                           \        |   /\   |        /                                    */
                                        /*                  u = 4.p   \       |  /  \  |       /  u = 2.p                            */
                                        /*                             \  <---  /    \  --->  /                                      */
                                        /*                              \      /      \      /                                       */
                                        /*                               \    /        \    /                                        */
                                        /*                                \  /          \  /                                         */
                                        /*                                 \/            \/                                          */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Le parametrage en {u,v} vient de l'equation cartesienne du '8' dans le plan :             */
                                        /*                                                                                           */
                                        /*                   2    2       2                                                          */
                                        /*                  y  = x .(1 - x )                                                         */
                                        /*                                                                                           */
                                        /* En faisant le changement de variable :                                                    */
                                        /*                                                                                           */
                                        /*                   2                                                                       */
                                        /*                  x  = z + 1/2                                                             */
                                        /*                                                                                           */
                                        /* on obtient l'equation :                                                                   */
                                        /*                                                                                           */
                                        /*                   2   2                                                                   */
                                        /*                  y + z  = 1/4                                                             */
                                        /*                                                                                           */
                                        /* qui est donc l'equation d'un cercle que l'on peut parametrer en {rho=1/2,theta=v}, d'ou   */
                                        /* le parametrage ci-dessus en revenant a {x,y}...                                           */
                                        /*                                                                                           */
                                        /* On notera que les definitions de 'XPlan(u,v)' et de 'YPlan(u,v)' sont faites dans un      */
                                        /* fichier a part ('v $xrs/huit.11.1$I') afin que leurs derivees puissent etre pre-calculees */
                                        /* grace a 'v $xi/DerivFormel$Z' via 'v $xcp/DerivFormel$I xrs.huit.11.1.I'. En effet, il    */
                                        /* est essentiel que ces derivees 'd1_XPlan_xrs_huit_11(u,v)' et 'd1_YPlan_xrs_huit_11(u,v)' */
                                        /* soient elles-memes derivables a cause de l'usage qui en sera fait pour colorier la        */
                                        /* surface ('v $xrs/huit.11$K VISUALISATION_DE_LA_SURFACE_AVEC_DIFFERENTIATION') qui         */
                                        /* demande des derivations ('v $xrs/surfaces.12$I EGAL.differentielle_x.dFxyz.d#Fx.')...     */
                                        /*                                                                                           */
                                        /* Le 20161208095831, afin d'etre homogene avec le nom de leurs derivees, 'XPlan(u,v)' et    */
                                        /* 'YPlan(u,v)' ont ete rebaptises 'XPlan_xrs_huit_11(u,v)' et 'YPlan_xrs_huit_11(u,v)'      */
                                        /* respectivement...                                                                         */

#define   Psi(u,v)                                                                                                                      \
                    ATAN(NEGA(d1_XPlan_xrs_huit_11(u,v_corrige(v))),NEUT(d1_YPlan_xrs_huit_11(u,v_corrige(v))))
#define   d_Psi(u,v)                                                                                                                    \
                    d_FCONSTANTES
                                        /* Definition de la rotation faisant passer de l'axe 'OX' a la normale N (qui correspond     */
                                        /* a 'T' {d1_X,d1_Y} tourne de 'pi/2', soit une multiplication par '+i').                    */
                                        /*                                                                                           */
                                        /* La notation 'Psi' est compatible avec celles de 'v $ximD/definit.1$DEF 20161201123529'... */
                                        /*                                                                                           */
                                        /* C'est la presence de derivees dans la definition de 'Psi(u,v) qui empeche l'usage         */
                                        /* de 'VISUALISATION_DE_LA_SURFACE_AVEC_DIFFERENTIATION(...)' v)'. Ceci fut decouvert        */
                                        /* difficilement le 20161205165813. Une solution pourrait etre de faire appel a une          */
                                        /* pre-generation via 'v $xi/DerivFormel$Z'. Cela fut resolu dans les jours suivants         */
                                        /* (le 20161208085255...).                                                                   */
                                        /*                                                                                           */
                                        /* Le remplacement de 'v' par 'v_corrige(v)' est destine a empecher l'annulation de          */
                                        /* 'd1_XPlan_xrs_huit_11(u,v)' qui est un denominateur dans la definition de 'ATAN(...)'.    */
                                        /*                                                                                           */
                                        /* On notera que 'Psi(u,v)' n'est pas derivable ('#define' et non pas '-define') car,        */
                                        /* effet, elle est en quelque sorte une constante locale au point {u,v}.                     */

#include  xrs/referentiel2D.11.I"
                                        /* Definition d'une ellipse dans le plan {OX,OZ} que l'on va ensuite amener dans le plan     */
                                        /* {N,OZ} par une rotation de 'Psi' ci-apres :                                               */

-define   Fx_Huit_1(u,v)                                                                                                                \
-_-_-_-             LIN2(Xellipse(u,v),NEUT(COSX(Psi(u,v)))                                                                             \
-_-_-_-                 ,Yellipse(u,v),NEGA(SINX(Psi(u,v)))                                                                             \
-_-_-_-                 ,XPlan_xrs_huit_11(u,v_corrige(v))                                                                              \
-_-_-_-                  )
                                        /* Definition de la fonction F (u,v).                                                        */
                                        /*                            x                                                              */
                                        /*                                                                                           */
                                        /* Le remplacement de 'v' par 'v_corrige(v)' est destine a empecher l'annulation d'un        */
                                        /* denominateur dans la derivee de 'Fx_Huit_1(u,v)'...                                       */
-define   Fy_Huit_1(u,v)                                                                                                                \
-_-_-_-             LIN2(Xellipse(u,v),NEUT(SINX(Psi(u,v)))                                                                             \
-_-_-_-                 ,Yellipse(u,v),NEUT(COSX(Psi(u,v)))                                                                             \
-_-_-_-                 ,YPlan_xrs_huit_11(u,v_corrige(v))                                                                              \
-_-_-_-                  )
                                        /* Definition de la fonction F (u,v).                                                        */
                                        /*                            y                                                              */
                                        /*                                                                                           */
                                        /* Le remplacement de 'v' par 'v_corrige(v)' est fait par "symetrie" avec ce qui est         */
                                        /* fait dans 'Fx_Huit_1(u,v)'...                                                             */
-define   Fz_Huit_1(u,v)                                                                                                                \
-_-_-_-             Zellipse(u,v)
                                        /* Definition de la fonction F (u,v).                                                        */
                                        /*                            z                                                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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_Huit_1                                                                                                                   \
-_-_-_-             Bblock                                                                                                              \
-_-_-_-             BLOC(VIDE;);                                                                                                        \
-_-_-_-             Eblock
                                        /* Initialisations specifiques a cette surface destinees a permettre la reinjection des      */
                                        /* trois pseudo-projections {Projection_de_Fx,Projection_de_Fy,Projection_de_Fz} dans        */
                                        /* 'v $xrs/project2D.11$K'.                                                                  */



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.