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}



Aucun commentaire:

Enregistrer un commentaire