mardi 30 octobre 2012

pst-solve : recherche d’une racine simple par dichotomie

En essayant de dessiner une mosaïque vue sur une maison de Brionne, uniquement constituée d’arcs de cercle -à part le contour, je me suis aperçu qu’il y avait beaucoup de calculs à faire ! J’aurais pu confier la résolution des différentes équations à un logiciel spécialisé, mais je me suis souvenu que j’avais déjà réalisé, en août 2003, une série de macros qui justement permettaient de trouver et d’afficher la solution d’une équation dans une intervalle donné :


Comme Herbert Voss a repris la méthode d’affichage des valeurs dans le package pst-tools en lui apportant quelques améliorations comme le choix de la fonte des nombres, j’ai uniquement réécrit la macro dédiée au calcul d’une solution et j’ai utilisé la package pst-tools pour l’affichage.
La macro \psSolve[options](t1,t2)(f(t),t){nom}  permet de calculer une solution de l’équation f(t)=0 dans l’intervalle [t1,t2]. La fonction peut-être écrite en mode algébrique avec l’option [algebraic] et sa variable doit être précisée après la virgule : on peut choisir celle que l’on veut (t , x, y . . .). Le dernier paramètre indiquera le nom de la variable postscript dans laquelle sera stocké le résultat pour une utilisation ultérieure.
C’est une macro très rudimentaire et il faut avoir une idée de l’intervalle où peut se trouver une solution. Pour cela, on trace, évidemment, le graphe de la fonction.

 Les valeurs indiquées sont obtenues avec la macro. Pour comparer les valeurs calculées avec Maple sont : -2.036983004, -0.3192114863
Quelques étapes de la construction :




 Les fichiers :
http://manuel.luque.perso.neuf.fr/pst-solve/pst-solve.pdf
http://manuel.luque.perso.neuf.fr/pst-solve/pst-solve.tex

lundi 29 octobre 2012

Géométrie élémentaire avec PSTricks et AcroteX par Thomas Söll

Il s'agit d'une image extraite de l'animation incluse dans le fichier (Anim-Scheitel-Winkel.pdf Anim-Scheitel-Winkel.tex)  du répertoire :

Un peu de géométrie élémentaire avec PSTricks par Thomas Söll

Ces illustrations montrant comment dessiner des parallèles à l'aide d'une équerre et d'un rapporteur sont dessinées très finement par Thomas Söll.


Les fichiers (Geodr-Stift-Lineal.tex  Geodr-Stift-Lineal.pdf) sont dans :

mercredi 17 octobre 2012

“Swinging Atwood’s Machine” : animation en 3D

Une image de l'animation qui est incluse dans le pdf.
Les calculs ont été faits avec pst-ode, l'animation avec animate et l'affichage avec pst-solides3d. La macro \listplotIIID a été réécrite.
Les fichiers"animate_atwood_3d.pdf" et "animate_atwood_3d.tex" sont dans le répertoire :
Les autres fichiers sont dans le mêm répertoire

L'animation au format Gif animé :

dimanche 14 octobre 2012

“Machine d’Atwood dansante” ou “Swinging Atwood’s Machine”

Nous avons déjà évoqué, dans ce blog, de nombreuses machines comme le pendule cycloïdal, le pendule élastique etc. Voici venir le tour de la “Machine d’Atwood dansante” ou “Swinging Atwood’s Machine” en anglais. L’article fondateur de toutes les études qui lui ont été dédiées est celle de “Tufillaro, Abbott et Griffiths” dans la revue d’octobre 1984 de l’American Association of Physics Teachers. En plus de l’étude théorique, ces 3 auteurs proposent le dessin d’un montage expérimental, que j’ai redessiné en 3D.
Une équipe de l'Université de Lille 1 a mis au point un dispositif expérimental plus simple, avec simplement deux poulies. Les vidéos qu’ils présentent sont convaincantes, mais il me semble que pour éviter que le pendule accroche le fil reliant les deux poulies, celles-ci ne doivent pas avoir leurs deux axes rigoureusement parallèles, un des deux doit être légèrement tourné vers l’extérieur.


