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