jeudi 10 mars 2016

Dessiner des guillochis entre 2 cercles non concentriques avec PSTricks (suite)

 (suite de http://pstricks.blogspot.fr/2016/03/dessiner-des-guillochis-entre-2-cercles.html)
Pour conserver aux cercles qui bordent la ligne ondulée les rayons initiaux, il faut opérer comme pour le package “pst-guillochis” : exemple ci-dessous et les précédents :

 La documentation a été mise à jour :
guillochis-cercles.tex
 guillochis-cercles.pdf
Le listing pour ceux qui souhaitent le compiler suivant la séquence habituelle (Latex->dvips->ps2pdf)

\documentclass{article}
\usepackage[a4paper,hmargin=1.5cm]{geometry}
\usepackage{pst-plot,pst-slpe}
%\usepackage[garamond]{mathdesign}
\usepackage{amsmath}
\usepackage{animate}
\usepackage{url}
\psset{dimen=middle}
\title{Dessiner des guillochis entre 2 cercles non concentriques avec PSTricks}
\date{10 mars 2016}
%\pagestyle{empty}
\newpsstyle{ball}{fillstyle=ccslope,slopebegin=white,slopecenter=0.4 0.6,linestyle=none}
\newpsstyle{pupil}{fillstyle=ccslope,slopeend={[rgb]{0 0.6 0}},slopebegin=white,slopecenter=0.2 0.6,linestyle=none}
\newpsstyle{center}{fillstyle=ccslope,slopeend={[rgb]{0 0.3 0}},slopebegin=white,slopecenter=0.4 0.6,linestyle=none}
\author{Manuel Luque}
\begin{document}
\maketitle
Dessiner une courbe périodique fermée comprise entre 2 cercles concentriques et tangente à ceux-ci est facile, voir le début des ``\textit{guillochis}'':

\centerline{\url{http://pstricks.blogspot.fr/}}


Le cas le plus simple est celui d'une \textit{sinusoïde} circulaire comprise entre 2 cercles concentriques. $R_1$ et $R_2$ sont les rayons des cercles avec $R_1q$, la courbe se referme après $q$ tours.
\[
\left\{
\begin{array}[m]{l}
x=\Big(a+b\cos\frac{p}{q}t\Big)\sin t\\
y=\Big(a+b\cos\frac{p}{q}t\Big)\cos t
\end{array}
\right.
\]
Si le 2 cercles ne sont plus concentriques, le problème est plus compliqué. Une astuce consiste à utiliser l'inversion, comme pour les cercles de Steiner :

\centerline{\url{http://pstricks.blogspot.fr/2015/08/chaine-de-cercles-de-steiner.html}}

\noindent<< \textit{Si deux courbes $(\mathcal{L}_1)$ et $(\mathcal{L}_2)$  sont tangentes en $M$, leurs inverses $(\mathcal{L'}_1)$ et $(\mathcal{L'}_2)$ sont tangentes en $M'$ inverse de $M$.}>>\footnote{\label{Maillard}Cours Maillard, tome : Géométrie | Mécanique, page 310, Hachette 1964.}

On peut choisir le centre d'inversion pour que le grand cercle $(\mathcal{C}_1)$ et son image $(\mathcal{C'}_1)$ aient le même rayon, mais le petit cercle $(\mathcal{C}_2)$ et son image $(\mathcal{C'}_2)$ auront des rayons différents :
\begin{center}
\begin{animateinline}[controls,loop,
                     begin={\begin{pspicture}(-7,-3)(7,3)},
                     end={\end{pspicture}}]{20}% 20 images/s
\multiframe{29}{r=0+2.5}{%
\pstVerb{
         /R1 2 def % choix du rayon du cercle externe
         /R2 1 def
         /xC1 2 R1 mul neg def % position du centre du cercle (C1)
         /k_ xC1 dup mul R1 dup mul sub neg  def
%%--determiner le rayon du cercle image--%%
%%----et les coordonnées du centre-------%%
%% x y R  xyR ==> x' y' R'
         /xyR {
            10 dict begin
            /R exch def % rayon du cercle à inverser
            /y exch def % abscisse du centre de (C)
            /x exch def % ordonnée du centre de (C)
            /d x dup mul y dup mul add sqrt def % d(OC)
         % puissance de O/C
            /p d dup mul R dup mul sub def
            /beta R d div arcsin def
         % vecteur unitaire suivant OC
            /ux x d div def
            /uy y d div def
         % pied de la polaire H
%            /xH p sqrt beta cos mul ux mul def
%            /yH p sqrt beta cos mul uy mul def
            p sqrt beta cos mul ux mul % xH
            p sqrt beta cos mul uy mul % yH
             Inverse % ==> xC' et yC'
           k_ p div R mul abs % ==> R'
           end
         } def
% formule d'inversion : calcul des coordonnées du point image
%% x y Inverse ==> x' y'
      /Inverse {
       3 dict begin
       /y exch def
       /x exch def
       /d2 x dup mul y dup mul add def
       k_ x mul d2 div % x'
       k_ y mul d2 div % y'
       end
      }def
/CoorA {xC1 0 R1 xyR pop} def
/CoorB {xC1 0 R2 xyR pop} def
 /RA xC1 0 R1 xyR exch pop exch pop def
 /RB xC1 0 R2 xyR exch pop exch pop def
 /2pi 6.283185 def
         /a1 0 def
         /a2 0 def
         /p1 17 def
         /q1 5 def
         /xF1 {
               R1 R2 add 2 div
               R1 R2 sub 2 div
               p1 t mul q1 div \r\space add cos mul
               add
               t cos mul
               2 R1 mul sub
               } def
          /yF1 {
               R1 R2 add 2 div
               R1 R2 sub 2 div
               p1 t mul q1 div \r\space add cos mul
               add
               t sin mul
               } def
/tableauInverses {
        0 1 360 q1 mul {/t exch def
           xF1 yF1 Inverse
           } for
           } def
/decal {\r\space DegtoRad} def
         }%
\psparametricplot[plotpoints=720,algebraic]{0}{2pi q1 mul}{((R1+R2)/2+(R1-R2)/2*cos(p1*t/q1+decal))*cos(t)-2*R1|((R1+R2)/2+(R1-R2)/2*cos(p1*t/q1+decal))*sin(t)}
\listplot[plotstyle=curve,linecolor=red]{tableauInverses}
% les 2 cercles initiaux et leurs images
\pscircle[linecolor=blue](!xC1 0){!R1}
\pscircle[linecolor=blue](!xC1 0){!R2}
\psdot(!xC1 0)
%\psdot[dotstyle=+](!CoorB)
\psline(!CoorB pop -0.1 add 0)(!CoorB pop 0.1 add 0)
\psline(!CoorB pop -0.1 )(!CoorB pop 0.1)
\pscircle[linecolor=blue](!CoorA){!RA}
\pscircle[linecolor=blue](!CoorB){!RB}
\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt]
}
\end{animateinline}
\end{center}

Pour conserver aux cercles qui bordent la ligne ondulée les rayons initiaux, il faut opérer comme pour le package ``pst-guillochis'', exemple et précédents :

\centerline{\url{http://pstricks.blogspot.fr/2016/03/pst-guillochis-exemple-avec-animation-n3.html}}

Mais pour faire plus simple, nous allons revenir aux coordonnées cartésiennes. Le grand cercle $(\mathcal{C}_1)$ sera centré en $O_1(0,0)$ et le centre du petit cercle $(\mathcal{C}_2)$  en $O_2(a,b)$. Les coordonnées de $O_2$ seront choies pour que $(\mathcal{C}_2)$  reste entièrement à l'intérieur de $(\mathcal{C}_1)$. Leurs  équations respectives sont.
\[(\mathcal{C}_1)
\left\{
\begin{array}[m]{l}
x_1=R_1\cos t\\
y_1=R_1\sin t
\end{array}
\right.
\quad
(\mathcal{C}_2)
\left\{
\begin{array}[m]{l}
x_2=a+R_2\cos t\\
y_2=b+R_2\sin t
\end{array}
\right.
\]
Les équations paramétriques de l'ondulation comprise entre ces 2 cercles s'écrivent :
\[
\left\{
\begin{array}[m]{l}
x=\frac{x_1+x_2}{2}+\frac{x_1-x_2}{2}\cos\frac{p}{q}t\\
y=\frac{y_1+y_2}{2}+\frac{y_1-y_2}{2}\cos\frac{p}{q}t
\end{array}
\right.
\]
\begin{center}
\begin{pspicture}(-3,-3)(3,3)
\pstVerb{/R1 3 def /R2 1.5 def /p1 15 def /q1 7 def /2pi 6.283185 def /ax 0.75 def /by 0 def
         }%
\psparametricplot[plotpoints=1040,linecolor=red,algebraic]{0}{2pi q1 mul}{(R1*cos(t)+(R2*cos(t)+ax))/2+(R1*cos(t)-(R2*cos(t)+ax))/2*cos(p1*t/q1)| % x
                                                                          (R1*sin(t)+(R2*sin(t)+by))/2+(R1*sin(t)-(R2*sin(t)+by))/2*cos(p1*t/q1) % y
                          }
\pscircle{!R1}
\pscircle(0.75,0){!R2}
\rput(1,0){$p=15$\ ;\ $q=7$}
\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt]
\end{pspicture}
\end{center}

\begin{center}
\begin{animateinline}[controls,palindrome,
                     begin={\begin{pspicture}(-4,-4)(4,4)},
                     end={\end{pspicture}}]{20}% 20 images/s
\multiframe{34}{r=-1.7+0.1}{%
\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt]
\pstVerb{/R1 3 def /R2 1 def /p1 15 def /q1 7 def /2pi 6.283185 def /ax \r\space def /by 0 def
         }%
\pscircle[style=ball]{!R1}
\psparametricplot[plotpoints=1040,linecolor=red,algebraic]{0}{2pi q1 mul}{(R1*cos(t)+(R2*cos(t)+ax))/2+(R1*cos(t)-(R2*cos(t)+ax))/2*cos(p1*t/q1)| % x
                                                                          (R1*sin(t)+(R2*sin(t)+by))/2+(R1*sin(t)-(R2*sin(t)+by))/2*cos(p1*t/q1) % y
                          }
\pscircle[style=pupil](\r,0){!R2}\pscircle[style=center](\r,0){!R2 3 div}
}
\end{animateinline}
\end{center}
\end{document} 




Aucun commentaire:

Enregistrer un commentaire