Pour l’établissement des équations différentielles du mouvement du pendule et du contre-poids, nous supposons que le rayon des poulies est négligeable ainsi que leur masse. Le document fondateur contient une démonstration bien plus complète, ainsi que l’article rédigé par l’équipe de l’Université de Lille déjà cité. Je signale aussi la fine analyse faite par Gilbert Gastebois du rôle joué par la force de Coriolis. Je rappelle que ce document n’a d’autre objectif que donner un exemple d’utilisation des packages ‘pst-ode’ et ‘animate’.
Une image d'une animation :
Une animation en Gif animé :

Tous les fichiers sont dans le répertoire :
Atwood

Le fichier "animate_atwood_2.tex" est spécialement dédié à l'animation. Les animations sont incluses dans les fichiers pdf.

jeudi 4 octobre 2012

Les pâtes alimentaires façon PSTricks - 5 : Bucatini et Stelline

Pour dessiner le contour des pâtes il faut modifier le fichier pst-solides3d.pro en désactivant quelques lignes :
ajouter des % aux lignes indiquées :

/proj-pst-courbeR2 {
   l@pl@n plangetrange aload pop
   setyrange setxrange
%   newpath
%      xmin ymin l@pl@n pointplan smoveto
%      xmin ymax l@pl@n pointplan slineto
%      xmax ymax l@pl@n pointplan slineto
%      xmax ymin l@pl@n pointplan slineto
%      xmin ymin l@pl@n pointplan slineto
%      planprojpst projpath
%   clip
%   solidlinewidth setlinewidth
   newpath
      linecolor
      range aload pop { function cvx exec } CourbeR2_
      gere_pstricks_proj_opt
} def

/proj-pst-courbe {
   l@pl@n plangetrange aload pop
   setyrange setxrange
%   newpath
%      xmin ymin l@pl@n pointplan smoveto
%      xmin ymax l@pl@n pointplan slineto
%      xmax ymax l@pl@n pointplan slineto
%      xmax ymin l@pl@n pointplan slineto
%      xmin ymin l@pl@n pointplan slineto
%      planprojpst projpath
%   clip
   solidlinewidth setlinewidth
   newpath
      linecolor
      range aload pop {} { function cvx exec } Courbeparam_
      gere_pstricks_proj_opt
} def

Les fichiers sont dans le sous-dossier "bucati-stellini" :


Le listing :

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[T1]{fontenc}
\usepackage{pst-plot,pst-solides3d}
\usepackage{pst-text}
\title{Les pâtes alimentaires façon PSTricks - 5 :\\ Bucatoni et Stelline}
\date{5 octobre 2012}
\begin{document}
\maketitle

\begin{center}
%Bucatini

\begin{pspicture}(-4,-1)(4,10)
\psset{lightsrc=100 20 50 rtp2xyz,viewpoint=100 0 60 rtp2xyz,Decran=20}
\pstVerb{/iface 0 store
         /BLEU {0.2 0.2 1 setrgbcolor} def}%
\psSolid[object=grille,base=-48 0 -8 8,ngrid=2. 2.,RotY=90,grid,
 fcol=0 16 368 { /i exch def
 0 2 6 {/j exch def
 j i add (cyan)
 j i 1 add add (BLEU)
 } for
 } for
 8 16 352 { /i exch def
 0 2 6 {/j exch def
 j i add (BLEU)
 j i 1 add add (cyan)
 } for
 } for
](-1,0,0)
{\psset{solidmemory}
\psSolid[object=plan,
    definition=normalpoint,
    args={-1 0 40 [1 0 0]},
    action=none,name=panneau,
    base=-1 1 -2 2]
\psProjection[object=texte,
    fontsize=150,linecolor=red,
    plan=panneau,phi=180,
    text=Bucatini](16,5)%
\composeSolid}
\psSolid[object=prisme,h=50,grid,%ngrid=18 1,
incolor={[hsb]{0.118 1 1}},
fillcolor={[hsb]{0.118 1 1}},
base=0 2 360 {
/angle ED
 1.25 angle cos mul
 1.25 angle sin mul
} for
360 -2 0 {
/angle ED
0.75 angle cos mul
0.75 angle sin mul
} for
](0,0,0)
%% definition du plan de projection
\psset{solidmemory}
\defFunction[algebraic]{cercle1}(t){1.25*cos(t)}{1.25*sin(t)}{}
\defFunction[algebraic]{cercle2}(t){0.75*cos(t)}{0.75*sin(t)}{}
\psSolid[object=plan,
   definition=equation,
   args={[0 0 1 -50]},
   base=-4 4 -4 4,
   action=none,
   name=monplan
]
\psset{plan=monplan}
\psProjection[object=courbeR2,
   linewidth=0.02,linecolor={[rgb]{0.4 0 0}},
   range=0 2 Pi mul,resolution=360,
   function=cercle2
]
\psProjection[object=courbeR2,
   linewidth=0.02,linecolor={[rgb]{0.4 0 0}},
   range=0 2 Pi mul,resolution=360,
   function=cercle1
]
\composeSolid
\end{pspicture}
\end{center}

