samedi 27 septembre 2014

Images vues dans une pyramide de verre

C'est, en quelque sorte, la suite de :
http://pstricks.blogspot.fr/2014/09/image-vue-travers-un-prisme.html

La base de la pyramide est un triangle équilatéral. Une arête a été supprimée et sur le plan ainsi créé l'artisan verrier a gravé une face de la tour Eiffel(ou plutôt ce qui y ressemble).


En regardant à travers la face opposé on voit une tour Eiffel en 3D dans une fausse perspective. L'artiste a habilement utilisé la réflexion totale sur les 2 autres faces pour créer par un effet de double miroir une image en 3D dont l'aspect est très réussi.
Je n'ai pas réalisé de simulation avec POV-Ray ni avec PSTricks, car la difficulté de ces deux projets me fait beaucoup hésiter. Si l'un d'entre-vous, amis lecteurs, se lance dans l'une ou l'autre des réalisations, faites moi signe...

mercredi 24 septembre 2014

Image vue à travers un prisme

On place un prisme droit de verre dont la base est un triangle équilatéral sur une surface plane et on dirige son regard vers l’une des faces (1), bien dans l’axe de symétrie.
On écrit un texte sur une feuille transparente ou blanche et on colle ce texte sur l’une des 2 autres faces verticales.


Voici le texte dans la bonne position avant de le fixer sur le prisme, le cadre blanc est très exactement aux dimensions de la face notée(2).


Le prisme étant positionné, on s’aperçoit que le texte n’est plus visible, mais qu’une image du texte écrit de droite à gauche est visible de l’autre côté. On ne voit, en réalité qu’une partie du texte si celui est trop long.

Cette image est la symétrique du texte par rapport à la troisième face(3). La partie visible est limitée au cadre de la face (1). La base étant un triangle équilatéral, l’image se trouve dans un plan parallèle à la face (1).

L’objet(le texte) est représenté par un flèche en bleu. (BC) est la face (1), (AC) et (AB) respectivement les faces (2) et (3).
Soit n l’indice du verre. L’angle limite λ est donné par la relation :
Pour n = 1.5, λ =42o. Aucun rayon réfracté par la face (2) ne peut ressortir perpendiculairement à la face (1), car le rayon réfracté par la face (2) ferait un angle de réfraction à l’angle limite. En conséquence l’observateur placé devant la face (1) ne peut pas voir le texte placé devant la face (2).
Pour qu’un rayon ressorte perpendiculairement à la face (1) en direction de l’observateur, il doit subir une réflexion sur la face (3). On voit que l’angle de réflexion vaut 60o, supérieur à l’angle limite : il y a donc réflexion totale. Ces rayons qui sont totalement réfléchis par la face (3) proviennent de la face (2) perpendiculairement à celle-ci. La face (3) se comportant comme un miroir, l’observateur voit donc l’image du texte dans ce miroir, elle est symétrique du texte part rapport à la face (3).

POV-Ray possède aussi des grandes capacités pour les simulations de phénomènes optiques, on peut donc l’utiliser pour illustrer ce phénomène. Voici 2 exemples :

Dans le deuxième exemple, on fait varier l'indice de réfraction de 1 à 1.5 et inversement.


Tous les fichiers sont dans ce répertoire :

Remarque : d’autres exemples avaient déjà été traités en parallèle avec PSTricks comme :
http://pstricks.blogspot.fr/2011/12/le-pentaprisme-etude-optique-et.html
http://pstricks.blogspot.fr/2011/12/dispersion-par-un-prisme-simulation.html
http://melusine.eu.org/syracuse/pstricks/pc/pst-prisme/
http://melusine.eu.org/syracuse/pstricks/pst-caustic/

lundi 15 septembre 2014

Ballet de pendules(pendulum waves) en 3D avec l'ombre des pendules


 Les fichiers :
Pendulum-Waves

% Le listing :

\documentclass[10]{article}
\usepackage{pst-solides3d}
\usepackage{animate}
\def\macrosPSPendulumWaves{
    /TabLongueursPendules [
         0 1 np 1 sub {/indicePendule exch def
         gp Gamma 2 Pi mul N0 indicePendule add mul div dup mul mul
         } for
         ] def
         /y0 0.02 def
/asin {neg dup dup mul neg 1 add sqrt neg atan 180 sub} bind def
    /TabAlpha0 [
    0 1 np 1 sub {/iP exch def
        y0 TabLongueursPendules iP get div asin
        } for
    ] def
    /TabZPendules [
    0 1 np 1 sub {/iP exch def
        TabLongueursPendules iP get
        TabAlpha0 iP get cos mul
        } for
    ] def
%    /ti 5 def
    /TabAlphan {[
     0 1 np 1 sub {/iP exch def
        /Alpha TabAlpha0 iP get def
        /Omega 360 Gamma N0 iP add div div def
         Alpha Omega ti mul cos mul
        } for
    ] }def }%
