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}

Aucun commentaire:

Enregistrer un commentaire