\begin{center}
\begin{pspicture}(-4,-3)(4,4)
\psset{unit=0.4}
\pscustom[linestyle=none]{
\parametricplot[plotpoints=720,algebraic]{0}{6.283185}{%
(5+1.*sin(5*t))*cos(t)|(5+1.*sin(5*t))*sin(t)}
\parametricplot[plotpoints=720,algebraic]{6.283185}{0}{
2*cos(t)|2*sin(t)}
\fill[fillstyle=solid,fillcolor={[hsb]{0.118 1 1}}]
}
\parametricplot[plotpoints=720,algebraic]{0}{6.283185}{%
(5+1.*sin(5*t))*cos(t)|(5+1.*sin(5*t))*sin(t)}
\parametricplot[plotpoints=720,algebraic]{6.283185}{0}{%
2*cos(t)|2*sin(t)}
\end{pspicture}
\begin{pspicture}(-4,-3)(4,3)
\psset{lightsrc=viewpoint,viewpoint=40 70 50 rtp2xyz,Decran=16}
\pstVerb{/iface 0 store
         /BLEU {0.2 0.2 1 setrgbcolor} def}%
\psSolid[object=grille,base=-8 8 -8 8,ngrid=2. 2.,grid,
 fcol=0 16 48 { /i exch def
 0 2 6 {/j exch def
 j i add (cyan)
 j i 1 add add (BLEU)
 } for
 } for
 8 16 56 { /i exch def
 0 2 6 {/j exch def
 j i add (BLEU)
 j i 1 add add (cyan)
 } for
 } for
](0,0,0)
\defFunction[algebraic]{etoile}(t){(5+1.*sin(5*t))*cos(t)}{(5+1.*sin(5*t))*sin(t)}{}
\defFunction[algebraic]{cercle}(t){2*cos(t)}{2*sin(t)}{}
\psset{solidmemory}
\psSolid[object=plan,
   definition=equation,
   args={[0 0 1 0]},
   base=-4 4 -4 4,
   action=none,
   name=planTexte
]
\psProjection[object=texte,
    fontsize=75,linecolor=red,
    plan=planTexte,phi=180,
    text=Stelline](0,-7)%
\psSolid[object=plan,
   definition=equation,
   args={[0 0 1 -1]},
   base=-4 4 -4 4,
   action=none,
   name=monplan
]
\psset{plan=monplan}
\psSolid[object=prisme,h=1,grid,
algebraic,
%ngrid=9,
incolor={[hsb]{0.118 1 1}},
fillcolor={[hsb]{0.118 1 1}},
base=0 1 360 {
/angle ED
5 5 angle mul sin add angle cos mul
5 5 angle mul sin add angle sin mul
} for
360 -1 0 {
/angle ED
2 angle cos mul
2 angle sin mul
} for
](0,0,0)
\psProjection[object=courbeR2,%visibility,
   linewidth=0.02,linecolor={[rgb]{0.4 0 0}},
   range=0 2 Pi mul,resolution=720,
   function=cercle
]
\psProjection[object=courbeR2,%visibility,
   linewidth=0.02,linecolor={[rgb]{0.4 0 0}},
   range=0 2 Pi mul,resolution=720,
   function=etoile
]
\composeSolid
\end{pspicture}
\end{center}
\end{document}
Modifier ainsi pst-solides3d.pro :

