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