\makeatletter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% la macro \psRotIIID
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotation autour d'un axe
%\define@key[psset]{pst-solides3d}{angle}{\def\psk@solides@angle{#1 }}% rotation autour de l'axe en degres
%#1 = angle de rotation
%\psRotIIID[solid=...]{angle}(x,y,z)
% (x,y,z) sont les coordonnées du solide comme pour \psSolid[..](x,y,z)
% les coordonnées du vecteur axe sont données par les coordonnées de
% 2 points avec l'option :
% base=x1 y1 z1 x2 y2 z2\def\psRotIIID{\pst@object{psRotIIID}}
\def\psRotIIID@i#1(#2,#3,#4){{%
  \pst@killglue%
  \use@par%
\addto@pscode{
    \tx@optionssolides
    SolidesDict begin
    /cosT {#1 cos} bind def
    /sinT {#1 sin} bind def
     base aload pop
       /f_ exch def
       /e_ exch def
       /d_ exch def
       /c_ exch def
       /b_ exch def
       /a_ exch def
       /u' {d_ a_ sub } bind def
       /v' {e_ b_ sub } bind def
       /w' {f_ c_ sub } bind def
       u' v' w' unitaire3d
       /w_ exch def /v_ exch def /u_ exch def
% end} def
/Rotation3D {
4 dict begin
   /M defpoint3d % on récupère les coordonnées
   M /z exch def
     /y exch def
     /x exch def
%   AXE
   a_ v_ dup mul w_ dup mul add mul
   u_
   b_ v_ mul c_ w_ mul add u_ x mul sub v_ y mul sub w_ z mul sub
   mul
   sub
   1 cosT sub mul
   x cosT mul add
   c_ v_ mul neg b_ w_ mul add w_ y mul sub v_ z mul add sinT mul add % x'
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   b_ u_ dup mul w_ dup mul add mul
   v_
   a_ u_ mul c_ w_ mul add u_ x mul sub v_ y mul sub w_ z mul sub
   mul
   sub
   1 cosT sub mul
   y cosT mul add
   c_ u_ mul a_ w_ mul sub w_ x mul add u_ z mul sub sinT mul add  % y'
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   c_ u_ dup mul v_ dup mul add mul
   w_
   a_ u_ mul b_ v_ mul add u_ x mul sub v_ y mul sub w_ z mul sub
   mul
   sub
   1 cosT sub mul
   z cosT mul add
   b_ u_ mul neg a_ v_ mul add v_ x mul sub u_ y mul add sinT mul add %z'
end} def
    end}%
\psSolid[transform=Rotation3D](#2,#3,#4)
\composeSolid%
}\ignorespaces%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% transformation d'un point
\def\psRotIIIDPoint{\pst@object{psRotIIIDPoint}}
\def\psRotIIIDPoint@i#1(#2,#3,#4)#5{{% coordonnees cartesiennes
  \pst@killglue%
  \use@par%
\pnode(!
    \tx@optionssolides
    SolidesDict begin
    /cosT {#1 cos} bind def
    /sinT {#1 sin} bind def
     base aload pop
       /f_ exch def
       /e_ exch def
       /d_ exch def
       /c_ exch def
       /b_ exch def
       /a_ exch def
       /u' {d_ a_ sub } bind def
       /v' {e_ b_ sub } bind def
       /w' {f_ c_ sub } bind def
       u' v' w' unitaire3d
       /w_ exch def /v_ exch def /u_ exch def
    #2 #3 #4
     /z_ exch def
     /y_ exch def
     /x_ exch def
   a_ v_ dup mul w_ dup mul add mul
   u_
   b_ v_ mul c_ w_ mul add u_ x_ mul sub v_ y_ mul sub w_ z_ mul sub
   mul
   sub
   1 cosT sub mul
   x_ cosT mul add
   c_ v_ mul neg b_ w_ mul add w_ y_ mul sub v_ z_ mul add sinT mul add % x'
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   b_ u_ dup mul w_ dup mul add mul
   v_
   a_ u_ mul c_ w_ mul add u_ x_ mul sub v_ y_ mul sub w_ z_ mul sub
   mul
   sub
   1 cosT sub mul
   y_ cosT mul add
   c_ u_ mul a_ w_ mul sub w_ x_ mul add u_ z_ mul sub sinT mul add  % y'
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   c_ u_ dup mul v_ dup mul add mul
   w_
   a_ u_ mul b_ v_ mul add u_ x_ mul sub v_ y_ mul sub w_ z_ mul sub
   mul
   sub
   1 cosT sub mul
   z_ cosT mul add
   b_ u_ mul neg a_ v_ mul add v_ x_ mul sub u_ y_ mul add sinT mul add %z'
   3dto2d cm_1 exch cm_1 exch
   end){#5}%
  }\ignorespaces}
\makeatother
% 15 septembre 2014
\begin{document}

\begin{center}
\def\nImages{201}%  images
\def\base{10 0 0 0 0 0 }%
\begin{animateinline}[controls,loop,%palindrome,
                     begin={\begin{pspicture}(-3,-8)(5,3)},%
                     end={\end{pspicture}}]{5}% 5 images/s
\multiframe{\nImages}{r=0.0+0.035}{%
\psset{viewpoint=25 200 20 rtp2xyz,lightsrc=75 150 20 rtp2xyz,Decran=12.5,unit=1}
\psframe*(-3,-8)(5,3)%
\psPolygonIIID[fillstyle=solid](19,-5,-15)(18,5,0)(18,5,0)(0,5,0)(-1,5,-15)(-1,-5,-15)
\psPolygonIIID[fillstyle=solid,fillcolor=yellow!20](19,-5,-15)(19,5,-15)(19,5,0)(19,-5,0)
\psPolygonIIID[fillstyle=solid,fillcolor=yellow!20](19,5,-15)(-1,5,-15)(-1,5,0)(19,5,0)
\psSolid[object=grille,base=-1 19 -5 5,ngrid=10](0,0,-15)%
\pstVerb{/ti \r\space def
            /Gamma 7 def
            /N0 10 def % nombre d'oscillations de n=0
            /np 10 def % nombre de pendules
            /gp 9.81 def % pesanteur
            /Pi 3.14159265359 def
            /di 2 def % distance entre 2 pendules en cm
            \macrosPSPendulumWaves
            /Lx {gp Gamma 2 Pi mul N0 t di div add mul div dup mul mul} def
            /alpha0 {y0 Lx div asin} def
            /Omega0 {360 Gamma N0 t di div add div div} def
            /alphax {alpha0 Omega0 ti mul cos mul} def%
            /Hh 0 def /Hs 1 def /Hb 1 def /color {Hh Hs Hb} def /dH 1 np div def}%
%\defFunction{Waves}(t){t}{Lx alphax sin mul 100 mul}{Lx alphax cos mul 100 mul neg}%{-15}%
%\psSolid[object=courbe,
%        r=0,
%        range=0 18,
%        linecolor=gray,
%        resolution=360,
%        function=Waves]%
\psset{solidmemory}%
\multido{\i=9+-1}{10}{%
\definecolor[ps]{macouleur}{hsb}{color}%
\pstVerb{
    /Ln TabLongueursPendules \i\space get 100 mul def
    /ANGLE TabAlphan \i\space get neg def
    }%
\psPoint(\i\space di mul,0,0){O}
\psRotIIIDPoint[base=\base,
    ]{ANGLE}(\i\space di mul,0,Ln neg){P}
\psline(O)(P)%\psdot(P)
\psRotIIID[object=sphere,r=0.9,ngrid=9 18,linewidth=0.01,
    name=A,
    fillcolor=macouleur,
    base=\base,
    ]{ANGLE}(\i\space di mul,0,Ln neg)
\pstVerb{/Hh Hh dH add def}%
\psSolid[object=plan,
   definition=equation,
   args={[0 0 1 15] 0},
   action=none,
   name=monplan]
   \psProjection[object=cercle,
    plan=monplan,
    args=\i\space di mul Ln ANGLE neg sin mul .9,linecolor=darkgray,fillcolor=darkgray,linewidth=0.01,fillstyle=solid,opacity=0.6,
    range=0 360]\composeSolid}%
\psLineIIID(-1,5,0)(-1,-5,0)(19,-5,0)
\psLineIIID(-1,-5,0)(-1,-5,-15)
\psLineIIID[linecolor=black,linewidth=0.1](-1,0,0)(19,0,0)%
    }%
\end{animateinline}
\end{center}

\end{document}

Rappel : quelques explications du phénomène et une référence avaient déjà été données dans un précédent article, elles sont dans le document "pspendulumwave-version-couleur.pdf" dans le répertoire :



dimanche 14 septembre 2014

Ballet de pendules - Pendulum waves - 3D

Une version en 3D avec pst-solides3d.

Les fichiers :

Avec un point de vue légèrement différent : viewpoint=75 200 20 rtp2xyz


Un autre point de vue :
\psset{viewpoint=20 200 20 rtp2xyz,lightsrc=75 200 20 rtp2xyz,Decran=10,unit=1}

Rappel : quelques explications du phénomène et une référence avaient déjà été données dans un précédent article, elles sont dans le document :

lundi 8 septembre 2014

Ballet de pendules : l'animation seulement

Le listing du fichier source :

\documentclass[11pt]{article}
 \usepackage[a4paper,margin=2cm]{geometry}
\usepackage[latin1]{inputenc}%
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{animate}
\usepackage{pst-plot,pst-node,pst-tools}
\title{Ballet de pendules}
\date{08 septembre 2014}
\newcommand\Bille{
\pscircle[fillstyle=solid,linewidth=1.5\pslinewidth,fillcolor=macouleur](0,0){0.75}
\psarc(0,0){0.6}{-110}{90}
\psarc(0,0){0.45}{-90}{70}
\psarc(0,0){0.3}{-70}{60}}%
\newcommand\Pendule{
\psline(C)
\rput{!TabAlphan \i\space get}(C){\Bille}}%
\psset{dimen=middle}
\def\macrosPSPendulumWaves{
    /TabLongueursPendules [
         0 1 np 1 sub {/indicePendule exch def
         gp Gamma 2 Pi mul N0 indicePendule add mul div dup mul mul
         } for
         ] def
         /y0 0.03 def
/asin {neg dup dup mul neg 1 add sqrt neg atan 180 sub} bind def
    /TabAlpha0 [
    0 1 np 1 sub {/iP exch def
        y0 TabLongueursPendules iP get div asin
        } for
    ] def
    /TabZPendules [
    0 1 np 1 sub {/iP exch def
        TabLongueursPendules iP get
        TabAlpha0 iP get cos mul
        } for
    ] def
%    /ti 5 def
    /TabAlphan {[
     0 1 np 1 sub {/iP exch def
        /Alpha TabAlpha0 iP get def
        /Omega 360 Gamma N0 iP add div div def
         Alpha Omega ti mul cos mul
        } for
    ] }def }%
\begin{document}
\maketitle
\begin{center}
\psset{unit=0.75}
\def\nImages{401}%  images
\begin{animateinline}[controls,loop,%palindrome,
                     begin={\begin{pspicture}(-4.1,-26.1)(4.1,1.1)},%
                     end={\end{pspicture}}]{5}% 5 images/s
\multiframe{\nImages}{r=0.0+0.05}{%
\psframe[fillstyle=solid,fillcolor=yellow!20](-4,-26)(4,1)
\psgrid[subgriddiv=1,gridcolor=lightgray,griddots=10,gridlabels=0pt](-4,-26)(4,1)
\pstVerb{/Hh 0 def /Hs 1 def /Hb 1 def /color {Hh Hs Hb} def /dH 1 15 div def}%
\multido{\i=14+-1}{15}{%
\definecolor[ps]{macouleur}{hsb}{color}%
\pstVerb{/ti \r\space def
/Gamma 20 def
         /N0 20 def % nombre d'oscillations de n=0
         /np 15 def % nombre de pendules (np+1)
         /gp 9.81 def % pesanteur
         /Pi 3.14159265359 def
         /di 1 def % distance entre 2 pendules en cm
\macrosPSPendulumWaves}%
    \pnode(!TabLongueursPendules \i\space get dup TabAlphan \i\space get sin mul 100 mul exch
             TabAlphan \i\space get cos mul neg 100 mul
            ){C}
    \Pendule%
\pstVerb{/Hh Hh dH add def}}%
\rput(0,0.5){\textbf{t=\r\,s}}\psdot(0,0)
\pstVerb{
    /Lx {gp Gamma 2 Pi mul N0 t di div add mul div dup mul mul} def
    /alpha0 {y0 Lx div asin} def
    /alphax {alpha0 360 ti mul Gamma div N0 t di div add mul cos mul} def
    }%
\parametricplot[linecolor=red,linestyle=dotted,linewidth=3\pslinewidth,plotpoints=360]{0}{14}{Lx alphax sin mul 100 mul Lx alphax cos mul neg 100 mul  }%
}
\end{animateinline}
\end{center}
\end{document}

samedi 6 septembre 2014

Ballet de pendules

Ce problème a été étudié par James A. Flaten et Kevin A. Parando dans un article intitulé “Pendulum waves : A lesson in aliasing”, paru en 2001 dans l’American Journal of Physics, Vol 69, N◦7.

http://www.physics.iitm.ac.in/~arul/PH1010/AJP000778PendulumWaves2.pdf

Nous avons une suite de n pendules simples situés, au départ, dans un même plan vertical et dont les longueurs vont en décroissant. L’ensemble des pendules est écarté, perpendiculairement au plan vertical initial,  de leur position d’équilibre, de telle sorte qu’ils soient tous dans le même plan vertical parallèle au plan initial, puis ces pendules abandonnés à eux-mêmes se mettent à osciller chacun avec leur période propre. Les longueurs sont calculées de telle sorte que pour un cycle d’observation Γ, le pendule le plus long, d’indice n0, effectue sur cette durée un nombre entier d’oscillations N, le pendule le plus proche, d’indice n1, N + 1 oscillations, le suivant N + 2 oscillations etc.

Le document suivant, accompagné du fichier source, comprend une étude théorique ainsi que des schémas et une animation réalisée avec le package animate. Cependant, l'étude la plus complète est bien sûr celle réalisée par James A. Flaten et Kevin A. Parando.

Les schémas et animations suivants ont été réalisés pour  Γ=10 s, le pendule plus long effectuant 10 oscillations. Le système comprenant 15 pendules. Voici le système avec les longueurs des pendules en m.


 Il se pose ensuite le problème du déclenchement initial du mouvement de l’ensemble des pendules. Choisissons qu’à l’instant initial tous les pendules sont sur le même plan vertical parallèle à l’axe à une distance y0. Pour les maintenir dans cette position on peut envisager deux solutions. Une planchette dont la partie supérieure sera découpée à la même hauteur que les pendules, ainsi la planchette ne gênera pas les fils ou bien une planchette qui aura été fendue à la position de chaque pendule pour permettre le passage des fils. Voici par exemple, pour la première solution la forme, à l’échelle 1/2 que devra avoir la planchette, les points indiquant la position des pendules. Elle sera rabattue vers le sol à l’instant initial.


lundi 1 septembre 2014

psSlinky : le ressort aux couleurs de l'arc-en-ciel fait le tour d'un carré


La compilation est hélas très(trop ?) longue, voici le fichier source :
psSlinky-exemples-2.tex
psSlinky-exemples-2.pdf

\documentclass[10pt]{article}
 \usepackage[a4paper,margin=2cm]{geometry}
\usepackage[latin1]{inputenc}%
\usepackage[T1]{fontenc}
\usepackage{lmodern}
%\usepackage[garamond]{mathdesign}
%\renewcommand{\ttdefault}{lmtt}
\usepackage{pst-solides3d,pst-plot}
\usepackage{animate}
\usepackage[colorlinks=true,dvips,urlcolor=red]{hyperref}
\definecolor{DarkBlue}{rgb}{0,0,.5}
\makeatletter
% Étienne Riga
% Date :1999/11/03
\newcount\r@pport  \newdimen\r@ppord
\newcount\kslant   \newdimen\kslantd
\def\ARC#1{\setbox0\hbox{$\m@th\displaystyle#1$}\kslant=\ht0
   \divide\kslant by1000\multiply\kslant by\fontdimen1\textfont1
   \divide\kslant by10000\kslantd=\kslant\fontdimen6\textfont1
   \divide\kslantd by7750\kern\kslantd
   \r@ppord=\wd0\multiply\r@ppord by100\divide\r@ppord by\ht0
   \multiply\r@ppord by300\advance\r@ppord by\ht0
   \pspicture(0,0)
%   \parabola[linewidth=.3pt]{->}(0,1.05\ht0)(.5\wd0,1.15\r@ppord)
   \parabola[linewidth=.3pt](0,1.05\ht0)(.5\wd0,1.15\r@ppord)
   \endpspicture
   \kern-\kslantd\box0}
% macro pour le ressort
\pst@addfams{pst-Slinky}
% style par défaut du ressort
\newpsstyle{Slinky}{ngrid=720 9,r=0.2,linecolor=blue,linewidth=.01,fillcolor=yellow}
% nombre de spires
\define@key[psset]{pst-Slinky}{N}{\def\psk@SlinkyN{#1 }}
% angle fixant le déploiement du ressort
\define@key[psset]{pst-Slinky}{alpha}{\def\psk@SlinkyAlpha{#1 }}
% rayon moyen du tore lorsque le ressort est en enroulé autour du demi-tore
\define@key[psset]{pst-Slinky}{R}{\def\psk@SlinkyR{#1 }}
% rayon des spires du ressort
\define@key[psset]{pst-Slinky}{rS}{\def\psk@Slinkyr{#1 }}
% direction de marche du ressort dans le plan xOy
% par défaut dans le sens des y>0
\define@key[psset]{pst-Slinky}{u}{\def\psk@Slinkyu{#1 }}
\define@key[psset]{pst-Slinky}{springstyle}{\def\psk@springstyle{#1}}
\psset{N=25,alpha=60,R=5,rS=1.5,u=0 1,springstyle=Slinky}
%
\def\psSlinky{\def\pst@par{}\pst@object{psSlinky}}
\def\psSlinky@i{\@ifnextchar({\psSlinky@do}{\psSlinky@do(0,0)}}
\def\psSlinky@do(#1){%
\begin@SpecialObj
\pst@@getcoor{#1}%
\pstVerb{%
/Atan { /atan load stopped { pop pop 0 } if } def % return 0 if atan not known
/Pi 3.14159265359 def
/deg {Pi mul 180 div} bind def
/rd {180 mul Pi div} bind def
/cm_1 {\pst@number\psunit div } bind def
\psk@Slinkyu /uy exch def /ux exch def
/Rotation ux uy Atan def % arctan def
\pst@coor /ty exch cm_1 def /tx exch cm_1 def % position du ressort au milieu
/R0 \psk@Slinkyr def % rayon des spires
/Ri \psk@SlinkyR def  % rayon du demi-tore initial
/Lr Pi Ri mul def % longueur du ressort
%/Angle \psk@SlinkyAlpha def
\psk@SlinkyAlpha 90 eq {/Angle 90.05 def}{/Angle \psk@SlinkyAlpha def} ifelse
       /Alpha0 Angle deg def % alpha en radians
Alpha0 rd 90 gt {
         /Alpha Alpha0 Pi 2 div sub def
         /Beta Alpha 2 mul def
         /R1 Lr Beta div def
         /yC R1 def
         /angle2 Pi Beta sub def
         /angle1 Pi def
                }if
 Alpha0 rd 90 lt {
         /Alpha Alpha0 def
         /Beta Pi 2 Alpha mul sub def
         /R1 Lr Beta div def
         /yC R1 neg def
         /angle1 0 def
         /angle2 Beta def
                    } if
         /kN \psk@SlinkyN 2 Pi mul Beta div mul ceiling def % cvi 1 add def
}%
\defFunction[algebraic]{H}(t)
    {R0*cos(kN*t)}
    {(R1 + R0*sin(kN*t))*cos(t)+yC}
    {(R1 + R0*sin(kN*t))*sin(t)}
%\defFunction[algebraic]{H'}(t)
%    {-R0*kN*sin(kN*t)}
%    {-(R1 + R0*sin(kN*t))*sin(t)+R0*kN*cos(kN*t)*cos(t)}
%    {(R1 + R0*sin(kN*t))*cos(t)+R0*kN*cos(kN*t)*sin(t)}
\psSolid[object=courbe,RotZ=Rotation,
       range=angle1 angle2,
       style=\psk@springstyle,
       function=H](tx,ty,0)%
\end@SpecialObj}%
\makeatother

%\pagestyle{empty}
\title{La marche d'un ressort}
\date{29 août 2014}
\begin{document}
\maketitle
\section{Principe}
C'est la visualisation de ce Gif animé :

\centerline{\url{http://dvdp.tumblr.com/post/71236566959/haters-gonna-hate-doo-pee-doo}}

qui m'a donné l'idée d'essayer de reproduire la marche d'un ressort. Mais vous connaissez certainement ce fameux ressort appelé ``\textit{Slinky}'', capable de descendre les marches d'un escalier ou de faire du surplace sur un tapis roulant :

\centerline{\url{https://www.youtube.com/watch?v=K6rLIQqhXW4}}

\centerline{\url{https://www.youtube.com/watch?v=Yy7CwYB7Ds0}}

La modélisation physique ou mathématique ne me semble pas évidente, a-t-elle déjà été faite ? Pour la marche du ressort sur le plan horizontal, j'ai adopté les règles suivantes, sans aucun rapport avec la réalité physique.
\begin{enumerate}
  \item Le ressort est initialement posé sous forme d'un demi-tore sur le plan ;
  \item on maintient une extrémité fixe, puis on lâche l'autre, le ressort se déploie jusqu'à la verticale et si on lui a donné une légère impulsion au départ se courbe dans l'autre sens et se courbe pour finir par former un demi-tore etc. La marche du ressort est en route.
  \item On suppose que la longueur médiane du ressort reste constante et qu'il forme toujours une partie d'un tore.
\end{enumerate}
Calculons les paramètres du tore autour duquel s'enroulera le ressort. On se fixe le nombre de spires du ressort : $N$, le rayon des spires : $r$, et la longueur médiane du ressort : $L$. Lorsque le ressort se déploie, la ligne médiane est un arc du demi-cercle centré sur l'axe $y'Oy$, arc dont l'origine est l'extrémité maintenue fixe(temporairement).

Sur ce dessin on ne représente que la ligne médiane du ressort. En bleu le ressort entoure un demi-tore de cercle médian $\ARC{OA}$, de rayon : $R=\frac{L}{\pi}$. En rouge le ressort est déployé d'un angle $\alpha$. En vertu de l'hypothèse (3), les arcs $\ARC{OA_1}$ et $\ARC{OA}$ ont même longueur, ce qui permet de calculer la position du centre $O_1$, du nouveau demi-cercle, et son rayon $R_1$. Le ressort s'enroulant sur la portion de tore $\ARC{OA_1}$.
On repère la position du ressort par l'angle $\alpha$. $\beta=2\pi-\alpha$.
\[
\ARC{OA_1}=L=R_1\beta_1\Longrightarrow R_1=\frac{L}{\beta_1}\ ;\ y_{O_1}=-R_1
\]
Lorsque le ressort est complètement déployé, donc vertical en $O$, nous supposons qu'il se replie alors vers la droite jusqu'à enrouler à nouveau un demi-tore de rayon moyen $R$.

Lorsque $\alpha>\frac{\pi}{2}$, $\beta=2\alpha-\pi$.
\begin{center}
\scriptsize
\psset{unit=0.4,plotpoints=360}
\begin{pspicture}(-20,-3)(16,15)
\psframe(-20,-3)(16,15)
\pstVerb{% extrait de pst-math.pro
/Pi 3.14159265359 def
%
/DegToRad {Pi mul 180 div} bind def
/RadToDeg {180 mul Pi div} bind def
         /Lr 4 Pi mul def
         /Angle Pi def /Ri Lr Angle div def
         /yC Lr Pi div Ri add def}%
\psarc(!Ri 0){!Ri}{0}{180}
\psarc[linecolor=blue](!Ri neg 0){!Ri}{0}{180}
\psdot(!Ri 0)\psdot(!Ri neg 0)
\psline{->}(-20,-0)(15,0)
\psline{->}(0,0)(!0 Lr 1 add)
\uput[l](!0 Lr 1 add){$z$}
\uput[d](15,0){$y$}
\def\Angle{30 }%
\pstVerb{
         \Angle 90 eq {/angle 89.9 def}{/angle \Angle def} ifelse
         /Alpha0 angle DegToRad def % alpha
 Alpha0 RadToDeg 90 gt {
         /Alpha Pi Alpha0 sub def
         /Beta Alpha 2 mul def
         /R1 Lr Pi Beta sub div def
         /yC R1 def
         /angle1 Beta RadToDeg def
         /angle2 180 def
                }if
 Alpha0 RadToDeg 90 lt {
         /Alpha Alpha0 def
         /Beta Pi 2 Alpha mul sub def
         /R1 Lr Beta div def
         /yC R1 neg def
         /angle1 0 def
         /angle2 Beta RadToDeg def
                    } if
         /Ri Lr Pi div def
         }%
\pnode(!Beta RadToDeg dup cos R1 mul yC add exch sin R1 mul){B}
\pnode(!yC 0){C}
\psline[linestyle=dashed](B)
\psline[linestyle=dashed](C)(B)
\psarc[linestyle=dotted](C){!R1}{0}{180}
\psdot(C)
\psarc[linecolor=red](C){!R1}{!angle1}{!angle2}
\uput[d](0,0){$O$}
\uput[d](C){$O_1$}
\uput[u](B){$A_1$}
\uput[d](!Ri 2 mul neg 0){$A$}
\psarcn{->}(0,0){2}{180}{!180 angle sub}
\uput{0.1}[!180 angle 2 div sub](!180 angle 2 div sub dup cos 2 mul exch sin 2 mul){$\alpha_1$}
\psarc{->}(C){2}{0}{!Beta RadToDeg}
\uput{0.1}[!Beta RadToDeg 2 div](!Beta RadToDeg 2 div dup cos 2 mul yC add exch sin 2 mul){$\beta_1$}
\psline[linecolor=red](!0 Lr)
\end{pspicture}

\begin{pspicture}(-20,-3)(16,15)
\psframe(-20,-3)(16,15)
\pstVerb{% extrait de pst-math.pro
/Pi 3.14159265359 def
%
/DegToRad {Pi mul 180 div} bind def
/RadToDeg {180 mul Pi div} bind def
         /Lr 4 Pi mul def
         /Angle Pi def /Ri Lr Angle div def
         /yC Lr Pi div Ri add def}%
\psarc[linecolor=blue](!Ri 0){!Ri}{0}{180}
\psarc(!Ri neg 0){!Ri}{0}{180}
\psdot(!Ri 0)\psdot(!Ri neg 0)
\psline{->}(-20,-0)(15,0)
\psline{->}(0,0)(!0 Lr 1 add)
\uput[l](!0 Lr 1 add){$z$}
\uput[d](15,0){$y$}
\def\Angle{140 }%
\pstVerb{
\Angle 90 eq {/angle 89.9 def}{/angle \Angle def} ifelse
         /Alpha0 angle deg def % alpha
         Alpha0 rd 90 gt {
         /Alpha Pi Alpha0 sub def
         /Beta Alpha 2 mul def
         /R1 Lr Pi Beta sub div def
         /yC R1 def
         /k 25 2 Pi mul Pi Beta sub div mul cvi 1 add def
         /angle1 Beta RadToDeg def
         /angle2 180 def
                }if
         Alpha0 RadToDeg 90 lt {
         /Alpha Alpha0 def
         /Beta Pi 2 Alpha mul sub def
         /R1 Lr Beta div def
         /yC R1 neg def
         /angle1 0 def
         /angle2 Beta RadToDeg def
                    } if
         /Ri Lr Pi div def
         }%
\pnode(!Beta RadToDeg dup cos R1 mul yC add exch sin R1 mul){B}
\pnode(!yC 0){C}
\psline[linestyle=dashed](B)
\psline[linestyle=dashed](C)(B)
\psarc[linestyle=dotted](C){!R1}{0}{180}
\psdot(C)
\psarc[linecolor=red](C){!R1}{!angle1}{!angle2}
\uput[d](0,0){$O$}
\uput[d](C){$O_2$}
\uput[u](B){$A_2$}
\uput[d](!Ri 2 mul neg 0){$A$}
\psarcn{->}(0,0){2}{180}{!180 angle sub}
\uput{0.1}[!180 angle 2 div sub](!180 angle 2 div sub dup cos 2 mul exch sin 2 mul){$\alpha_2$}
\psarcn{->}(C){2}{180}{!Beta RadToDeg}
\uput{0.1}[!180 Beta RadToDeg 2 div sub](!180 Beta RadToDeg 2 div sub dup cos 2 mul yC add exch sin 2 mul){$\beta_2$}
\psline[linecolor=red](!0 Lr)
\end{pspicture}
\end{center}
\section{La commande \texttt{$\backslash${}psSlinky[options](x,y)}}
Elle comprend les options suivantes, ce sont les valeurs par défaut qui sont indiquées :
\begin{enumerate}
%\psset{N=25,alpha=60,R=5,rS=1.5,u=0 1}
  \item \texttt{N=25} : nombre de spires du ressort ;
  \item \texttt{rS=1.5} : rayon du ressort ;
  \item \texttt{R=5} : rayon moyen du tore lorsque le ressort est en enroulé autour du demi-tore ;
  \item \texttt{springstyle=Slinky} : le style du ressort.
  \item \texttt{alpha=60} : angle fixant le déploiement du ressort (voir les dessins ci-dessus) ;
  \item \texttt{u=0 1} : direction de la marche du ressort dans le plan $xOy$, ce sont les coordonnées du vecteur $(u_x,u_y)$.
\end{enumerate}
\verb+\psSlinky[options](x,y)+ : ce couple $(x,y)$ fixe la position du pied du ressort, par défaut~$(0,0)$ si rien n'est indiqué.

Le style du ressort est défini par défaut par :

\noindent \verb+\newpsstyle{Slinky}{ngrid=720 9,r=0.2,linecolor=blue,linewidth=.01,fillcolor=yellow}+ \texttt{r=0.2} étant le rayon du tube.
\section{Exemple : le tour d'un carré}
\begin{center}
% nouveau style du ressort
\newpsstyle{SlinkyA}{ngrid=1080 9,r=0,resolution=360,linecolor=DarkBlue,linewidth=.075,hue=0 1}
\newpsstyle{SlinkyRainbow}{ngrid=1080 9,r=0.1,resolution=360,linecolor=DarkBlue,linewidth=.01,hue=0 1,grid}
\psset{viewpoint=75 10 30 rtp2xyz,Decran=20,unit=0.75,springstyle=SlinkyRainbow,rS=1,lightsrc=viewpoint,subgriddiv=2}
\def\nImages{10}%  images
\begin{animateinline}[controls,loop,%palindrome,
                     begin={\begin{pspicture}(-13,-6)(2,10)},%
                     end={\end{pspicture}}]{5}% 5 images/s
\multiframe{\nImages}{i=0+10}{%
\psgrid[subgridwidth=0.2pt,gridwidth=0.2pt,gridcolor=gray,gridlabels=0pt]%
\psframe(-13,-6)(2,10)
\psSolid[object=grille,base=-2 22 -22 2,linecolor=DarkBlue,grid=true,
          linewidth=0.5\pslinewidth](0,0,0)%
\psSlinky[alpha=\i=0+10,R=10,N=50](0,0)}
\multiframe{\nImages}{i=90+-10}{%
\psgrid[subgridwidth=0.2pt,gridwidth=0.4pt,gridcolor=gray,gridlabels=0pt]%
\psframe(-13,-6)(2,10)
\psSolid[object=grille,base=-2 22 -22 2,linecolor=DarkBlue,grid=true,
          linewidth=0.5\pslinewidth](0,0,0)%
\psSlinky[alpha=\i,R=10,N=50,u=1 0](0,0)}
\multiframe{\nImages}{i=0+10}{%
\psgrid[subgridwidth=0.2pt,gridwidth=0.2pt,gridcolor=gray,gridlabels=0pt]%
\psframe(-13,-6)(2,10)
\psSolid[object=grille,base=-2 22 -22 2,linecolor=DarkBlue,grid=true,
          linewidth=0.5\pslinewidth](0,0,0)%
\psSlinky[alpha=\i,R=10,N=50,u=-1 0](20,0)}
\multiframe{\nImages}{i=90+-10}{%
\psgrid[subgridwidth=0.2pt,gridwidth=0.2pt,gridcolor=gray,gridlabels=0pt]%
\psframe(-13,-6)(2,10)
\psSolid[object=grille,base=-2 22 -22 2,linecolor=DarkBlue,grid=true,
          linewidth=0.5\pslinewidth](0,0,0)%
\psSlinky[alpha=\i,R=10,N=50,u=0 1](20,0)}
%
\multiframe{\nImages}{i=0+10}{%
\psgrid[subgridwidth=0.2pt,gridwidth=0.2pt,gridcolor=gray,gridlabels=0pt]%
\psframe(-13,-6)(2,10)
\psSolid[object=grille,base=-2 22 -22 2,linecolor=DarkBlue,grid=true,
          linewidth=0.5\pslinewidth](0,0,0)%
\psSlinky[alpha=\i,R=10,N=50,u=0 -1](20,-20)}
%
\multiframe{\nImages}{i=90+-10}{%
\psgrid[subgridwidth=0.2pt,gridwidth=0.2pt,gridcolor=gray,gridlabels=0pt]%
\psframe(-13,-6)(2,10)
\psSolid[object=grille,base=-2 22 -22 2,linecolor=DarkBlue,grid=true,
          linewidth=0.5\pslinewidth](0,0,0)%
\psSlinky[alpha=\i,R=10,N=50,u=-1 0](20,-20)}
\multiframe{\nImages}{i=0+10}{%
\psgrid[subgridwidth=0.2pt,gridwidth=0.2pt,gridcolor=gray,gridlabels=0pt]%
\psframe(-13,-6)(2,10)
\psSolid[object=grille,base=-2 22 -22 2,linecolor=DarkBlue,grid=true,
          linewidth=0.5\pslinewidth](0,0,0)%
\psSlinky[alpha=\i,R=10,N=50,u=1 0](0,-20)}
\multiframe{\nImages}{i=90+-10}{%
\psgrid[subgridwidth=0.2pt,gridwidth=0.2pt,gridcolor=gray,gridlabels=0pt]%
\psframe(-13,-6)(2,10)
\psSolid[object=grille,base=-2 22 -22 2,linecolor=DarkBlue,grid=true,
          linewidth=0.5\pslinewidth](0,0,0)%
\psSlinky[alpha=\i,R=10,N=50,u=0 -1](0,-20)}
\end{animateinline}
\end{center}
\end{document}