/proj-pst-courbeR2 {
   l@pl@n plangetrange aload pop
   setyrange setxrange
%   newpath
%      xmin ymin l@pl@n pointplan smoveto
%      xmin ymax l@pl@n pointplan slineto
%      xmax ymax l@pl@n pointplan slineto
%      xmax ymin l@pl@n pointplan slineto
%      xmin ymin l@pl@n pointplan slineto
%      planprojpst projpath
%   clip
%   solidlinewidth setlinewidth
   newpath
      linecolor
      range aload pop { function cvx exec } CourbeR2_
      gere_pstricks_proj_opt
} def

/proj-pst-courbe {
   l@pl@n plangetrange aload pop
   setyrange setxrange
%   newpath
%      xmin ymin l@pl@n pointplan smoveto
%      xmin ymax l@pl@n pointplan slineto
%      xmax ymax l@pl@n pointplan slineto
%      xmax ymin l@pl@n pointplan slineto
%      xmin ymin l@pl@n pointplan slineto
%      planprojpst projpath
%   clip
   solidlinewidth setlinewidth
   newpath
      linecolor
      range aload pop {} { function cvx exec } Courbeparam_
      gere_pstricks_proj_opt
} def

mercredi 3 octobre 2012

Les pâtes alimentaires façon PSTricks - 4 : les Macaroni

Toujours dans la suite des belles recettes de pâtes italiennes élaborées par Sander Huisman avec les outils de Mathematica et transposées avec les outils PSTricks et plus précisément du package pst-solides3d, voici, après les Gemelli, les Cellentani, et les Penne, les Macaroni.
La difficulté a été de donner aux pâtes une certaine épaisseur. J'ai opté pour le calcul intégral de ce modèle, à partir de l'exemple des anneaux (newanneau dans pst-solides3d.pro). Il y a certainement au moins une autre façon de faire...
Pour faciliter les essais de mise en page, les caractéristiques du Macaroni ont été, dans un premier temps, enregistrées sur le disque avec l'option "writesolid" : c'est le fichier "macaroni-write.tex" su sous-dossier macaroni du dossier ::
L'image obtenue :

Les fichiers sont dans le répertoire :

Les listings :
L'écriture des caractéristiques 

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage{pst-solides3d}
\title{Les pâtes alimentaires façon PSTricks - 4 :\\ Les Macaroni}
\date{3 octobre 2012}
\begin{document}

\begin{center}
Macaroni
\begin{pspicture}(-5,-5)(5,5)
\psset{lightsrc=20 0 20 rtp2xyz,viewpoint=20 20 20 rtp2xyz,Decran=20}
\pstVerb{
         /rr0 0.5 def
         /rr1 0.65 def
         /Rr 2.5 def
         /ar 2 def
         /BASE [0 ar 360 {/I exch def
                0
                Rr rr1 I cos mul add
                rr1 I sin mul
                } for
                360 ar neg 0 {/J exch def
                0
                Rr rr0 J cos mul add
                rr0 J sin mul
                } for
                ] bind def
/nS BASE length 3 idiv def
BASE 36
   /n2 exch def % nombre de méridiens
   /S1 exch def
   %% nombre de sommets
   /n1 S1 length 3 idiv def
   /tab S1
      n2 {
         duparray
         {0 0 180 n2 div rotateOpoint3d} papply3d
      } repeat
      n2 {append} repeat
   def
   /NS tab length 3 idiv def
   /Faces {
      0 1 n2 1 sub {
         /j exch def
         n1 j mul 1 j 1 add n1 mul 2 sub {
            /i exch def
            [i 1 add i dup n1 add i n1 1 add add]
         } for
         [n1 j mul j 1 add n1 mul 1 sub j 2 add n1 mul 1 sub j 1 add n1 mul]
      } for
   [nS 1 sub -1 0 {} for]
   [NS nS 2 idiv sub 1 sub -1 NS nS sub {}for
    NS 1 sub -1  NS nS 2 idiv sub {} for
   ]
   } def
/Sommets {tab aload pop} def
}%
\psSolid[object=new,sommets=Sommets,faces={Faces},
         incolor={[hsb]{0.118 1 1}},
         fillcolor={[hsb]{0.118 1 1}},grid,
         action=writesolid,file=macaroni](0,0,0)%
