lundi 30 décembre 2013

Dessiner l’ombre d’un objet avec pst-solides3d

La source de lumière étant ponctuelle, il est simple avec pst-solides3d, de dessiner l’ombre portée d’un objet sur un plan, horizontal(le sol) ou vertical (un mur).

Ombres sur un sol horizontal
Pour que l’ombre de l’objet soit visible, il faut que les coordonnées de la source de lumière et du point de vue soient différentes.

Ombres sur un mur vertical
Les explications théoriques et les macros sont dans le document "ombre1.pdf" (fichier source : ombre1.tex) du répertoire :

 Les fichiers de données de la tête de Néfertiti sont inclus dans ce répertoire.

Le listing du fichier :

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{pst-solides3d}
\title{Dessiner l'ombre d'un objet avec pst-solides3d}
\date{29 décembre 2013}
\begin{document}
\maketitle

La source de lumière étant ponctuelle, il est simple avec pst-solides3d, de dessiner l'ombre portée d'un objet sur un plan, horizontal(le sol) ou vertical (un mur). Ce court document décrit une méthode pour le faire.
\section{Ombre sur un sol horizontal}
\begin{center}
\psset{viewpoint=100 30 30 rtp2xyz,Decran=30,lightsrc=20 120 30 rtp2xyz,a=4}%
\begin{pspicture}(-5,-4)(5,3)
\pstVerb{
20 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -2 def
/Hshadow {
5 dict begin
/M defpoint3d
 M
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 hZ neg]},action=draw,
         base=-15 15 -15 15,
         ngrid=5 5]%
\psSolid[object=cube,
         grid,fillcolor=black,
         transform=Hshadow,
         ](0,0,0)%
