mercredi 9 mars 2016

Dessiner des guillochis entre 2 cercles non concentriques avec PSTricks

Dessiner une courbe périodique fermée comprise entre 2 cercles concentriques et tangente à ceux-ci est facile, voir le début des “guillochis” sur :


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 :


On peut choisir le centre d’inversion pour que le grand cercle (C 1 ) et son image (C′ 1 ) aient le même rayon, mais le petit cercle (C 2 ) et son image (C′ 2 ) auront des rayons différents :
Quelques explications sont dans le fichier pdf :

L'animation dans ce fichier a été réalisée avec le package animate d'Alexander Grahn.

Cette page a été complétée et la documentation mise à jour :


Ci-dessous le code permettant d'obtenir les images pour réaliser le Gif animé ci-dessus :

\documentclass{article}
\usepackage[paperwidth=14cm,paperheight=6cm,hmargin={0cm,0cm},vmargin={0cm,0cm},dvips]{geometry}
\usepackage{pst-plot}
\usepackage[garamond]{mathdesign}
\usepackage{amsmath}
\usepackage{animate}
\usepackage{url}
\psset{dimen=middle}
\title{Dessiner des guillochis entre 2 cercles non concentriques avec PSTricks}
\date{9 mars 2016}
\pagestyle{empty}
\author{Manuel Luque}
\begin{document}
\begin{center}
\multido{\r=0+2.5}{29}{%
\begin{pspicture}(-7,-3)(7,3)
\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)
\psline(!CoorB pop -0.1 add 0)(!CoorB pop 0.1 add 0)
\psline(!CoorB pop -0.1 )(!CoorB pop 0.1)
% les inverses
\pscircle[linecolor=blue](!CoorA){!RA}
\pscircle[linecolor=blue](!CoorB){!RB}
\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt]
\end{pspicture}\newpage}
\end{center}
\end{document}


Aucun commentaire:

Enregistrer un commentaire