\end{pspicture}
\end{center}
\end{document}

L'image :

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[T1]{fontenc}
\usepackage{pst-solides3d}
\usepackage{pst-grad,pst-text}
\title{Les pâtes alimentaires façon PSTricks - 4 :\\ Les Macaroni}
\date{3 octobre 2012}
\pagestyle{empty}
\begin{document}
\maketitle
\begin{center}
\begin{pspicture}(-4,-5)(4,7)
\psframe[fillstyle=gradient,gradbegin=blue,gradend=blue!50](-4,-5)(4,7)
\psellipse*[linecolor=white](0,5.8)(2,0.75)
\psellipse[linecolor=red,linewidth=0.1](0,5.8)(2,0.75)
\psellipse*[linecolor=red](0.3,5.8)(1.5,0.5)
\rput(0.3,5.8){\pscharpath[fillstyle=solid,fillcolor=white,linestyle=none]{\fontfamily{phv}\fontsize{25}{25}\selectfont\itshape Barilla}}
\rput(0.3,3.25){\pscharpath[fillstyle=solid,fillcolor=white,linestyle=none]{\fontfamily{phv}\fontsize{20}{20}\selectfont MACARONI}}
\rput(0.3,-4){\huge\textbf{\textsf{\green{}IT{}\white{}AL{}\red {}IA}}}
\psset{lightsrc=20 0 30 rtp2xyz,viewpoint=20 30 40 rtp2xyz,Decran=15}
\psSolid[object=datfile,grid,
         incolor={[hsb]{0.118 1 1}},fillcolor={[hsb]{0.118 1 1}},
         file=macaroni]
%% definition du plan de projection
\psset{solidmemory}
\defFunction[algebraic]{cercle1}(t){0.65*sin(t)}{2.5+0.65*cos(t)}{}
\defFunction[algebraic]{cercle2}(t){0.5*sin(t)}{2.5+0.5*cos(t)}{}
\defFunction[algebraic]{cercle3}(t){0.65*sin(t)}{-2.5+0.65*cos(t)}{}
\defFunction[algebraic]{cercle4}(t){0.5*sin(t)}{-2.5+0.5*cos(t)}{}
\psSolid[object=plan,
   definition=equation,
   args={[1 0 0 0]},
   base=-4 4 -4 4,
   action=none,
   name=planA
]
\psset{plan=planA}
\psProjection[object=courbeR2,
   linewidth=0.02,linecolor={[rgb]{0.4 0.2 0}},
   range=0 2 Pi mul,resolution=360,
   function=cercle1
]
\psProjection[object=courbeR2,
   linewidth=0.02,linecolor={[rgb]{0.4 0.2 0.2}},
   range=0 2 Pi mul,resolution=360,
   function=cercle2
]
\psProjection[object=courbeR2,
   linewidth=0.02,linecolor={[rgb]{0.4 0.2 0.2}},
   range=0 2 Pi mul,resolution=360,
   function=cercle3
]
\psProjection[object=courbeR2,
   linewidth=0.02,linecolor={[rgb]{0.4 0.2 0.2}},
   range=0 2 Pi mul,resolution=360,
   function=cercle4
]
%\axesIIID(0,0,0)(5,5,5)
\composeSolid
\end{pspicture}
\end{center}
\end{document} 

Un compas dessiné avec PSTricks par Thomas Söll

Encore une réalisation de Thomas Söll : un vrai travail d'artiste ! Les fichiers (Thomas.Soell/Zirkel.pdf Thomas.Soell/Zirkel.tex) sont dans :


Le listing :

\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-grad}