\psSolid[object=cube](0,0,0)%
% la source de lumière
\pstVerb{20 120 30 rtp2xyz /zL exch def /yL exch def /xL exch def}%
\psPoint(xL,yL,zL){L}
%Un sommet du cube
\psPoint(2,2,2){A}
\psPoint(-2,-2,2){B}
\psPoint(2,-2,2){C}
\pcline[nodesepB=4cm]{->}(L)(A)
\pcline[nodesepB=4cm]{->}(L)(B)
\pcline[nodesepB=5cm]{->}(L)(C)
\psline{->}(L)(A)\psline{->}(L)(B)\psline{->}(L)(C)
\pstVerb{2 2 2 Hshadow /zA' exch def /yA' exch def /xA' exch def}%
\psPoint(xA',yA',zA'){A'}
\pstVerb{-2 -2 2 Hshadow /zB' exch def /yB' exch def /xB' exch def}%
\psPoint(xB',yB',zB'){B'}
\pstVerb{2 -2 2 Hshadow /zC' exch def /yC' exch def /xC' exch def}%
\psPoint(xC',yC',zC'){C'}
\psline[linecolor=gray!20](A)(A')
\psline[linecolor=gray!20](B)(B')
\psline[linecolor=gray!20](C)(C')
\uput[r](L){L}
\uput[u](A){A}
\uput[d](A'){A'}
\end{pspicture}
\end{center}
Connaissant les coordonnées de la source de lumière $(x_L,y_L,z_L)$, celles du point à projeter, par exemple un sommet du cube $(x_A,y_A,z_A)$ et l'équation du plan $(z=h$, on en déduit les coordonnées de l'ombre portée du sommet sur le plan horizontal :
\[
\left\{
\begin{array}[m]{l}
x'=x_V+\lambda(x_A-x_V)\\
y'=y_V+\lambda(y_A-y_V)
\end{array}
\right.
\text{avec}\quad\lambda=\displaystyle\frac{h-z_V}{z_A-z_V}
\]
Pour que l'ombre de l'objet soit visible, il faut que les coordonnées de la source de lumière et du point de vue soient différentes. On utilise l'option \texttt{trasform=Hshadow} de pst-solides3d après avoir défini la transformation \texttt{Hshadow} :
\begin{verbatim}
\psset{viewpoint=100 60 30 rtp2xyz,Decran=50,lightsrc=100 120 30 rtp2xyz,a=2}%
\pstVerb{
100 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -1 def % position du plan horizontal (le sol)
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\end{verbatim}
\newpage
Quelques exemples, la source de lumière n'est pas toujours représentée. On dessine d'abord le plan de projection, puis l'ombre et enfin l'objet.

%\begin{center}
\begin{minipage}{9cm}
\begin{pspicture}(-5,-5)(5,5)
\psset{viewpoint=100 60 30 rtp2xyz,Decran=40,lightsrc=100 120 30 rtp2xyz,a=4}%
\pstVerb{
100 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -2 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 hZ neg]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=cube,
         trunccoeff=.2,
         trunc=all,
         grid,fillcolor=gray,linecolor=gray,
         transform=Hshadow,
%         opacity=0.9
         ](0,0,0)%
\psSolid[object=cube,
         trunccoeff=.2,
         trunc=all,
         fcol=6 1 13 { (rouge) } for,
         ](0,0,0)%
\end{pspicture}
\end{minipage}
\begin{minipage}{6cm}
\begin{verbatim}
\begin{pspicture}(-5,-5)(5,5)
\psset{viewpoint=100 60 30 rtp2xyz,Decran=50,lightsrc=100 120 30 rtp2xyz,a=2}%
\pstVerb{
100 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -1 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 hZ neg]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=cube,
         trunccoeff=.2,
         trunc=all,
         grid,fillcolor=gray,linecolor=gray,
         transform=Hshadow,
         opacity=0.9
         ](0,0,0)%
\psSolid[object=cube,
         trunccoeff=.2,
         trunc=all,
         fcol=6 1 13 { (rouge) } for,
         ](0,0,0)%
\end{pspicture}
\end{verbatim}
\end{minipage}
%\end{center}

\begin{center}
\psset{viewpoint=50 60 20 rtp2xyz,Decran=25,lightsrc=20 120 60 rtp2xyz}%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\pstVerb{
20 120 60 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ 0 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 0]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=sphere,r=2,
         grid,fillcolor=black,linecolor=black,
         transform=Hshadow,
         opacity=0.9,
         ngrid=18 18,
         ](0,0,2)%
\psSolid[object=sphere,
         ngrid=18 18
         ](0,0,2)%
\pstVerb{20 120 30 rtp2xyz /zL exch def /yL exch def /xL exch def}%
\psPoint(xL,yL,zL){L}
\psdot(L)
\end{pspicture}

\psset{viewpoint=50 60 20 rtp2xyz,Decran=25,lightsrc=50 20 30 rtp2xyz}%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\pstVerb{
50 20 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ 0 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 0]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=sphere,r=2,
         grid,fillcolor=black,%linecolor=gray,
         transform=Hshadow,
%         linewidth=0.001,
         ngrid=18 18,
%         opacity=0.95,
%         strokeopacity=0.95
         ](0,0,2)%
\psSolid[object=sphere,
         ngrid=18 18
         ](0,0,2)%
\end{pspicture}

\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\pstVerb{
50 20 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ 0 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 0]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=cylindre,r=2,h=6,
         grid,fillcolor=black,%linecolor=gray,
         transform=Hshadow,
%         linewidth=0.001,
         ngrid=1 36,
%         opacity=0.95,
%         strokeopacity=0.95
         ](5,0,0)%
\psSolid[object=cylindre,h=6,
         ngrid=1 36
         ](5,0,0)%
\end{pspicture}

\begin{pspicture}(-5,-5)(5,5)
\psset{viewpoint=50 60 5 rtp2xyz,Decran=25,lightsrc=10 120 30 rtp2xyz}%
\psframe(-5,-5)(5,5)
\pstVerb{
10 120 30 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/hZ -4 def
/Hshadow {
5 dict begin
/z exch def
/y exch def
/x exch def
/lambda hZ zV sub z zV sub div def
    xV lambda x xV sub mul add % x
    yV lambda y yV sub mul add % y
    hZ % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 0 1 hZ neg]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[r1=2.5,r0=1.5,
         object=tore,
         ngrid=18 36,
         grid,fillcolor=black,%linecolor=gray,
         transform=Hshadow,
         ngrid=1 36,
         ](0,0,0)%
\psSolid[r1=2.5,r0=1.5,
         object=tore,
         ngrid=18 36
         ](0,0,0)%
\pstVerb{10 120 30 rtp2xyz /zL exch def /yL exch def /xL exch def}%
\psPoint(xL,yL,zL){L}
\psdot[linecolor=red](L)
\end{pspicture}
\end{center}
\newpage
\section{Ombre sur un mur vertical}
Mur parallèle au plan $Oyz$ : $x=x_0$. Les équations précédentes s'écrivent :
\[
\left\{
\begin{array}[m]{l}
y'=y_V+\lambda(y_A-y_V)\\
z'=z_V+\lambda(z_A-z_V)
\end{array}
\right.
\text{avec}\quad\lambda=\displaystyle\frac{x_0-x_V}{x_A-x_V}
\]
\begin{center}
\psset{viewpoint=50 60 20 rtp2xyz,Decran=25,lightsrc=10 0 20 rtp2xyz}%
\begin{pspicture}(-5,-6)(5,7)
\psframe(-5,-6)(5,7)
\pstVerb{
10 0 20 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/x_0 -8 def
/Vshadow {
4 dict begin
/z exch def
/y exch def
/x exch def
/lambda x_0 xV sub x xV sub div def
    x_0
    yV lambda y yV sub mul add % y
    zV lambda z zV sub mul add % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[1 0 0 x_0 neg]},
         base=-10 10 -10 10,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psSolid[object=sphere,r=2,
         grid,fillcolor=black,linecolor=black,
         transform=Vshadow,
         ngrid=18 18,
         ](0,0,0)%
\psSolid[object=sphere,
         ngrid=18 18
         ](0,0,0)%
\pstVerb{10 0 20 rtp2xyz /zL exch def /yL exch def /xL exch def}%
\psPoint(xL,yL,zL){L}
\psdot[linecolor=red](L)
\end{pspicture}
\end{center}
\newpage
Mur parallèle au plan $Oxz$ : $y=y_0$. Les équations précédentes s'écrivent :
\[
\left\{
\begin{array}[m]{l}
x'=x_V+\lambda(x_A-x_V)\\
z'=z_V+\lambda(z_A-z_V)
\end{array}
\right.
\text{avec}\quad\lambda=\displaystyle\frac{y_0-y_V}{y_A-y_V}
\]
\begin{center}
%\psset{unit=0.4}
\psset{viewpoint=50 60 0 rtp2xyz,Decran=25,lightsrc=50 100 -10 rtp2xyz}
\begin{pspicture}(-5,-7)(6,6)
\definecolor{AntiqueWhite}{rgb}{0.98,0.92,0.84}
\definecolor{rose}{rgb}{1,0.75,0.74}
\psframe*[linecolor=AntiqueWhite](-7,-7)(6,6)
\pstVerb{
50 100 -10 rtp2xyz
/zV exch def
/yV exch def
/xV exch def
/y_0 -8 def
/Vshadow {
4 dict begin
/z exch def
/y exch def
/x exch def
/lambda y_0 yV sub y yV sub div def
    xV lambda x xV sub mul add % x
    y_0
    zV lambda z zV sub mul add % z
end
 } def }%
\psSolid[object=plan,definition=equation,
         args={[0 1 0 y_0 neg]},
         base=-10 10 -10 15,
         ngrid=5 5,
         linecolor=green!20!black,
         fillcolor=green!20]%
\psset{RotX=90,RotZ=90,sommets= (sommets_nefer0.dat) run}
\psSolid[object=new,hollow,
         grid,fillcolor=black,linecolor=black,incolor=black,
         transform=Vshadow,
         faces={(faces_nefer.dat) run}
         ](0,0,0)%
\psSolid[object=new,fillcolor=rose,linewidth=0.5\pslinewidth,hollow,incolor=yellow!50,
    faces={(faces_nefer.dat) run}]%
\psSolid[object=new,fillcolor=red,linewidth=0.5\pslinewidth,
    faces={(faces_nefer_levres.dat) run}]%
\psSolid[object=new,fillcolor=black,
    faces={(faces_nefer_sourcils.dat) run}]%
\end{pspicture}
\end{center}
\end{document}


jeudi 19 décembre 2013

Jeu de dés avec pst-solides3d

La commande : \psDie[options](x,y) construite à partir d’un cube dont on a tronqué les sommets comprend les options suivantes :
  1. [sidecolor=white],
  2. [dotcolor=black],
  3. [truncationcolor=red].
 permettant de choisir la couleur des faces, des points et des facettes résultant des troncatures aux sommets, les couleurs indiquées sont celles par défaut. Entre parenthèses (x,y) on indique les coordonnées de la projection du centre du dé sur le tapis de jeu.
On pourra modifier l’arête du cube avec [a=value]. Une option permet de dessiner ou d’occulter le tapis de jeu : [carpet=true].
Le générateur de nombres aléatoires est celui de Donald Arseneau :
 http://www.ctan.org/pkg/random
Il utilise pour nombre initial un nombre calculé à partir de la date de compilation : année, mois, jour, heure et minutes. On peut choisir soi-même ce nombre initial avec la variable randomi=nombre entier, cette valeur initiale ne doit pas dépasser : 2^31 −1 = 2147483647.
Pour placer les cubes aléatoirement sur le tapis, j’ai introduit une variable \CY, qu’on peut utiliser ou pas, il faut éviter que les cubes se chevauchent après le lancer. Voici un exemple de lancé “simultané” de trois dés.

Dans le premier épisode de ``La légende de Zatoichi", au tout début, une partie de dés très étonnante, se joue entre Zatoichi et les hommes de main du \textit{parrain} chez lequel Zatoichi est en visite. En attendant l'arrivée du parrain, on l'installe dans une pièce où les yakusas  sont en train de disputer une partie de dés. Ce jeu consiste à placer deux dés dans un cornet à dés, un joueur ou le maître de jeu secoue le gobelet puis retourne le brusquement sur le tapis cachant ainsi la répartition des dés à l'intérieur du gobelet. Les joueurs misent alors pair ou impair sur la somme des points des faces supérieures et, les mises faites, un joueur soulève alors le cornet pour faire apparaître les dés. Zatoichi sollicite la permission de participer au jeu, qui lui est accordée, les yakusas pensant berner Zatoichi qui est aveugle. Pour ceux qui ne connaissent pas le personnage, je précise que Zatoichi est un masseur aveugle itinérant, mais aussi un redoutable sabreur dont les autres sens, l'ouïe et l'odorat sont particulièrement développés. Cette partie où Zatoichi plume les yakusas et leur fait une leçon de morale est un superbe moment cinématographique. Dans la suite des épisodes Zatoichi participe à de nombreuses autres parties de dés.

Les fichiers "dice-games.pdf" et "dice-games.tex" sont dans le dossier :
En fait, cette commande est une adaptation d'un ancien fichier "Die3D.pdf" et "Die3D.tex", pour les archives(?) qui est dans le dossier indiqué précedemment.

==================================================================
Le listing du nouveau fichier :

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[latin1]{inputenc}
\usepackage[garamond]{mathdesign}
\usepackage[T1]{fontenc}
\usepackage{pst-solides3d}
\usepackage{url}
%\usepackage{datetime}
% Le générateur de nombres aléatoires est de
% Donald Arseneau
\input random
\pagestyle {empty}
\newpsstyle{sol}{fillstyle=crosshatch,hatchcolor=green,hatchwidth=0.25\pslinewidth,hatchsep=5\pslinewidth}
% variables aléatoires
% rotations du dé autour de Ox, Oy et Oz
\newcount\diex
\newcount\diey
\newcount\diez
% position du dé suivant l'axe Oy
\newcount\CY
\makeatletter
\pst@addfams{pst-die3d}
\define@key[psset]{pst-die3d}{sidecolor}{\edef\psk@sidecolor{#1}}%
\psset[pst-die3d]{sidecolor=white}
%color truncations
\define@key[psset]{pst-die3d}{truncationcolor}[red]{\pst@getcolor{#1}\truncationcolor}
\psset[pst-die3d]{truncationcolor=red}
%
\define@key[psset]{pst-die3d}{dotcolor}{\edef\psk@dotcolor{#1}}%
\psset[pst-die3d]{dotcolor=black}
%
\newif\ifPst@carpet%
\define@key[psset]{pst-die3d}{carpet}[false]{\@nameuse{Pst@carpet#1}}%
\psset[pst-die3d]{carpet=true}
%
\def\psDie{\def\pst@par{}\pst@object{psDie}}
\def\psDie@i(#1,#2){%
\begin@SpecialObj
\pstVerb{
         /carpet \pst@solides@a\space 5 mul def
         /posP \pst@solides@a\space 0.3 mul def
         /rP \pst@solides@a\space 0.1 mul def
         /dP \pst@solides@a\space 2 div def
         /a_2 \pst@solides@a\space 2 div def
         /truncationcolor {\pst@usecolor\truncationcolor } def}%
\ifPst@carpet
\psSolid[object=plan,definition=equation,
         args={[0 0 1 dP]},
         base=carpet neg carpet carpet neg carpet,
%         plangrid,
         ngrid=\pst@solides@a\space 5 mul cvi \pst@solides@a\space 5 mul cvi,
         linecolor=green!20!black,
         fillcolor=green!20]%
\fi
\psset{solidmemory}
\setrannum{\diex}{-1}{2}
\setrannum{\diey}{-1}{2}
\setrannum{\diez}{1}{360}
\multiply\diex90
\multiply\diey90
\psSolid[object=cube,
         trunccoeff=.1,
         trunc=all,
         RotX=\the\diex,RotY=\the\diey,RotZ=\the\diez,
         fillcolor=\psk@sidecolor,
         fcol=6 1 13 { (truncationcolor) } for,
         name=A
         ](#1,#2,0)%
\psSolid[object=plan,action=none,
         definition=solidface,args=A 0,name=P0]
\psset{plan=P0}
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=0 0 rP,
              range=0 360]
\psSolid[object=plan,action=none,
         definition=solidface,args=A 1,name=P1]
\psset{plan=P1}
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=0 0 rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP posP rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP neg posP neg rP,
              range=0 360]
\psSolid[object=plan,action=none,
         definition=solidface,args=A 2,name=P2]
\psset{plan=P2}
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP posP rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP neg posP neg rP,
              range=0 360]
\psSolid[object=plan,action=none,
         definition=solidface,args=A 3,name=P3]
\psset{plan=P3}
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP posP rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP posP neg rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP neg posP rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP neg posP neg rP,
              range=0 360]
\psSolid[object=plan,action=none,
         definition=solidface,args=A 4,name=P4]
\psset{plan=P4}
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=0 0 rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP posP rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP neg posP neg rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP posP neg rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP neg posP rP,
              range=0 360]
\psSolid[object=plan,action=none,
         definition=solidface,args=A 5,name=P5]
\psset{plan=P5}
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=0 posP rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=0 posP neg rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP posP rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP neg posP neg rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP posP neg rP,
              range=0 360]
\psProjection[object=cercle,fillstyle=solid,fillcolor=\psk@dotcolor,
              args=posP neg posP rP,
              range=0 360]
 \end@SpecialObj
}
\makeatother
\title{Jeu de dés avec pst-solides3d}
\date{19 décembre 2013}
\begin{document}
\maketitle
La commande : \verb+\psDie[options](x,y)+ construite à partir d'un cube dont on a tronqué les sommets  comprend les options suivantes :
\begin{enumerate}
  \item \texttt{[sidecolor=white]},
  \item \texttt{[dotcolor=black]},
  \item \texttt{[truncationcolor=red]}.
\end{enumerate}
permettant de choisir la couleur des faces, des points et des facettes résultant des troncatures aux sommets, les couleurs indiquées sont celles par défaut. Entre parenthèses \verb+(x,y)+ on indique les coordonnées de la projection du centre du dé sur le tapis de jeu.

On pourra modifier l'arête du cube avec \verb+[a=value]+.
Une option permet de dessiner ou d'occulter le tapis de jeu :
\begin{itemize}
  \item \texttt{[carpet=true]}
\end{itemize}
Le générateur de nombres aléatoires est celui de Donald Arseneau :
\url{http://www.ctan.org/pkg/random}

Il utilise pour nombre initial un nombre calculé à partir de la date de compilation : année, mois, jour, heure et minutes. On peut choisir soi-même ce nombre initial avec la variable \verb+randomi=nombre entier+, cette valeur initiale ne doit pas dépasser : $2^{31}-1=2147483647$.

Pour placer les cubes aléatoirement sur le tapis, j'ai introduit une variable \verb+\CY+, qu'on peut utiliser ou pas, il faut éviter que les cubes se chevauchent après le lancer. Voici un exemple de lancé ``\textit{simultané}'' de trois dés.
\begin{center}
\psset{viewpoint=30 60 25 rtp2xyz,Decran=12,lightsrc=viewpoint,a=2}%
\begin{pspicture}(-7,-5)(7,2)
\psframe*(-7,-5)(7,2)
\setrannum{\CY}{-2}{8}
\psDie[sidecolor=yellow](6,\the\CY)%
\setrannum{\CY}{-2}{8}
\psDie[carpet=false](-4,\the\CY)%
\setrannum{\CY}{-2}{8}
\psDie[carpet=false,dotcolor=red,sidecolor=cyan!50](0,\the\CY)%
\end{pspicture}
\end{center}
\begin{verbatim}
\begin{center}
\psset{viewpoint=30 60 25 rtp2xyz,Decran=12,lightsrc=viewpoint,a=2}%
\begin{pspicture}(-7,-5)(7,2)
\psframe*(-7,-5)(7,2)
\setrannum{\CY}{-2}{8}
\psDie[sidecolor=yellow](6,\the\CY)%
\setrannum{\CY}{-2}{8}
\psDie[carpet=false](-4,\the\CY)%
\setrannum{\CY}{-2}{8}
\psDie[carpet=false,dotcolor=red,sidecolor=cyan!50](0,\the\CY)%
\end{pspicture}
\end{center}
\end{verbatim}
Dans le premier épisode de ``La légende de Zatoichi", au tout début, une partie de dés très étonnante, se joue entre Zatoichi et les hommes de main du \textit{parrain} chez lequel Zatoichi est en visite. En attendant l'arrivée du parrain, on l'installe dans une pièce où les yakusas  sont en train de disputer une partie de dés. Ce jeu consiste à placer deux dés dans un cornet à dés, un joueur ou le maître de jeu secoue le gobelet puis retourne le brusquement sur le tapis cachant ainsi la répartition des dés à l'intérieur du gobelet. Les joueurs misent alors pair ou impair sur la somme des points des faces supérieures et, les mises faites, un joueur soulève alors le cornet pour faire apparaître les dés. Zatoichi sollicite la permission de participer au jeu, qui lui est accordée, les yakusas pensant berner Zatoichi qui est aveugle. Pour ceux qui ne connaissent pas le personnage, je précise que Zatoichi est un masseur aveugle itinérant, mais aussi un redoutable sabreur dont les autres sens, l'ouïe et l'odorat sont particulièrement développés. Cette partie où Zatoichi plume les yakusas et leur fait une leçon de morale est un superbe moment cinématographique. Dans la suite des épisodes Zatoichi participe à de nombreuses autres parties de dés.

\begin{center}
\psset{viewpoint=30 30 45 rtp2xyz,Decran=10,lightsrc=viewpoint,a=2}%
\begin{pspicture}(-5,-5)(4,3)
\psframe*(-5,-5)(4,3)
\psDie[sidecolor=yellow](0,0)%
\psDie[sidecolor=yellow,carpet=false](2.5,2.5)%
\psSolid[object=cylindre,
         h=7,r=4,rm=1,
         fillcolor={[rgb]{0.875 0.75 0.5}},
         opacity=0.5,grid,
         ngrid=4 32](0,2,-1)
\end{pspicture}
\end{center}
\newpage
\begin{center}
\psset{viewpoint=30 60 25 rtp2xyz,Decran=14,lightsrc=viewpoint,a=2}%
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie[sidecolor=yellow,dotcolor=blue,truncationcolor=green,linecolor=red](0,0)
\end{pspicture*}
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\end{center}
\begin{center}
\psset{viewpoint=50 60 25 rtp2xyz,Decran=25,lightsrc=viewpoint,a=2}%
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\end{center}
\begin{center}
\psset{viewpoint=50 60 25 rtp2xyz,Decran=25,lightsrc=viewpoint,a=2}%
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(-2,-2)
\end{pspicture*}
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\end{center}
\begin{center}
\psset{viewpoint=50 60 25 rtp2xyz,Decran=25,lightsrc=viewpoint,a=2}%
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\begin{pspicture*}(-2,-2)(2,2)
\psframe(-2,-2)(2,2)
\psDie(3,2)
\end{pspicture*}
\end{center}
\end{document}



mardi 17 décembre 2013

pst-solides3d : choisir la séquence des rotations

pst-solides3d  ne permet pas de choisir, tout au moins directement, l'ordre des rotations d'un solide autour des axes Ox, Oy et Oz. Cet ordre est imposé : d'abord autour de Ox, puis de Oy et ensuite de Oz. On peut, si cet ordre ne convient pas, faire la rotation autour du premier axe choisi,  puis sauvegarder le solide et continuer dans l'ordre des rotations souhaité. C'est fastidieux. Cette modification des fichiers de pst-solides3d.tex et pst-solides3d.pro,  permet grâce à une commande supplémentaire de choisir l'ordre des rotations autour des axes, il s'agit de la commande :
RotSequence=xyz,xzy, etc.
qui donne l'ordre des rotations. Les schémas ci-dessous sont une illustration de cette commande :
Les fichiers se trouvent ici :


mercredi 11 septembre 2013

Pavages hyperboliques avec PSTricks

C'est un sujet qui est abondamment traité sur internet avec de remarquables réalisations. Cette modeste contribution est réalisée avec PSTricks,  elle permettra de personnaliser de façon simple vos dessins.
Cette étude s'appuie sur le remarquable document de Patrick Fradin :
http://melusine.eu.org/syracuse/texgraph/exemples/hpavages/
ainsi que sur les discussions qui ont eu lieu sur le forum de TeXgraph :
http://texgraph.tuxfamily.org/forum/index.php

Une documentation succincte et quelques exemples accompagnent le package qui est dédié à ce type de pavage sur PSTricks :
Le package comprenant les 3 fichiers :

pst-hyptil.pro
pst-hyptil.sty
pst-hyptil.tex


et la documentation avec les 3 fichiers :

pst-hyptil-doc.tex
pst-hyptil-doc.ps
pst-hyptil-doc.pdf

sont dans le répertoire :
Quelques exemples :

Les deux types de pavages :
  • Symétrie par rapport aux milieux des côtés du polygone de base, avec l’option : [type=SymMiddle],qui est l’option par défaut, ou :
     
  •  Réflexion par rapport aux côtés du polygone de base : [type=Reflect]
On voit la différence sur les 2 dessins ci-dessous :

Suivant le nombre d'itérations :



mardi 13 août 2013

La perspective linéaire avec PSTricks

Il s'agit d'une application des packages pst-nltr et pst-solides3d dédiée à la représentation des objets en perspective linéaire. Les fichiers perspective-lineaire.pdf et perspective-lineaire.tex sont dans le sous-dossier juillet2013 du dossier :

Les dessins au format eps (mickey2.eps et Bart.eps) servant à illustrer ce document sont inclus dans le répertoire qui contient le package pst-nltr (pst-nltr.pro, pst-nltr.tex, pst-nltr.sty), il est indiqué ci-dessus.
Ce document comprend une étude théorique et des exemples. En voici quelques images :

Mickey dans le quadrillage est l’image que le peintre doit représenter sur sa toile.
Ci-dessous le dessin du peintre :



dimanche 4 août 2013

Variations typographiques : Dans la Bulle


Bonnes Vacances !

Le code permettant de produire les 36 images :

\documentclass{article}
\usepackage{pst-nltr}
\pagestyle{empty}
\begin{document}

\begin{center}
\multido{\i=-180+10}{36}{%
\begin{pspicture}(-5,-5)(5,5)
\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt](-5,-5)(5,5)
\psframe*[linecolor=cyan!5](-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\def\SIZEFONT{0.75 }%
\pstVerb{
/SIZEFONT \SIZEFONT def
/arccos {
   dup
   dup mul neg 1 add sqrt
   exch
   atan
} def
/Hb \i\space cos 0.75 mul def
/Hs \i\space cos 0.1 mul def
/rotB \i\space cos 30 mul def
/FC {
   /y exch def
   /x exch def
% wx est la largeur du texte
% wx/2 est le rayon de la bulle
% je prends 1.99 au lieu de 2
% pour éviter une erreur dans le calcul de arccos
   /xM wx 1.992 div def
   /theta x xM div arccos def
   x
   y theta sin xM mul mul 10 SIZEFONT mul div
} def}%
\psset{transform=FC}
\rput(! 0 Hb){\pscircle*[linecolor=yellow!20](0,0){!SIZEFONT 4.2 mul}
\psTransformText[fillstyle=solid,fillcolor={[rgb]{.5 1 1}},linecolor=blue,fontscale=\SIZEFONT,pos=cc,PSfont=Helvetica,rotation=rotB](0,0){DANS LA BULLE}%
\pscircle(0,0){!SIZEFONT 4.2 mul}}
\pscustom[fillstyle=solid,fillcolor=green!20,opacity=0.5]{%
 \psline(-5,-5)(5,-5)(5,-2)
 \psplot[algebraic,plotpoints=1080]{5}{-5}{Hs*sin(5*x)}
 \closepath
 }%
\end{pspicture}\newpage}
\end{center}
\end{document}


vendredi 2 août 2013

Voici le drapeau allemand flottant par grand vent : une idée de Gilg Jürgen.


Le code utilise la macro \psFrameNL(llx,lly)(urx,ury) qui a été intégrée dans le package pst-nltr mis à jour :

Il est constitué de pst-nltr.pro, pst-nltr.sty et pst-nltr.tex qui sont dans le répertoire :

applications-conformes

Le code permettant de créer les 288 images de l'animation de Gilg Jürgen :

\documentclass[fleqn]{article}
\usepackage[T1]{fontenc}
\usepackage{multido}
\usepackage{pst-nltr}

\pagestyle{empty}

\definecolor{germanRed}{HTML}{FF0000}
\definecolor{germanGold}{HTML}{FFCC00}

\begin{document}
\begin{center}
\multido{\i=0+1}{288}{
\begin{pspicture}[showgrid=false](-2,-2)(6,5)
\psframe*[linecolor=cyan!10!white](-2.1,-2.1)(6,5.1)
\psframe(-2.1,-2.1)(6,5.1)
\pstVerb{
/Frequence {1 144 div} bind def
/temps \i\space def % \`{a} incr\'{e}menter de 1 en 1 => 36
/FC {
/y exch def
/x exch def
/r x dup mul y dup mul add sqrt def
/Lambda 8 def            % longueur d'onde
  360 Frequence temps mul r Lambda div sub mul cos 0.5 mul
    x add
  360 Frequence temps mul r Lambda div sub mul cos 0.5 mul
    y add
} def}%
\psset{transform=FC}
\psFrameNL[fillstyle=solid,fillcolor=black,linecolor=black](0,3)(5,4)%
\psFrameNL[fillstyle=solid,fillcolor=germanRed,linecolor=germanRed](0,2)(5,3)%
\psFrameNL[fillstyle=solid,fillcolor=germanGold,linecolor=germanGold](0,1)(5,2)
\psFrameNL(0,1)(5,4)
\psCircleNL[fillstyle=solid,fillcolor=white](0.25,1.25){0.1}
\psCircleNL[fillstyle=solid,fillcolor=white](0.25,3.75){0.1}
\pnodeNL(0.25,3.75){A}
\pnodeNL(0.25,1.25){B}
\psline[linecolor=gray!50!orange,linewidth=0.1,linecap=1](-2,-2)(-2,5)
\psline(-1.9,1.25)(B)\psline(-1.9,3.75)(A)
\psellipse(-2,1.25)(0.1,0.05)
\psellipse(-2,3.75)(0.1,0.05)
\psline[linecolor=gray!50!orange,linewidth=0.1](-2,5)(-2,3.75)
\psline[linecolor=gray!50!orange,linewidth=0.1](-2,2)(-2,1.25)
\pscurve(-1.9,1.25)(-1.8,2.5)(-1.9,3.75)
\pstVerb{
/FC {
/y exch cm_1 def
/x exch cm_1 def
/r x dup mul y dup mul add sqrt def
/Lambda 8 def            % longueur d'onde
  360 Frequence temps mul r Lambda div sub mul cos 0.5 mul
    x add cm
  360 Frequence temps mul r Lambda div sub mul cos 0.5 mul
    y add cm
} def}%
\psset{transform=FC}
\psTransformText[fillstyle=solid,fillcolor=black,linewidth=0.01,fontscale=0.35,pos=bc,PSfont=Helvetica](2.5,1.25){German flag}%
\end{pspicture}\newpage}
\end{center}
\end{document}

jeudi 1 août 2013

Champ magnétique créé par un fil rectiligne, illustrations de Thomas Söll avec PSTricks

Avec la main gauche, le pouce indique le sens des électrons, qui est, évidemment, en sens inverse du sens conventionnel du courant.
Avec la main droite, le pouce indique le sens conventionnel du courant.
Ces images peuvent être agrandies.

Les fichiers (Linke-Faust4.pdf Linke-Faust4.tex) sont dans le dossier :


Je dois signaler un phénomène un peu bizarre. Si on ne met pas un \newpage ainsi qu'un petit texte entre les deux schémas, le deuxième dessin est produit la tête à l'envers par ps2pdf. Le fichier postscript est impeccable. J'en ignore la raison.

Le code :

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[a4paper,margin=2cm]{geometry}

\usepackage{pst-grad,pst-slpe,pst-3d,pst-node}

\usepackage{ifthen}
\newboolean{D}
\newboolean{G}
\setboolean{D}{true}
%\setboolean{D}{false}
%\setboolean{G}{true}
\setboolean{G}{false}


\newcommand{\Zylinder}[9]{%  #1 L\"{a}nge, #2 Radius, #3 gradbegin, #4 gradend, #5 gradmidpoint
\pscustom[dimen=#9,fillstyle=gradient,gradbegin=#3,gradend=#4,gradmidpoint=#5,gradangle=90,linecolor=#6,linewidth=#7,linestyle=#8]{%
\psellipticarc(0,0)(!#2 #2 0.3 mul){180}{360}
\psellipticarcn(0,#1)(!#2 #2 0.3 mul){0}{-180}
\closepath
}
\psellipse[fillstyle=gradient,gradbegin=#3,gradend=#4,gradmidpoint=0.55,gradangle=30,linestyle=none,linewidth=0pt](0,#1)(!#2 #2 0.3 mul)
}

\newcommand{\MagnetNadel}[4]{%
\rput(!#1 #2){\Zylinder{0.1}{0.22}{black!90!cyan!90}{black!40!cyan!10}{0.3}{black!90!cyan!90}{0.1pt}{none}{middle}}
\rput(!#1 #2 0.1 add){\Zylinder{0.3}{0.05}{black!90!cyan!90}{black!40!cyan!10}{0.3}{black!90!cyan!90}{0pt}{none}{middle}}
\rput(!#1 #2 0.4 add){\Zylinder{0.1}{0.015}{black!90!cyan!90}{black!40!cyan!10}{0.3}{black!90!cyan!90}{0pt}{none}{middle}}
\rput(!#1 #2 0.5 add){\pstilt{#3}{\rput{#4}(0,0){\psline[linecolor=red,linewidth=0.5pt,arrowscale=1.5,arrowlength=1.8,arrowinset=0]{->}(0,0)(0.238,0)
\psline[linecolor=green,linewidth=0.5pt,arrowscale=1.5,arrowlength=1.8,arrowinset=0]{<- br="">}}}
\rput(!#1 #2 0.5 add){\Zylinder{0.04}{0.03}{black!90!brown!90}{black!40!brown!30}{0.3}{black!90!brown!90}{0pt}{none}{middle}}
}

\def\LinkeFaust#1{%
\def\tempa{#1}
\definecolor{Weiss}{rgb}{1,0.98,0.98}%     255 250 250
\definecolor{Haut}{rgb}{1,0.894,0.769}% 255 228 196
%\psset{unit=1.0}
\begin{psclip}
{\psframe[linestyle=none](0.25,0.25)(16,19.1)}
\pscustom[fillstyle=solid,fillcolor=Haut,linecolor=black!50,linewidth=0.9pt,opacity=1]{%
%
%\psset{showpoints}
\psbezier(0.2,7.6)(1.1,8.07)(1.8,8)(3,8.86)
\psbezier(3.4,9.15)(3.7,9.8)(3.7,10.1)
\psbezier(3.7,11.8)(4.8,13.2)(4.8,14)
\psbezier(4.8,14.4)(5.22,15.3)(5.18,17)
\psline(5.3,17.2)(5,18.65) % Fingernagel Daumen
\psbezier(5.05,18.8)(5.25,19)(5.5,19)
\psbezier(6.4,19)(7.35,16.9)(7.35,15.6)
\psbezier(7.35,15)(7.05,13.9)(7.05,13.4)
\psbezier(7.05,13.2)(7.1,12.8)(7.45,12.4) % Ende Daumen
\psbezier(7.7,12.5)(8.7,12.3)(8.9,12.2)
\psbezier(9.1,12.24)(9.7,12.24)(9.9,12.2)
\psbezier(10.1,12.3)(10.5,12.2)(10.8,12.2)
\psbezier(11,12.2)(11,12.3)(11.3,12.2)
\psbezier(11.5,12.22)(13.1,11.68)(13.2,11.57)
\psline(13.2,11.57)(10.2,3.8)
\psbezier(9.3,3.3)(7.8,3.3)(7.4,3.3)
\psbezier(6.8,3.3)(6.3,3.2)(5.2,3.5)
\psbezier(3.2,2.6)(3.2,2.6)(0.2,0.1)
\closepath
}
\end{psclip}

% Fingernagel Daumen
\pscustom[fillstyle=solid,fillcolor=red!10,linecolor=black!50,linewidth=0.8pt,opacity=1]{%
%
\psbezier(5.18,17.0)(5.45,17.2)(5.42,17.2)(5.4,17.4)
\psbezier(5.3,18.4)(5.4,18.4)(5,18.65)
\psbezier(4.95,18.0)(4.9,18.0)(5.18,17.0)
\closepath
}

% Linien in Handfl\"{a}che und Daumen
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(3,6)(3.1,5.4)(3.25,5)(3.5,4.6)
\psbezier(4.65,3.85)(4.73,3.7)(4.73,3.6)(4.8,3.35)
\psbezier(4.8,4.8)(5.1,4.35)(5.2,4)(5.2,3.5)
\psbezier(2.9,8.4)(3.15,5.7)(4.4,5.2)(4.6,4.4)
\psbezier(3.15,8.5)(3.3,7)(4.1,6)(4.6,5.4)
\psbezier(3.35,8.8)(3.5,7.6)(4.0,7)(4.6,6.6)
\psbezier(4.6,6.1)(4.8,5.85)(4.98,5.7)(5.2,5.6)
\psbezier(5.6,5.4)(9.7,8)(10,9.5)(10,10.1)
\psbezier(10,10.1)(10,10.6)(10,11)(9.5,11.6)
\psbezier(5.7,6.3)(6.2,6.45)(6.4,6.45)(6.8,6.4)
\psbezier(7,7.2)(6.9,6.5)(6.8,6.5)(6.75,6.2)
\psbezier(7.6,9)(7.8,8.2)(7.8,7)(7.5,6.4)
\psbezier(8,12.25)(9.3,11.85)(9.4,11)(9.4,10.4)
\psbezier(10.05,12)(10,11)(10,9.8)(10.05,8.86)
\psbezier(11.18,12)(11,11.2)(11.0,10.5)(11.4,9.8)
\psbezier(7.45,12.4)(7.6,12.2)(7.63,12.05)(7.9,11.9)
\psbezier(5.1,15.44)(5.25,15.44)(5.35,15.32)(5.5,15.32)
\psbezier(5,14.95)(5.3,14.95)(5.3,14.96)(5.54,15.07)
\psbezier(6.7,15.38)(7,15.42)(7,15.4)(7.35,15.6)
}

%--------------------------------------------------------------
%---------------- Platz f\"{u}r Material in der Hand --------------
%--------------------------------------------------------------
%\pscoil[coilheight=0.35,coilwidth=3,linewidth=1.3pt](10,2)(10,15)
\rput(11,0){\Zylinder{19}{0.25}{red!30!brown!90}{orange!30}{0.3}{red!30!brown!90}{1pt}{none}{middle}}

%% Elektronen
\newpsstyle{Elektron}{linecolor=black!30,slopebegin=blue!30,sloperadius=0.07,linestyle=none,slopecenter=0.65 0.65}
\def\Elektron{%
\psline[linewidth=0.3pt,arrowinset=0.06,arrowscale=0.3,arrowlength=1.2,arrowsize=0.25]{->}(0,0)(0,0.25)
\psBall[style=Elektron](0,0){blue!90}{.1}
\rput[c]{0}(0,0){\psline[linewidth=0.4pt,linecolor=white](-0.02,0)(0.02,0)}
}

\rput(7,-3){%
\pnode(-2,2){F}
\pnode(2,6){G}
\pnode(3.75,6){H}
\pnode(4.25,6){I}
\pnode(10,6.0){D}
\pnode(7,2.0){E}
\pnode(-2,1.6){A}
\pnode(7,1.6){B}
\pnode(10,5.6){C}
\pnode(2,5.6){J}

\psline[linestyle=dashed,linewidth=0.4pt,linecolor=blue!60,linestyle=dashed,dash=3pt 2pt](A)(J)(C)
\psline[linestyle=dashed,linewidth=0.4pt,linecolor=blue!60,linestyle=dashed,dash=3pt 2pt](G)(J)

\rput(4,0){\Zylinder{22}{0.25}{red!30!brown!90}{orange!30}{0.3}{red!30!brown!90}{1pt}{none}{middle}}

\ifthenelse{\boolean{\tempa}}
{
\rput(4.1,0.5){\Elektron}
\rput(3.9,1.1){\Elektron}
\rput(4.0,1.7){\Elektron}
\rput(4.1,2.4){\Elektron}
\rput(4.0,3.2){\Elektron}
}
{}

\pscustom[dimen=middle,fillstyle=solid,opacity=0.7,fillcolor=blue!25,linewidth=0.7pt,linestyle=none]{%
\psline(F)(G)(H)
\psellipticarc(4,4)(0.25,0.1){180}{360}
\psline(I)(D)(E)
\closepath
}
\pspolygon[fillstyle=solid,opacity=0.7,fillcolor=blue!60,linewidth=0.4pt,linecolor=blue!70,linestyle=none](E)(B)(C)(D)
\pspolygon[fillstyle=solid,opacity=0.7,fillcolor=blue!45,linewidth=0.4pt,linecolor=blue!70,linestyle=none](A)(B)(E)(F)
\psellipticarc[linewidth=0.4pt,linecolor=blue!70](4,4)(0.25,0.1){180}{360}
\psellipticarc[linewidth=0.4pt,linecolor=blue!50,linestyle=dashed,dash=3pt 2pt](4,3.6)(0.25,0.1){180}{360}

\psellipse[rot=5,linewidth=0.6pt,linestyle=dashed,dash=3pt 2pt,linecolor=blue](4,4)(2,0.8)
\psellipse[rot=5,linewidth=0.6pt,linestyle=dashed,dash=3pt 2pt,linecolor=blue](4,3.9)(3.5,1.5)

\rput(4,4.2){\Zylinder{17.8}{0.25}{red!30!brown!90}{orange!30}{0.3}{red!30!brown!90}{0pt}{none}{middle}}


\MagnetNadel{5.8}{3.8}{30}{265}
\MagnetNadel{3.5}{3.2}{20}{180}
\MagnetNadel{2.1}{4.1}{30}{80}
\MagnetNadel{4.6}{4.8}{20}{0}

\MagnetNadel{6.75}{5}{20}{340}
\MagnetNadel{5.3}{2.6}{30}{230}
\MagnetNadel{1}{2.92}{25}{155}
\MagnetNadel{2.4}{5.1}{20}{60}
}


%
\ifthenelse{\boolean{\tempa}}
{%
\rput(11.1,1){\Elektron}
\rput(10.9,1.6){\Elektron}
\rput(11.0,2){\Elektron}
\rput(11.1,2.5){\Elektron}
\rput(11.0,3){\Elektron}

\rput(11.1,10){\Elektron}
\rput(10.9,10.6){\Elektron}
\rput(11.0,11){\Elektron}
\rput(11.1,11.5){\Elektron}
\rput(11.0,12){\Elektron}
\rput(10.9,12.5){\Elektron}

\rput(11.1,13){\Elektron}
\rput(10.9,13.6){\Elektron}
\rput(11.0,14){\Elektron}
\rput(11.1,14.5){\Elektron}
\rput(11.0,15){\Elektron}
\rput(10.9,15.5){\Elektron}

\rput(11.1,16){\Elektron}
\rput(10.9,16.6){\Elektron}
\rput(11.0,17){\Elektron}
\rput(11.1,17.5){\Elektron}
\rput(11.0,18){\Elektron}
\rput(10.9,18.5){\Elektron}
}
{%
\rput(11,-2.7){\Large\textcolor{black}{$+$}}
\rput(11,18.6){\Large\textcolor{black}{$-$}}
}

% kleiner Finger
\pscustom[fillstyle=solid,fillcolor=Haut,linecolor=black!50,linewidth=0.9pt,opacity=1]{%
%
\psbezier(14.0,4.95)(14.2,4.7)(14.18,4.2)(13.8,3.8)
\psbezier(13.2,3.51)(13.0,3.38)(12.0,3.25)
\psbezier(11.8,3.22)(11.7,3.23)(11.5,3.25)
\psbezier(11.3,3.27)(11.0,3.3)(10.75,3.4)
\psbezier(10.53,3.51)(10.1,3.45)(9.75,3.95)
\psbezier(9.65,4.15)(9.65,4.4)(9.8,4.55)
%\psbezier(8.87,5.9)(9.3,6.19)(9.8,6.2)

\closepath
}

% Fingernagel kleiner Finger
\pscustom[fillstyle=solid,fillcolor=red!10,linewidth=0.8pt,linecolor=black!50,opacity=1]{%
%
\psbezier(11.2,4.35)(11.35,4.15)(11.35,4.0)(11.2,3.86)
\psbezier(11.1,3.81)(11,3.76)(10.8,3.78)
\psbezier(10.1,3.84)(10.13,3.9)(10.08,4)
\psbezier(10.05,4.12)(10.05,4.4)(10.18,4.5)
\closepath
}

% Linien im kleinen Finger
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(12.1,4.2)(12.2,3.75)(12.2,3.75)(12.0,3.4)
\psbezier(12.35,4.15)(12.4,3.75)(12.4,3.75)(12.25,3.45)
\psbezier(13.7,4.8)(13.8,4.5)(13.8,4.5)(13.7,4.18)
}

% Ringfinger
\pscustom[fillstyle=solid,fillcolor=Haut,linecolor=black!50,linewidth=0.9pt,opacity=1]{%
%
\psbezier(14.65,7.1)(15.0,6.8)(15.18,6.6)(15.18,6.12)
\psbezier(15.18,5.85)(15.2,5.5)(14.2,5.0)
\psbezier(13.0,4.45)(12.8,4.45)(12.4,4.4)
\psbezier(11.6,4.25)(11.6,4.23)(10.86,4.4)
\psbezier(10.4,4.42)(10.0,4.5)(9.85,4.5)
\psbezier(9.2,4.5)(8.87,5.0)(8.87,5.5)
\psbezier(8.87,5.9)(9.3,6.19)(9.8,6.2)

\closepath
}

% Fingernagel Ringfinger
\pscustom[fillstyle=solid,fillcolor=red!10,linewidth=0.8pt,linecolor=black!50,opacity=1]{%
%
\psbezier(10.73,5)(10.73,4.83)(10.7,4.58)(9.5,4.72)
\psbezier(9.25,5.43)(9.4,5.7)(9.65,5.9)
\psbezier(10.65,5.7)(10.73,5.4)(10.73,5)
\closepath
}

% Linien im Ringfinger
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(11.9,5.6)(12.0,5.1)(12.0,5.0)(11.9,4.6)
\psbezier(12.2,5.55)(12.3,5.1)(12.3,5.0)(12.2,4.65)
\psbezier(14.4,6.7)(14.8,6.6)(14.92,6)(14.85,5.8)
}

% Mittelfinger
\pscustom[fillstyle=solid,fillcolor=Haut,linecolor=black!50,linewidth=0.9pt,opacity=1]{%
%
\psbezier(14.4,9.75)(15,9.5)(15.4,9)(15.4,8.2)
\psbezier(15.4,7.95)(15.4,7.7)(14.7,7.02)
\psbezier(14.1,6.5)(12.8,5.95)(12.4,5.95)
\psbezier(12.2,5.95)(11.9,6.02)(10.7,6.02)
\psbezier(10.5,6.02)(10.4,6.03)(10.2,6.02)
\psbezier(9.74,6.01)(9.57,6.37)(9.57,6.7)
\psbezier(9.57,7)(9.75,7.46)(10.3,7.7)
\closepath
}

% Fingernagel Mittelfinger
\pscustom[fillstyle=solid,fillcolor=red!10,linewidth=0.8pt,linecolor=black!50,opacity=1]{%
%
\psbezier(11.42,6.5)(11.42,6.02)(11,6.06)(10.7,6.05)
\psbezier(10.2,6.07)(9.95,6.2)(9.95,6.5)
\psbezier(9.95,6.8)(10.15,7.22)(10.45,7.22)
\psbezier(10.5,7.22)(10.85,7.15)(10.98,7.13)
\psbezier(11.02,7.12)(11.15,7.09)(11.25,7.0)
\psbezier(11.3,6.96)(11.42,6.8)(11.42,6.5)
\closepath
}

% Linien im Mittelfinger
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(12.6,7.2)(12.9,6.92)(12.85,6.6)(12.8,6.25)
\psbezier(12.9,7.2)(13.1,6.92)(13.15,6.7)(13.1,6.35)
\psbezier(14.6,9.2)(15,8.9)(15.05,8.6)(15.1,8.3)
%\psbezier(11.42,6.5)(11.42,6.02)(11,6.1)(10.7,6.05)
}

% Zeigefinger
\pscustom[fillstyle=solid,fillcolor=Haut,linestyle=none,opacity=1]{%
%
\psbezier(13.2,11.57)(14.16,11.25)(14.5,10.6)(14.4,9.75)
\psbezier(13.6,9.4)(13.5,8.95)(13,8.6)
\psbezier(12.4,8.1)(11.5,7.73)(10.8,7.73)
\psbezier(10.65,7.73)(10.4,7.7)(10.16,7.64)
\psbezier(9.7,8)(9.78,8.25)(9.78,8.35)
\psbezier(9.78,8.6)(9.9,9)(10.3,9.35)
\psbezier(11.2,10)(11.45,10.0)(11.7,10.4)
\psbezier(12.1,11)(12.6,11.48)(12.9,11.51)
\closepath
}
% Randlinie Zeigefinger
{\psset{linewidth=0.9pt,linecolor=black!50}
\psbezier(13.2,11.57)(14.16,11.25)(14.5,10.6)(14.4,9.75)
\psbezier(14.4,9.75)(13.6,9.4)(13.5,8.95)(13,8.6)
\psbezier(13,8.6)(12.4,8.1)(11.5,7.73)(10.8,7.73)
\psbezier(10.8,7.73)(10.65,7.73)(10.4,7.7)(10.16,7.64)
\psbezier(10.16,7.64)(9.7,8)(9.78,8.25)(9.78,8.35)
\psbezier(9.78,8.35)(9.78,8.6)(9.9,9)(10.3,9.35)
\psbezier(10.3,9.35)(11.2,10)(11.45,10.0)(11.7,10.4)
\psbezier(11.7,10.4)(12.1,11)(12.6,11.48)(12.9,11.51)
}

% Fingernagel Zeigefinger
\pscustom[fillstyle=solid,fillcolor=red!10,linewidth=0.8pt,linecolor=black!50,opacity=1]{%
%
\psbezier(11.7,8.45)(11.7,7.85)(10.9,7.73)(10.8,7.73)
\psbezier(10.7,7.73)(10.6,7.72)(10.48,7.7)
\psbezier(10.33,7.97)(10.36,8.1)(10.35,8.2)
\psbezier(10.36,8.77)(10.96,8.86)(11.1,8.86)
\psbezier(11.4,8.86)(11.7,8.7)(11.7,8.45)
\closepath
}

% Linien im Zeigefinger
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(12.2,9.6)(12.48,9.4)(12.5,9.2)(12.6,8.8)
\psbezier(12.5,9.7)(12.65,9.55)(12.7,9.4)(12.8,9.1)
\psbezier(13.6,10.8)(13.9,10.6)(14.02,10.4)(14.04,10)
}
}
\begin{document}
Avec la main gauche, le pouce indique le sens des électrons, qui est, évidemment, en sens inverse du sens conventionnel du courant.
\begin{center}
\begin{pspicture}[showgrid=false,shift=0](0,-3)(15.5,19)
\LinkeFaust{D} %
\end{pspicture}
\end{center}
\newpage
Avec la main droite, le pouce indique le sens conventionnel du courant.
\begin{center}
\begin{pspicture}[showgrid=false,shift=0](0,-3)(-15.5,20)
\psscalebox{-1 1}{\LinkeFaust{G}}
\end{pspicture}
\end{center}

\end{document}


mercredi 31 juillet 2013

Typographiquement : digestion du boa et géométrie dans un triangle

Toutes ces variations typographiques ont pour origine des réflexions d'un petit groupe constitué de Jean-Michel Sarlat, Jean-Paul Vignault, Arnaud Schmittbuhl et moi-même. Je l'avais déjà signalé dès le début de ces messages :

http://pstricks.blogspot.fr/2013/07/transformations-non-lineaires-de-textes.html

 Elles furent concrétisées par quelques réalisations en postscript. Ce sont deux idées de Jean-Paul Vignault que je reprend aujourd'hui : la géométrie dans un triangle et une bulle qui enfle au milieu d'une phrase. Je ne sais pas si le code de Jean-Paul est toujours disponible sur :
 http://melusine.eu.org/syracuse/
 car je n'ai pas pu le vérifier, le site est actuellement inaccessible, c'est pourquoi je le donne ici :
applications-conformes

Le code de Jean-Paul est particulièrement ingénieux : on donne un chemin et  par une interpolation linéaire le texte est modulé par ce chemin. Le code que je propose est un peu différent mais les résultats sont sensiblement identiques.

Le code pour l'animation :

\documentclass{article}
\usepackage{pst-nltr,multido}
\usepackage[a4paper,margin=2cm]{geometry}
\pagestyle{empty}
\begin{document}

\begin{center}
\multido{\n=8.0+-0.5,\N=2.0+-0.5,\nC=14.0+-00.5}{36}{%
\begin{pspicture}(\N,-2)(\nC,6)
\psframe(\N,-2)(\nC,6)
\pstVerb{
/arccos {
   dup
   dup mul neg 1 add sqrt
   exch
   atan
} def
/h 28.45 def
/FC {
   /y exch def
   /x exch def
   /xM wx 3 div  dup mul h dup mul sub sqrt def
   x xM neg le x xM ge or{/a h def} if
   x xM neg ge x xM le and {%
        /theta  x wx 3 div div arccos def
        /a wx 3 div theta sin mul 1 mul def} if
    x a 15 div y mul
} def}%
\psset{transform=FC}
\psTransformText[fillstyle=solid,fillcolor=green!50!orange,fontscale=1.1,pos=bc,PSfont=Helvetica](\n,0){voir la digestion du boa}%
\end{pspicture}\newpage}
\end{center}
\end{document}

Le code pour le triangle :

\documentclass{article}
\usepackage{pst-nltr}
\usepackage[a4paper,margin=2cm]{geometry}
\begin{document}

\begin{center}
\begin{pspicture}(-8,-1)(8,9)
\psframe(-8,-1)(8,9)
\pspolygon[linecolor=red,linewidth=0.05](-7.5,0)(0,6)(7.5,0)
\pstVerb{
/FC {
   /y exch def
   /x exch def
   x 0 le {/a wy 2 mul wx div x mul wy add def}
          {/a wy 2 mul wx div neg x mul wy add def}
    ifelse
    x a 3.66 div y mul
} def}%
\psset{transform=FC}
\psTransformText[fillstyle=solid,fillcolor={[rgb]{.25 0.75 0.25}},fontscale=1.5,pos=bc,PSfont=Times-Roman](0,0){La géométrie du triangle}%
\end{pspicture}
\end{center}
\end{document}


Le package pst-nltr est constitué de pst-nltr.pro, pst-nltr.sty et pst-nltr.tex qui sont dans le dossier :
applications-conformes

lundi 29 juillet 2013

Règle de la main droite (resp. de la main gauche) pour déterminer le sens du champ magnétique créé par une bobine, illustrée par Thomas Söll avec PSTricks

Règle de la main droite :
La main droite entoure la bobine de telle façon que le courant(sens conventionnel) sorte par les doigts, le pouce, dirigé parallèlement à l'axe de la bobine, indique le sens du champ magnétique.

Règle de la main gauche :
Le courant pénètre par les extrémités des doigts.

Le code :

\documentclass[12pt,a4paper]{article}
\usepackage{pst-plot,pst-grad}
\usepackage{ifthen}
\newboolean{D}
\newboolean{G}
\setboolean{D}{true}
%\setboolean{D}{false}
%\setboolean{G}{true}
\setboolean{G}{false}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\Helice{% equations
/xC radius t cos mul def
/yC radius t sin mul def
/zC PAS t mul def
xC Lo sin mul neg yC Lo cos mul add
xC neg Lo cos mul La sin mul yC Lo sin mul La sin mul sub zC La cos mul add}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\FaceA{\parametricplot[plotpoints=360,linewidth=2\pslinewidth]{0}{360}{%
/xC radius t cos mul def
/yC radius t sin mul def
/zC PAS t mul def
xC Lo sin mul neg yC Lo cos mul add
xC neg Lo cos mul La sin mul yC Lo sin mul La sin mul sub Hauteur_2 La cos mul
add}}
%%%%%%%%%%%%%%%
\def\FaceB{%
\parametricplot[plotpoints=180,linewidth=2\pslinewidth]{-90}{90}{%
/xC radius t cos mul def
/yC radius t sin mul def
/zC PAS t mul def
xC Lo sin mul neg yC Lo cos mul add
xC neg Lo cos mul La sin mul yC Lo sin mul La sin mul sub Hauteur_2 neg La cos mul
add}}
%%%%%%%%%%%%%
\def\SpireVisible{%
\parametricplot[plotpoints=360,%
linecolor=red,linewidth=1\pslinewidth]{-90}{90}{\Helice}
\ifthenelse{\boolean{\tempa}}
 {
\parametricplot[plotpoints=18,arrowinset=0.1,arrows=-<,%arrowsize=0.2,%
linecolor=red,linewidth=2\pslinewidth]{-10}{0}{\Helice}}
 {
 \parametricplot[plotpoints=18,arrowinset=0.1,arrows=->,%arrowsize=0.2,%
linecolor=red,linewidth=2\pslinewidth]{-10}{0}{\Helice}}
}
\def\SpireInVisible{%
\parametricplot[plotpoints=360,%
linecolor=red,linewidth=0.5\pslinewidth,linestyle=dashed]{90}{270}{\Helice}}
%%%%%%%%%%%%%
\def\Spires{\multido{\r=-4.026+0.366}{22}{\rput(0,\r){\SpireVisible\SpireInVisible}}}
%%%%%%%%%%%%%
\def\Cylindre{\pscustom[linestyle=none]{%
\psline(!radius neg Hauteur_2)(!radius neg Hauteur_2 neg)
\FaceB
\psline(! radius Hauteur_2 neg)(!radius Hauteur_2)
\parametricplot[plotpoints=180,linewidth=2\pslinewidth]{90}{270}{
/xC radius t cos mul def
/yC radius t sin mul def
/zC PAS t mul def
xC Lo sin mul neg yC Lo cos mul add
xC neg Lo cos mul La sin mul yC Lo sin mul La sin mul sub Hauteur_2 La cos mul add}
\fill[fillstyle=gradient,gradangle=90,gradmidpoint=0.7,gradend=white,gradbegin=blue!20]}}
%%%%%%%%%%%%%
\def\bobine{\Cylindre
{\psset{fillstyle=gradient,gradbegin=white,gradend=gray,gradangle=0}\FaceA}
\Spires\FaceB}
%%%%%%%%%%%%%
\def\BOBINE{%
\pstVerb{%
/radius 2 def
/Hauteur_2 5 def
/PAS {0.5 360 div} bind def
/Lo 0 def
/La 20 def}
\bobine
\psline[linewidth=1.5\pslinewidth](!radius neg Hauteur_2 neg PAS 200 mul add)(!radius neg Hauteur_2 PAS -250 mul add)
\psline[linewidth=1.5\pslinewidth](!radius Hauteur_2 neg PAS 200 mul add)(!radius Hauteur_2 PAS -250 mul add)}
%
\definecolor{Weiss}{rgb}{1,0.98,0.98}%     255 250 250
\definecolor{Haut}{rgb}{1,0.894,0.769}% 255 228 196
\definecolor{Auge}{rgb}{0.54,0.27,0.074}% 139 69 19
%
\def\Main#1{%
\def\tempa{#1}
\begin{psclip}
{\psframe[linestyle=none](0.25,0.25)(16,19.1)}
\pscustom[fillstyle=solid,fillcolor=Haut,linecolor=black!50,linewidth=0.9pt,opacity=1]{%
%
%\psset{showpoints}
\psbezier(0.2,7.6)(1.1,8.07)(1.8,8)(3,8.86)
\psbezier(3.4,9.15)(3.7,9.8)(3.7,10.1)
\psbezier(3.7,11.8)(4.8,13.2)(4.8,14)
\psbezier(4.8,14.4)(5.22,15.3)(5.18,17)
\psline(5.3,17.2)(5,18.65) % Fingernagel Daumen
\psbezier(5.05,18.8)(5.25,19)(5.5,19)
\psbezier(6.4,19)(7.35,16.9)(7.35,15.6)
\psbezier(7.35,15)(7.05,13.9)(7.05,13.4)
\psbezier(7.05,13.2)(7.1,12.8)(7.45,12.4) % Ende Daumen
\psbezier(7.7,12.5)(8.7,12.3)(8.9,12.2)
\psbezier(9.1,12.24)(9.7,12.24)(9.9,12.2)
\psbezier(10.1,12.3)(10.5,12.2)(10.8,12.2)
\psbezier(11,12.2)(11,12.3)(11.3,12.2)
\psbezier(11.5,12.22)(13.1,11.68)(13.2,11.57)
\psline(13.2,11.57)(10.2,3.8)
\psbezier(9.3,3.3)(7.8,3.3)(7.4,3.3)
\psbezier(6.8,3.3)(6.3,3.2)(5.2,3.5)
\psbezier(3.2,2.6)(3.2,2.6)(0.2,0.1)
\closepath
}
\end{psclip}

% Fingernagel Daumen
\pscustom[fillstyle=solid,fillcolor=red!10,linecolor=black!50,linewidth=0.8pt,opacity=1]{%
%
\psbezier(5.18,17.0)(5.45,17.2)(5.42,17.2)(5.4,17.4)
\psbezier(5.3,18.4)(5.4,18.4)(5,18.65)
\psbezier(4.95,18.0)(4.9,18.0)(5.18,17.0)
\closepath
}

% Linien in Handfl\"{a}che und Daumen
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(3,6)(3.1,5.4)(3.25,5)(3.5,4.6)
\psbezier(4.65,3.85)(4.73,3.7)(4.73,3.6)(4.8,3.35)
\psbezier(4.8,4.8)(5.1,4.35)(5.2,4)(5.2,3.5)
\psbezier(2.9,8.4)(3.15,5.7)(4.4,5.2)(4.6,4.4)
\psbezier(3.15,8.5)(3.3,7)(4.1,6)(4.6,5.4)
\psbezier(3.35,8.8)(3.5,7.6)(4.0,7)(4.6,6.6)
\psbezier(4.6,6.1)(4.8,5.85)(4.98,5.7)(5.2,5.6)
\psbezier(5.6,5.4)(9.7,8)(10,9.5)(10,10.1)
\psbezier(10,10.1)(10,10.6)(10,11)(9.5,11.6)
\psbezier(5.7,6.3)(6.2,6.45)(6.4,6.45)(6.8,6.4)
\psbezier(7,7.2)(6.9,6.5)(6.8,6.5)(6.75,6.2)
\psbezier(7.6,9)(7.8,8.2)(7.8,7)(7.5,6.4)
\psbezier(8,12.25)(9.3,11.85)(9.4,11)(9.4,10.4)
\psbezier(10.05,12)(10,11)(10,9.8)(10.05,8.86)
\psbezier(11.18,12)(11,11.2)(11.0,10.5)(11.4,9.8)
\psbezier(7.45,12.4)(7.6,12.2)(7.63,12.05)(7.9,11.9)
\psbezier(5.1,15.44)(5.25,15.44)(5.35,15.32)(5.5,15.32)
\psbezier(5,14.95)(5.3,14.95)(5.3,14.96)(5.54,15.07)
\psbezier(6.7,15.38)(7,15.42)(7,15.4)(7.35,15.6)
}

%--------------------------------------------------------------
%---------------- Platz f\"{u}r Material in der Hand --------------
%--------------------------------------------------------------
%\pscoil[coilheight=0.35,coilwidth=3,linewidth=1.3pt](10,2)(10,15)
\rput(10,8){\BOBINE
\multido{\n=-0.366+0.366}{12}{\rput(0,\n){\SpireVisible\SpireInVisible}}}

% kleiner Finger
\pscustom[fillstyle=solid,fillcolor=Haut,linecolor=black!50,linewidth=0.9pt,opacity=1]{%
%
\psbezier(14.0,4.95)(14.2,4.7)(14.18,4.2)(13.8,3.8)
\psbezier(13.2,3.51)(13.0,3.38)(12.0,3.25)
\psbezier(11.8,3.22)(11.7,3.23)(11.5,3.25)
\psbezier(11.3,3.27)(11.0,3.3)(10.75,3.48)
\psbezier(10.53,3.51)(10.38,3.45)(9.75,4.0)
\psbezier(9.65,4.15)(9.65,4.4)(9.8,4.55)
%\psbezier(8.87,5.9)(9.3,6.19)(9.8,6.2)

\closepath
}

% Fingernagel kleiner Finger
\pscustom[fillstyle=solid,fillcolor=red!10,linewidth=0.8pt,linecolor=black!50,opacity=1]{%
%
\psbezier(11.2,4.35)(11.35,4.15)(11.35,4.0)(11.2,3.86)
\psbezier(11.1,3.81)(11,3.76)(10.8,3.78)
\psbezier(10.1,3.84)(10.13,3.9)(10.08,4)
\psbezier(10.05,4.12)(10.05,4.4)(10.18,4.5)
\closepath
}

% Linien im kleinen Finger
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(12.1,4.2)(12.2,3.75)(12.2,3.75)(12.0,3.4)
\psbezier(12.35,4.15)(12.4,3.75)(12.4,3.75)(12.25,3.45)
\psbezier(13.7,4.8)(13.8,4.5)(13.8,4.5)(13.7,4.18)
}

% Ringfinger
\pscustom[fillstyle=solid,fillcolor=Haut,linecolor=black!50,linewidth=0.9pt,opacity=1]{%
%
\psbezier(14.65,7.1)(15.0,6.8)(15.18,6.6)(15.18,6.12)
\psbezier(15.18,5.85)(15.2,5.5)(14.2,5.0)
\psbezier(13.0,4.45)(12.8,4.45)(12.4,4.4)
\psbezier(11.6,4.25)(11.6,4.23)(10.86,4.4)
\psbezier(10.4,4.42)(10.0,4.5)(9.85,4.5)
\psbezier(9.2,4.5)(8.87,5.0)(8.87,5.5)
\psbezier(8.87,5.9)(9.3,6.19)(9.8,6.2)

\closepath
}

% Fingernagel Ringfinger
\pscustom[fillstyle=solid,fillcolor=red!10,linewidth=0.8pt,linecolor=black!50,opacity=1]{%
%
\psbezier(10.73,5)(10.73,4.83)(10.7,4.58)(9.5,4.72)
\psbezier(9.25,5.43)(9.4,5.7)(9.65,5.9)
\psbezier(10.65,5.7)(10.73,5.4)(10.73,5)
\closepath
}

% Linien im Ringfinger
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(11.9,5.6)(12.0,5.1)(12.0,5.0)(11.9,4.6)
\psbezier(12.2,5.55)(12.3,5.1)(12.3,5.0)(12.2,4.65)
\psbezier(14.4,6.7)(14.8,6.6)(14.92,6)(14.85,5.8)
}

% Mittelfinger
\pscustom[fillstyle=solid,fillcolor=Haut,linecolor=black!50,linewidth=0.9pt,opacity=1]{%
%
\psbezier(14.4,9.75)(15,9.5)(15.4,9)(15.4,8.2)
\psbezier(15.4,7.95)(15.4,7.7)(14.7,7.02)
\psbezier(14.1,6.5)(12.8,5.95)(12.4,5.95)
\psbezier(12.2,5.95)(11.9,6.02)(10.7,6.02)
\psbezier(10.5,6.02)(10.4,6.03)(10.2,6.02)
\psbezier(9.74,6.01)(9.57,6.37)(9.57,6.7)
\psbezier(9.57,7)(9.75,7.46)(10.3,7.7)
\closepath
}

% Fingernagel Mittelfinger
\pscustom[fillstyle=solid,fillcolor=red!10,linewidth=0.8pt,linecolor=black!50,opacity=1]{%
%
\psbezier(11.42,6.5)(11.42,6.02)(11,6.1)(10.7,6.05)
\psbezier(10.2,6.1)(9.95,6.2)(9.95,6.5)
\psbezier(9.95,6.8)(10.15,7.22)(10.45,7.22)
\psbezier(10.36,7.22)(10.85,7.15)(10.98,7.13)
\psbezier(11.04,7.11)(11.1,7.07)(11.25,7.0)
\psbezier(11.3,6.96)(11.42,6.8)(11.42,6.5)
\closepath
}

% Linien im Mittelfinger
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(12.6,7.2)(12.9,6.92)(12.85,6.6)(12.8,6.25)
\psbezier(12.9,7.2)(13.1,6.92)(13.15,6.7)(13.1,6.35)
\psbezier(14.6,9.2)(15,8.9)(15.05,8.6)(15.1,8.3)
%\psbezier(11.42,6.5)(11.42,6.02)(11,6.1)(10.7,6.05)
}

% Zeigefinger
\pscustom[fillstyle=solid,fillcolor=Haut,linestyle=none,opacity=1]{%
%
\psbezier(13.2,11.57)(14.16,11.25)(14.5,10.6)(14.4,9.75)
\psbezier(13.6,9.4)(13.5,8.95)(13,8.6)
\psbezier(12.4,8.1)(11.5,7.73)(10.8,7.73)
\psbezier(10.65,7.73)(10.4,7.7)(10.16,7.64)
\psbezier(9.7,8)(9.78,8.2)(9.78,8.35)
\psbezier(9.78,8.6)(9.9,9)(10.3,9.35)
\psbezier(11.2,10)(11.45,10.0)(11.7,10.4)
\psbezier(12.1,11)(12.6,11.48)(12.9,11.51)
\closepath
}
% Randlinie Zeigefinger
{\psset{linewidth=0.9pt,linecolor=black!50}
\psbezier(13.2,11.57)(14.16,11.25)(14.5,10.6)(14.4,9.75)
\psbezier(14.4,9.75)(13.6,9.4)(13.5,8.95)(13,8.6)
\psbezier(13,8.6)(12.4,8.1)(11.5,7.73)(10.8,7.73)
\psbezier(10.8,7.73)(10.65,7.73)(10.4,7.7)(10.16,7.64)
\psbezier(10.16,7.64)(9.7,8)(9.78,8.2)(9.78,8.35)
\psbezier(9.78,8.35)(9.78,8.6)(9.9,9)(10.3,9.35)
\psbezier(10.3,9.35)(11.2,10)(11.45,10.0)(11.7,10.4)
\psbezier(11.7,10.4)(12.1,11)(12.6,11.48)(12.9,11.51)
}

% Fingernagel Zeigefinger
\pscustom[fillstyle=solid,fillcolor=red!10,linewidth=0.8pt,linecolor=black!50,opacity=1]{%
%
\psbezier(11.7,8.45)(11.7,7.85)(10.9,7.75)(10.8,7.75)
\psbezier(10.7,7.75)(10.6,7.74)(10.48,7.72)
\psbezier(10.3,7.99)(10.35,8.1)(10.35,8.2)
\psbezier(10.36,8.77)(10.96,8.88)(11.1,8.88)
\psbezier(11.3,8.88)(11.7,8.7)(11.7,8.45)
\closepath
}

% Linien im Zeigefinger
{\psset{linewidth=0.8pt,linecolor=black!40}
\psbezier(12.2,9.6)(12.48,9.4)(12.5,9.2)(12.6,8.8)
\psbezier(12.5,9.7)(12.65,9.55)(12.7,9.4)(12.8,9.1)
\psbezier(13.6,10.8)(13.9,10.6)(14.02,10.4)(14.04,10)
}
}
\def\MainDroite{\psscalebox{-1 1}{\Main{D}}} % main droite
\def\MainGauche{\Main{G}} % main gauche
\begin{document}
\psset{unit=0.5}
\begin{pspicture}[showgrid=false](0,0)(-16,19)
\MainDroite % main droite
\end{pspicture}
\begin{pspicture}[showgrid=false](0,0)(16,19)%
\MainGauche % main gauche
\end{pspicture}
\end{document}

dimanche 28 juillet 2013

Transformations non-linéaires : déformations d'une DS Citröen par Gilg Jürgen

L'animation est liée au fichier pdf et le source est inclus dans le fichier. Elle a été réalisée avec AcroTeX, en voici une image :
Les fichiers "Citroen_anime_non_lineaire.pdf" et image de la DS sont dans :
  applications-conformes




vendredi 26 juillet 2013

Mickey à travers les...déformations spatio-temporelles



"Mickey à travers les...déformations spatio-temporelles", c'est bien sur une allusion aux fameuses histoires de "Mickey à travers les siècles" où à la fin de chaque épisode un coup sur la tête le transporte dans un autre siècle et dans un autre lieu. Cette animation m'a fait penser qu'elle pouvait illustrer ce bref passage spatio-temporel ?
Jürgen Gilg pense plutôt à une bannière, portant le sigle de Mickey, fouettée par le vent.

Rappel, tous les fichiers du package pst-nltr, ainsi que les images eps, sont dans ce répertoire :

applications-conformes

Le code :

\documentclass{article}
\usepackage{pst-nltr,multido}
\usepackage[a4paper,margin=2cm]{geometry}

\pagestyle{empty}
\begin{document}
\begin{center}
\multido{\i=0+1}{36}{
\begin{pspicture}[showgrid=false](-5,-5)(5,5)
\psframe*(-5,-5)(5,5)
\pstVerb{
/Frequence {1 36 div} bind def
/temps \i\space def % à incrémenter de 1 en 1 => 36
/FC {
/y exch def
/x exch def
/r x dup mul y dup mul add sqrt def
/Lambda 8 def            % longueur d'onde
  360 Frequence temps mul r Lambda div sub mul cos 0.75 mul
    x add
  360 Frequence temps mul r Lambda div sub mul cos 0.75 mul
    y add
} def}%
\psset{transform=FC}
\psPolygonNL[fillcolor=yellow!10,fillstyle=solid](-4,-4)(4,-4)(4,4)(-4,4)%
\psTransformGrid[linecolor=red,linestyle=dotted,dotsize=10](-4,-4)(4,4)
\pstVerb{
/FC {
/y exch cm_1 def
/x exch cm_1 def
/r x dup mul y dup mul add sqrt def
/Lambda 8 def            % longueur d'onde
   360 Frequence temps mul r Lambda div sub mul cos 0.75 mul
    x add cm
   360 Frequence temps mul r Lambda div sub mul cos 0.75 mul
    y add cm
} def}%
\psset{transform=FC}
\psTransform{mickeyC.eps}%
\psTransformText[fillstyle=solid,fillcolor=red,fontscale=0.75,pos=bc](-2,0){Mickey}%
%\psTransformText[linecolor=red,fillstyle=solid,fillcolor=red,fontscale=0.4,pos=br](1.75,3){PSTricks}%
\end{pspicture}\newpage}
\end{center}
\end{document}