\begin{document}
\psscalebox{1.5}{%
\begin{pspicture}(1.5,0)(6,7.5)
\def\alf{20}
\rput[br]{\alf}(3.1,8.1){%
\pspolygon[linewidth=0.5pt,fillstyle=gradient,gradangle=90,gradend=cyan!30,gradbegin=black!70,linearc=0.02]%
(-0.12,0)(0.12,0)(0.12,-5.0)(0.08,-5.5)(-0.11,-5.5)(-0.12,-5.1)
\pscircle[linecolor=black!60,linewidth=0.4pt,fillstyle=solid, fillcolor=black!20](0,-5.3){0.14}%
\pspolygon[linewidth=0.3pt](-0.03,-5.5)(0.03,-5.5)(0,-6)
}
\rput[br]{-\alf}(2.9,8.1){%
\pspolygon[linewidth=0.5pt,fillstyle=gradient,gradangle=90,gradend=cyan!30,gradbegin=black!70,linearc=0.02]%
(-0.12,0)(0.12,0)(0.12,-5.0)(0.08,-5.5)(-0.11,-5.5)(-0.12,-5.1)
\pscircle[linecolor=black!60,linewidth=0.4pt,fillstyle=solid, fillcolor=black!20](0,-5.3){0.14}%
\pspolygon[fillstyle=solid,fillcolor=black!90](-0.035,-5.5)(0.035,-5.5)(0.035,-6)(-0.03,-5.8)
}
\psframe[fillstyle=gradient,gradangle=90,gradend=cyan!30,gradbegin=black!70](2.9,8.15)(3.1,8.35)
\pspolygon[fillstyle=gradient,gradangle=90,gradend=gray!30,gradbegin=black!70,linearc=0.04](2.75,8.2)(3.25,8.2)(3.25,7.5)(3.1,7.45)(3.1,7.1)(2.9,7.1)(2.9,7.45)(2.75,7.5)
\pscircle[linecolor=black!80,linewidth=0.4pt,fillstyle=solid, fillcolor=black!80](3,8){0.07}
\psframe[fillstyle=gradient,gradangle=90,gradend=cyan!30,gradbegin=black!70](2.83,8.3)(3.17,9.1)
\psline[linewidth=0.4pt](2.915,8.3)(2.915,9.1)%
\psline[linewidth=0.4pt](3,8.3)(3,9.1)%
\psline[linewidth=0.4pt](3.085,8.3)(3.085,9.1)%
\end{pspicture}
}
\end{document}

Le rapporteur-équerre dessiné avec PSTricks par Thomas Söll

Comme d'habitude Thomas a réalisé un travail très soigné, voici les fichiers  (protrace.pdf protrace.tex) inclus dans:


Vous trouverez d'autres dessins de rapporteurs, plus modestes, réalisés avec PSTricks ici :
http://melusine.eu.org/syracuse/pstricks/rapporteurs/

Ci-dessous le listing :

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[frenchstyle]{kpfonts}
\usepackage{pstricks}
%\usepackage[distiller]{pstricks}
\usepackage{multido}
\def\protrace{%
\psset{unit=1.5,dimen=middle}
\SpecialCoor
%
\scriptsize
\begin{psclip}%
{\pspolygon[linestyle=none,linewidth=0pt,fillstyle=solid,fillcolor=white,opacity=0.3](-4.675,0.125)(4.675,0.125)(0,4.8)}%
\pspolygon[linewidth=0pt,fillstyle=solid,fillcolor=lightgray!30,linestyle=none,opacity=0.4](-5,0)(5,0)(0,5)%
\end{psclip}%
\begin{psclip}%
{\pspolygon[linestyle=none](5,0)(4.85,0)(-0.15,5)(0,5)}%
\multido{\n=1+1}{89}{%
\rput[l]{\n}(!\n\space dup sin exch cos div dup 1 add 5 exch div exch 1 index mul)%
{\psline[linewidth=.25\pslinewidth](0,0)(-.2,0)}%
}%
\end{psclip}%
\begin{psclip}%
{\pspolygon[linestyle=none](-5,0)(-4.85,0)(0.15,5)(0,5)}%
\multido{\n=1+1}{89}{%
\rput[l]{-\n}(!\n\space dup sin exch cos div dup 1 add 5 exch div neg exch 1 index mul neg)%
{\psline[linewidth=.25\pslinewidth](0,0)(.2,0)}%
}%
\end{psclip}%
\multido{\n=5+10}{9}{%
\rput[l]{\n}(!\n\space dup sin exch cos div dup 1 add 5 exch div exch 1 index mul)%
{\psline[linewidth=.5\pslinewidth](0,0)(-.4,0)}%
\rput[l]{-\n}(!\n\space dup sin exch cos div dup 1 add 5 exch div neg exch 1 index mul neg)%
{\psline[linewidth=.5\pslinewidth](0,0)(.4,0)}%
}%
\multido{\n=10+10}{8}{%
\psline(3.15;\n)(!\n\space dup sin exch cos div dup 1 add 5 exch div exch 1 index mul)%
\psline(-3.15;-\n)(!\n\space dup sin exch cos div dup 1 add 5 exch div neg exch 1 index mul neg)%
}%
\multido{\n=6+1}{84}{%
\psline[linewidth=.5\pslinewidth](-2.77;-\n)(-2.7;-\n)%
\psline[linewidth=.5\pslinewidth](2.77;\n)(2.7;\n)%
}%
\multido{\n=5+5}{17}{%
\psline(2.81;\n)(2.7;\n)%
\psline(-2.81;-\n)(-2.7;-\n)%
}
\psline[linestyle=dashed,dash=7pt 4pt](-2.6;-45)(-.5;-45)%
\psline[linestyle=dashed,dash=7pt 4pt](2.6;45)(.5;45)%
%
\pscustom[fillstyle=solid,fillcolor=yellow,linestyle=none,opacity=0.6]{%
\psarc(0,0){2.85}{7}{173}%
\psarcn(0,0){3.15}{173}{7}%
}%
{\multido{\n=10+10}{17}{\rput{0}(3;\n){\n}}}%
\multido{\n=0+1}{8}{\rput{180}(!\n\space 0.625 mul 0.25){\n}}%
\multido{\n=1+1}{7}{\rput{180}(!\n\space 0.625 mul neg 0.25){\n}}%
\multido{\n=-70+1}{141}{\rput{180}(!\n\space 0.0625 mul neg 0){\psline[linewidth=0.5\pslinewidth](0,0)(0,-0.08)}}%
\multido{\n=-14+1}{29}{\rput{180}(!\n\space 0.3125 mul neg 0){\psline(0,0)(0,-0.13)}}%
%
\multido{\n=3+1}{30}{\rput{180}(!0 \n\space 0.0625 mul 0.03 add){%
\psline[linewidth=0.5\pslinewidth](-1.625,0)(-1.5,0)%
\psline[linewidth=0.5\pslinewidth](1.625,0)(1.5,0)%
}}%
%
\begin{psclip}%
{\pscircle[linestyle=none](0,0){2.6}}%
\multido{\n=1+1}{7}{\rput{180}(!0 \n\space 0.3125 mul 0.03 add){%
\psline(-2.6,0)(-1.69,0)%
\psline(2.6,0)(1.69,0)%
\psline(1.625,0)(1.4375,0)%
\psline(-1.625,0)(-1.4375,0)%
\psline(1.1875,0)(0.15,0)%
\psline(-1.1875,0)(-0.15,0)%
}}%
\multido{\n=1+1}{3}{%
\rput{180}(!1.3 \n\space 0.625 mul 0.03 add){\n}%
\rput{180}(!-1.3 \n\space 0.625 mul 0.03 add){\n}%
}%
\end{psclip}%
%
\psline(0.4;90)(2.85;90)%
\psline(3.15;90)(5;90)%
\pspolygon(5,0)(0,5)(-5,0)%
}


\begin{document}
\begin{center}
\begin{pspicture}(-5,0)(5,5)
\protrace
\end{pspicture}
\end{center}

\begin{center}
\begin{pspicture}(-5,0)(5,8)
\rput{30}(0,0){\psscalebox{0.6}{%
\protrace%
}}%
\end{pspicture}
\end{center}

\end{document}