Source de doc-pst-thick.tex
Fichier TeX
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[a4paper]{geometry}
\usepackage{pst-thick}
\usepackage{pst-slpe,pst-grad,pst-text}
\usepackage{url}
\usepackage{array,booktabs}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{frenchle}

\newpsstyle{vide}{linestyle=none}

\date{20 août 2\,007}
\author{Manuel \textsc{Luque}\\
 \texttt{\footnotesize manuel.luque27@gmail.com}}
\title{%PStricks : dans l'épaisseur d'un trait
%\begin{center}
%\psset{unit=0.5}
%\begin{pspicture}(0,1)(20,2)
%\psthick[K=85,stylethick=solide,E=3]{10}{20}{\fonctionSinus{60}{2}}
%\psthick[curveonly,stylecurve2=onlythecurveblue,K=85,E=3]{0}{20}{\fonctionSinus{60}{2}}
%\end{pspicture}
%\end{center}}
\begin{center}
\psset{unit=0.5}
\begin{pspicture}(0,-0.5)(20,1.5)
%\psclip{\psthick[E=2,stylethick=thicklineblue]{0}{10}{\fonctionSinus{20}{1}}}%
%\rput(4.7,1){\includegraphics[scale=0.2]{rat.eps}}
%\endpsclip
\psthick[E=1.2,stylethick=default]{1}{19}{\fonctionSinus{10}{1}}%
\rput(0,0){\pstextpath[c]{\parametricplot[linestyle=none]{1}{19}{%
    /P 10 def % période (10 unités)
    /A 1 def % amplitude
    /O 360 P div def
     t O t mul sin A mul
    }}{\textcolor{red}{ \texttt{\textbf{ PStricks}} : dans l'épaisseur d'un trait }}}
\end{pspicture}
\end{center}}

\begin{document}
\maketitle
\begin{abstract}
Le tracé d'une ligne avec \texttt{PStricks} comporte de très nombreuses options qui doivent satisfaire la majorité des
utilisateurs. Vous ne trouverez donc pas ici un catalogue de toutes les options possibles, telles que :
\begin{itemize}
  \item \verb+doublecolor=red!25+
  \item \verb+doublesep=2+
  \item \verb+linecolor=red+
  \item \verb+linewidth=0.1+
  \item etc.
\end{itemize}
Les documentations sur ces options sont très nombreuses, par exemple en français :
\begin{itemize}
  \item \textcolor{blue}{\url{http://www-igm.univ-mlv.fr/~daaboul/PSTricks/Cours7_PSTricks.ps}}
  \item \textcolor{blue}{\url{http://www-igm.univ-mlv.fr/~daaboul/PSTricks/Cours8_PSTricks.ps}}
  \item \textcolor{blue}{\url{http://www.gutenberg.eu.org/pub/GUTenberg/publicationsPDF/16-girou.pdf}}
  \item \textcolor{blue}{\url{http://documents.epfl.ch/users/d/da/danalet/www/MiniProjet/PSTricks.pdf}}
\end{itemize}
Il s'agit plutôt, ici, de regarder ce qui se passe à l'intérieur et aux bords d'une ligne, en créant une commande permettant d'obtenir
le \textit{chemin} d'une ligne, pour diverses applications qui n'ont peut-être aucune utilité pratique\ldots
\end{abstract}
\tableofcontents
\clearpage
\section{La commande et les options}
Cette commande s'écrit \verb+\psthick[options]{t1}{t2}{function}+ et comporte de grandes analogies avec \verb+\parametricplot+.
\begin{center}
\newcommand*\titretab[1]{\multicolumn{1}{c}{\bfseries#1}}
\begin{tabular}{>{\bfseries\sffamily\color{blue}}lccm{5.5cm}}
  \toprule
  \titretab{Option} & \titretab{Type} & \titretab{Défaut}
& \titretab{Description}
\\\toprule
  E      &nombre   &1& épaisseur du trait cm \\
  K       &nombre   &0& modifie l'inclinaison par rapport à la normale de l'angle K\\
\midrule
  stylethick    &texte    &thicklineblue& style du tracé\\
 \midrule
  curveonly   &booléen  &false& Ne trace que les bords de la ligne\\
 stylecurve1    &texte    &onlythecurvered& style du tracé de la courbe 1 \\
  stylecurve2    &texte    &onlythecurveblue& style du tracé de la courbe 2 \\
\midrule
\\\bottomrule
\end{tabular}
\end{center}
Les styles prédéfinis sont les suivants :
\begin{verbatim}
\newpsstyle{thickline}{fillstyle=solid,fillcolor=red!25,linecolor=red,plotpoints=360}
\newpsstyle{onlythecurvered}{linecolor=red,plotpoints=360}
\newpsstyle{onlythecurveblue}{linecolor=blue,plotpoints=360}
\newpsstyle{thicklineblue}{fillstyle=solid,fillcolor=blue!25,linecolor=blue,plotpoints=360}
\newpsstyle{rainbow}{fillstyle=ccslopes,linecolor=red,plotpoints=360}
\newpsstyle{solide}{fillstyle=solid,fillcolor=black,plotpoints=360}
\newpsstyle{default}{}% lignes noires, rien à l'intérieur
\end{verbatim}
Dans la commande \verb+\psthick[options]{t1}{t2}{function}+, \textcolor{red}{\texttt{t1}} est la valeur initiale et
\textcolor{red}{\texttt{t2}} la valeur finale, comme dans \verb+\parametricplot+.

La fonction sera définie, en \texttt{PostScript}, par $\mathsf{x(t)}$ et $\mathsf{y(t)}$. L'exemple le plus simple, pré-défini, est la fonction \texttt{sinus}~:~\verb+\fonctionSinus{période}{amplitude}+
\begin{verbatim}
\def\fonctionSinus#1#2{%
    /P #1 def % période (10 unités)
    /A #2 def % amplitude
    /O 360 P div def % pulsation 2*pi/P
    /x0 t def
    /y0 t O mul sin A mul def % A*sin(O*t)
    /dx dt def
    /dy t dt add O mul sin
        t O mul sin
        sub
        A mul def }
\end{verbatim}
Le nom des variables ne doit pas être modifié. Pour définir une fonction particulière, il faut donc écrire 4 définitions :
\begin{itemize}
  \item \texttt{x0=x(t)}
  \item \texttt{y0=y(t)}
  \item \texttt{dx=x(t+dt)-x(t)}
  \item \texttt{dy=y(t+dt)-y(t)}
\end{itemize}
en respectant la notation \texttt{PostScript} et passer, éventuellement, en options, d'autres paramètres, comme dans cet exemple, la période et l'amplitude. D'autres exemple seront donnés plus loin.
\section{Tracer une courbe avec une épaisseur donnée, principe :}
Prenons, par exemple, le tracé d'une sinusoïde avec une épaisseur constante de 2~cm. Le principe est simple et se décompose en 4 points :
\begin{itemize}
  \item tracer la sinusoïde en question(en traits discontinus);
  \item tracer la normale en chacun des points(en un nombre de points donnés) et de part et d'autre marquer
  à une distance égale à la demi-épaisseur les points correspondants aux deux bords de la courbe ;
  \item tracer, en reliant les points correspondants, les deux bords de la courbe, qui, remarquons-le, ne sont plus des sinusoïdes ;
  \item remplir l'intervalle avec la couleur ou le motif voulu.
\end{itemize}
{\psset{unit=0.75}
\begin{center}
\begin{pspicture}(-1,-3)(10,3)
\psthick[curveonly,E=2]{0}{10}{\fonctionSinus{10}{2}}
\multido{\i=0+1}{11}{%
\pnode(!/t \i\space def
    /E 2 def
    /dt 10 360 div def
    \fonctionSinus{10}{2}
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /nx E 2 div dy mul neg def % normale x
    /ny E 2 div dx mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot[linecolor=red](A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot[linecolor=red](B)
\psdot(!t O t mul sin A mul)
\psline(A)(B)}
\parametricplot[linestyle=dashed]{0}{10}{%
     t O t mul sin A mul
    }
\psaxes(0,0)(-1,-3)(10,3)
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-1,-3)(10,3)
\psthick[E=2]{0}{10}{\fonctionSinus{10}{2}}%
\psaxes(0,0)(-1,-3)(10,3)%\psgrid(0,-3)(10,3)
\end{pspicture}
\end{center}}
%
\begin{verbatim}
\begin{center}
\begin{pspicture}(-1,-3)(10,3)
\psthick[curveonly,E=2]{0}{10}{\fonctionSinus{10}{2}}
\multido{\i=0+1}{11}{%
\pnode(!/t \i\space def
    /E 2 def
    /dt 10 360 div def
    \fonctionSinus{10}{2}
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /nx E 2 div dy mul neg def % normale x
    /ny E 2 div dx mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot[linecolor=red](A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot[linecolor=red](B)
\psdot(!t O t mul sin A mul)
\psline(A)(B)}
\parametricplot[linestyle=dashed]{0}{10}{%
     t O t mul sin A mul
    }
\psaxes(0,0)(-1,-3)(10,3)
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-1,-3)(10,3)
\psset{plotpoints=360}
\psthick[E=2]{0}{10}{\fonctionSinus{10}{2}}%
\psaxes(0,0)(-1,-3)(10,3)%\psgrid(0,-3)(10,3)
\end{pspicture}
\end{center}
\end{verbatim}
\section{Le même(?) résultat avec les commandes de base de \mbox{PStricks}}
L'option \verb+doubleline=true+ et ses paramètres associés \verb+doublecolor+ et \verb+doublesep+ permettent d'obtenir un
tracé analogue(preuve que les commandes internes à \texttt{PostScript} utilisent la même méthode que celle employée dans la première partie).

Les valeurs passées en options sont les suivantes :
\begin{itemize}
  \item \verb+doublecolor=red!25+
  \item \verb+doublesep=2+ : épaisseur de 2~cm
  \item \verb+linecolor=red+
%  \item \verb+linewidth=\pslinewidth+ : épaisseur standard d'une ligne.
\end{itemize}
\begin{center}
\begin{pspicture}(-1,-3)(10,3.5)
  \pnode(!/P 10 def % période (10 unités)
    /A 2 def % amplitude
    /O 360 P div def
    0 0){bluf}
\psset{plotpoints=360}
    \parametricplot[doublecolor=red!25,doubleline=true,linecolor=red,doublesep=2]{0}{10}{%
     t O t mul sin A mul
    }%
\psgrid(0,-2)(10,3)
\end{pspicture}
\end{center}
Il y a quand même une différence dans la méthode employée par \texttt{PStricks}, on peut l'observer sur le tracé suivant :
\begin{center}
\begin{pspicture}(-1,-3)(10,3.5)
  \pnode(!/P 10 def % période (10 unités)
    /A 2 def % amplitude
    /O 360 P div def
    0 0){bluf}
\psset{plotpoints=360}
    \parametricplot[doublecolor=red!25,doubleline=true,linecolor=red,doublesep=2]{0}{10}{%
     t O t mul sin A mul
    }%
\psset{plotpoints=360}
    \parametricplot[linecolor=red,linewidth=2]{7}{10}{%
     t O t mul sin A mul
    }%
\psgrid(0,-2)(10,3)
\end{pspicture}
\end{center}
\texttt{PStricks} trace d'abord une courbe d'épaisseur 2~cm plus l'épaisseur d'un trait de couleur rouge, puis avec le pinceau de la couleur
de \verb+doublecolor+ une ligne d'épaisseur 2~cm, qui remplace la couleur rouge entre les deux bords. On peut apercevoir, très fugitivement, ce phénomène,
lors de l'affichage avec un visualiseur \texttt{PostScript}.
\section{Réalisation d'une frise par les deux méthodes}
On peut donc se demander, à juste titre, s'il y a un quelconque intérêt à fabriquer une commande spéciale
pour tracer des courbes épaisses dès lors que les commandes de base de \texttt{PStricks} permettent aisément d'obtenir le résultat souhaité ?

Afin de comparer les deux méthodes, réalisons l'ébauche d'une frise où deux sinusoïdes s'entrelacent, l'une passant alternativement dessus puis dessous la deuxième.
\subsection{Méthode 1 : simple superposition}
La démarche utilisée est ultra simple : on trace d'abord la sinusoïde rouge puis la sinusoïde bleue, ensuite on re-dessine par-dessus une portion de
sinusoïde rouge correspondant à la deuxième intersection
{\psset{unit=0.5}
\begin{center}
\begin{pspicture}(-1,-4)(12,4)
\psset{E=2}
\psthick{-2.5}{12.5}{\fonctionSinus{10}{2}}
\psthick[stylethick=thicklineblue]{-2.5}{12.5}{\fonctionSinus{10}{-2}}
\psthick[linestyle=none]{2.5}{7.5}{\fonctionSinus{10}{2}}
\psthick[curveonly]{2.5}{7.5}{\fonctionSinus{10}{2}}
\rput(5.5,-3.5){Commande spéciale}
\end{pspicture}
\hfill
\begin{pspicture}(-1,-4)(12,4)
  \pnode(!/P 10 def % période (10 unités)
    /A 2 def % amplitude
    /O 360 P div def
    0 0){bluf}
\psset{plotpoints=360}
    \parametricplot[linewidth=\pslinewidth,doublecolor=red!25,doubleline=true,linecolor=red,doublesep=2]{-2.5}{12.5}{%
     t O t mul sin A mul
    }%
    \parametricplot[linewidth=\pslinewidth,doublecolor=blue!25,doubleline=true,linecolor=blue,doublesep=2]{-2.5}{12.5}{%
     t O t mul sin A mul neg
    }%
    \parametricplot[linewidth=\pslinewidth,doublecolor=red!25,doubleline=true,linecolor=red,doublesep=2]{2.5}{7.5}{%
     t O t mul sin A mul
    }%
\rput(5.5,-3.5){Commandes de base \texttt{PStricks}}
\end{pspicture}
\end{center}}
Votre \oe{}il exercé a certainement remarqué que les raccordements ne sont pas parfaits avec les commandes de base \texttt{PStricks}, une fine trace verticale
rouge marque les deux extrémités de la portion rajoutée !
\subsection{Méthode 2 : commande \texttt{clip}}
Une méthode plus élaborée consiste à ne dessiner pour la deuxième intersection que la partie correspondante à la courbe rouge qui coïncide avec la courbe bleue
lors de l'intersection, cela est possible avec la commande \texttt{clip} de \texttt{PostScript} adaptée à \texttt{PStricks}.

Dans les deux cas nous allons faire un \textit{clipping} de la courbe bleue et le remplacer à la deuxième intersection par la courbe rouge.
\begin{center}
\psset{unit=0.5}
\begin{pspicture}(-1,-4)(12,4)
\psthick[E=2]{-2.5}{12.5}{\fonctionSinus{10}{2}}%
\psthick[E=2,stylethick=thicklineblue]{-2.5}{12.5}{\fonctionSinus{10}{-2}}%
% on élargit la courbe bleue pour ne pas laisser de traces de bord lors du clipping
\psclip{\psthick[E=2.5,stylethick=vide]{0}{10}{\fonctionSinus{10}{-2}}}%
% l'épaisseur initiale est rétablie
\psthick[E=2]{2.5}{7.5}{\fonctionSinus{10}{2}}%
\endpsclip%
\rput(5.5,-3.5){Commande spéciale}
\end{pspicture}
\hfill
\begin{pspicture}(-1,-4)(12,4)
  \pnode(!/P 10 def % période (10 unités)
    /A 2 def % amplitude
    /O 360 P div def
    0 0){bluf}
\psset{plotpoints=360}
    \parametricplot[linewidth=\pslinewidth,doublecolor=red!25,doubleline=true,linecolor=red,doublesep=2]{-2.5}{12.5}{%
     t O t mul sin A mul
    }%
    \parametricplot[linewidth=\pslinewidth,doublecolor=blue!25,doubleline=true,linecolor=blue,doublesep=2]{-2.5}{12.5}{%
     t O t mul sin A mul neg
    }%
\psclip{\parametricplot[doubleline=true,doublecolor=blue!25,linecolor=blue,doublesep=2]{2.5}{7.5}{%
     t O t mul sin A mul neg}}
\parametricplot[linewidth=\pslinewidth,doublecolor=red!25,doubleline=true,linecolor=red,doublesep=2]{2.5}{7.5}{%
     t O t mul sin A mul}
\endpsclip%
\rput(5.5,-3.5){Commandes de base \texttt{PStricks}}
\end{pspicture}
\end{center}
\begin{verbatim}
\begin{pspicture}(-1,-4)(12,4)
\psthick[E=2]{-2.5}{12.5}{\fonctionSinus{10}{2}}%
\psthick[E=2,stylethick=thicklineblue]{-2.5}{12.5}{\fonctionSinus{10}{-2}}%
% on élargit la courbe bleue pour ne pas laisser de traces de bord lors du clipping
\psclip{\psthick[E=2.5,stylethick=vide]{0}{10}{\fonctionSinus{10}{-2}}}%
% l'épaisseur initiale est rétablie
\psthick[E=2]{2.5}{7.5}{\fonctionSinus{10}{2}}%
\endpsclip%
\rput(5.5,-3.5){Commande spéciale}
\end{pspicture}
\end{verbatim}
\textbf{Conclusion : avantage à la commande spéciale.} Les commandes de base \texttt{PStricks} ne permettent pas de faire un \textit{clipping}, car le chemin qui délimite le contour de la ligne
n'est pas défini, ou plutôt n'est pas accessible par ce procédé.
\newpage
\section{Remplir l'intérieur avec une couleur ou un motif particulier}
\subsection{Les couleurs de l'arc-en-ciel}
Cela est facile, grâce au package \texttt{pst-slpe}, en définissant le style adapté :
\begin{verbatim}
\newpsstyle{rainbow}{fillstyle=ccslopes,linecolor=red}
\end{verbatim}
\begin{center}
\begin{pspicture}(-1,-2)(10,3)
\psthick[stylethick=rainbow,E=0.5]{0}{10}{\fonctionSinus{5}{2}}
\psaxes(0,0)(-1,-2)(10,3)
\end{pspicture}
\end{center}
\begin{verbatim}
\begin{pspicture}(-1,-2)(10,3)
\psthick[stylethick=rainbow,E=0.5]{0}{10}{\fonctionSinus{5}{2}}
\psaxes(0,0)(-1,-2)(10,3)
\end{pspicture}
\end{verbatim}
\subsection{Des hachures}
\newpsstyle{hachures}{fillstyle=crosshatch,plotpoints=360}
\begin{center}
\begin{pspicture}(-1,-2)(10,3)
\psthick[stylethick=hachures,E=0.5]{0}{10}{\fonctionSinus{5}{2}}
\psaxes(0,0)(-1,-2)(10,3)
\end{pspicture}
\end{center}
\begin{verbatim}
\newpsstyle{hachures}{fillstyle=crosshatch,plotpoints=360}
\begin{center}
\begin{pspicture}(-1,-2)(10,3)
\psthick[stylethick=hachures,E=0.5]{0}{10}{\fonctionSinus{5}{2}}
\psaxes(0,0)(-1,-2)(10,3)
\end{pspicture}
\end{center}
\end{verbatim}
\newpage
\section{Simulation(?) de la reptation d'un ver ou d'un serpent}
{\psset{unit=0.5}
\begin{center}
\begin{pspicture}(-1,-2)(20,3)
\psthick[stylethick=serpent,E=1.5]{0}{20}{\fonctionSinus{10}{2}}
\multido{\i=0+1}{21}{%
\pnode(!/t \i\space def
    /dt 10 360 div def
    /E 1.5 def
    \fonctionSinus{10}{2}
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /nx E 2 div dy mul neg def % normale x
    /ny E 2 div dx mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot(A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot(B)
\psline(A)(B)}
\parametricplot[linestyle=dashed]{0}{20}{%
     t O t mul sin 2 mul
    }
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-1,-2)(20,3)
\psthick[stylethick=serpent,E=1.5]{0}{20}{\fonctionSinus{10}{0.5}}
\multido{\i=0+1}{21}{%
\pnode(!/t \i\space def
    /dt 10 360 div def
    \fonctionSinus{10}{0.5}
    /E 1.5 def
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /nx E 2 div dy mul neg def % normale x
    /ny E 2 div dx mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot(A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot(B)
\psline(A)(B)}
\parametricplot[linestyle=dashed]{0}{20}{%
     t O t mul sin 0.5 mul
    }
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-1,-2)(20,3)
\psthick[stylethick=serpent,E=1.5]{0}{20}{\fonctionSinus{10}{-1}}
\multido{\i=0+1}{21}{%
\pnode(!/t \i\space def
    /dt 10 360 div def
    /E 1.5 def
    \fonctionSinus{10}{-1}
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /nx E 2 div dy mul neg def % normale x
    /ny E 2 div dx mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot(A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot(B)
\psline(A)(B)}
\parametricplot[linestyle=dashed]{0}{20}{%
     t O t mul sin -1 mul
    }
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-1,-2)(20,3)
\psthick[stylethick=serpent,E=1.5]{0}{20}{\fonctionSinus{10}{-2.5}}
\multido{\i=0+1}{21}{%
\pnode(!/t \i\space def
    /dt 10 360 div def
    \fonctionSinus{10}{-2.5}
    /E 1.5 def
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /nx E 2 div dy mul neg def % normale x
    /ny E 2 div dx mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot(A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot(B)
\psline(A)(B)}
\parametricplot[linestyle=dashed]{0}{20}{%
     t O t mul sin -2.5 mul
    }
\end{pspicture}
\end{center}}
\newpage
\section{Autres exemples : parabole et cercle}
\def\fonctionParabole#1#2#3{% ax^2+bx+c
    /A #1 def %
    /B #2 def %
    /C #3 def
    /x0 t def
    /y0 A t dup mul mul t B mul add C add def % ax^2+bx+c
    /dx dt def
    /dy A t dt add dup mul mul t dt add B mul add C add
        A t dup mul mul t B mul add C add
        sub
        def
    }
\begin{center}
\psset{unit=0.75}
\begin{pspicture}(-6,-5)(3,5)
\psthick[stylethick=thicklineblue,linewidth=0.1]{-6}{2}{\fonctionParabole{0.5}{2}{-2}}
\psaxes(0,0)(-6,-5)(3,5)
\end{pspicture}
\hfill
\begin{pspicture}(-6,-5)(3,5)
\psthick[curveonly,stylecurve2=onlythecurveblue,linewidth=0.1]{-6}{2}{\fonctionParabole{0.5}{2}{-2}}
\multido{\n=-6+0.5}{17}{%
\pnode(!/t \n\space def
    /dt 0.01 def
    \fonctionParabole{0.5}{2}{-2}
    /E 1 def
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /nx E 2 div dy mul neg def % normale x
    /ny E 2 div dx mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot(A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot(B)
\psline(A)(B)}
\psaxes(0,0)(-6,-5)(3,5)
\end{pspicture}
\end{center}
\begin{verbatim}
\begin{pspicture}(-6,-5)(3,5)
\psthick[stylethick=thicklineblue,linewidth=0.1]{-6}{2}{\fonctionParabole{0.5}{2}{-2}}
\psaxes(0,0)(-6,-5)(3,5)
\end{pspicture}
\end{verbatim}
\begin{verbatim}
\def\fonctionParabole#1#2#3{% ax^2+bx+c
    /A #1 def %
    /B #2 def %
    /C #3 def
    /x0 t def
    /y0 A t dup mul mul t B mul add C add def % ax^2+bx+c
    /dx dt def
    /dy A t dt add dup mul mul t dt add B mul add C add
        A t dup mul mul t B mul add C add
        sub
        def
    }
\end{verbatim}
\def\fonctionCercle#1#2#3{% {x_centre}{y_centre}{rayon}
    /xC #1 def %
    /yC #2 def %
    /radius #3 def
    /x0 t cos radius mul xC add def
    /y0 t sin radius mul yC add def
    /dx t dt add cos radius mul xC add
        x0 sub def
     /dy t dt add sin radius mul yC add
         y0 sub def}
\begin{center}
\begin{pspicture}(-4,-5)(3,5)
\psthick[E=1,linewidth=0.1]{45}{315}{\fonctionCercle{-1}{-1}{3}}%
\psthick[curveonly]{-45}{45}{\fonctionCercle{-1}{-1}{3}}%
\psdot(-1,-1)
\pscircle[linestyle=dashed](-1,-1){3}
\multido{\i=-45+10}{10}{%
\pnode(!/t \i\space def
    /dt 1 def
    \fonctionCercle{-1}{-1}{3}
    /E 1 def
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /nx E 2 div dy mul neg def % normale x
    /ny E 2 div dx mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot(A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot(B)
\psline(A)(B)}
\psaxes(0,0)(-4,-4)(3,4)
\end{pspicture}
\hfill
\begin{pspicture}(-3,-5)(3,3)
\psclip{\psthick[E=0.5,stylethick=vide]{0}{360}{\fonctionCercle{0}{0}{2}}}
\psframe*[linecolor=blue](-3.5,-4)(1.17,4)
\psframe*[linecolor=white](-1.17,-4)(1.17,4)
\psframe*[linecolor=red](1.17,-4)(3.5,4)
\endpsclip%
\psthick[curveonly,E=0.5,stylecurve2=onlythecurveblue]{0}{360}{\fonctionCercle{0}{0}{2}}%
\psaxes(0,0)(-4,-4)(4,4)
\end{pspicture}
\end{center}
\begin{verbatim}
\psthick[E=1,linewidth=0.1]{45}{315}{\fonctionCercle{-1}{-1}{3}}%
\psthick[curveonly]{-45}{45}{\fonctionCercle{-1}{-1}{3}}%
\psdot(-1,-1)
\pscircle[linestyle=dashed](-1,-1){3}
\multido{\i=-45+10}{10}{%
\pnode(!/t \i\space def
    /dt 1 def
    \fonctionCercle{-1}{-1}{3}
    /E 1 def
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /nx E 2 div dy mul neg def % normale x
    /ny E 2 div dx mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot(A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot(B)
\psline(A)(B)
\end{verbatim}
\begin{verbatim}
\def\fonctionCercle#1#2#3{% {x_centre}{y_centre}{rayon}
    /xC #1 def %
    /yC #2 def %
    /radius #3 def
    /x0 t cos radius mul xC add def
    /y0 t sin radius mul yC add def
    /dx t dt add cos radius mul xC add
        x0 sub def
     /dy t dt add sin radius mul yC add
         y0 sub def}
\end{verbatim}
\section{Influence de l'inclinaison : paramètre \texttt{K}}
\subsection{Sur la sinusoïde avec K=45°}
\texttt{K} est l'inclinaison en degrés, par rapport à la normale à la courbe d'origine.
{\psset{unit=0.75}
\begin{center}
\begin{pspicture}(-1,-3)(10,3)
\psthick[curveonly,E=2,K=45]{0}{10}{\fonctionSinus{10}{2}}
\multido{\i=0+1}{11}{%
\pnode(!/t \i\space def
    /E 2 def
    /K 45 def
    /dt 10 360 div def
    \fonctionSinus{10}{2}
    /ds dx dup mul dy dup mul add sqrt def
    /dx dx ds div def
    /dy dy ds div def
    /dx' K cos dx mul K sin dy mul sub def
    /dy' K sin dx mul K cos dy mul add def
    /nx E 2 div dy' mul neg def % normale x
    /ny E 2 div dx' mul def % normale y
    /x1 x0 nx add def
    /y1 y0 ny add def
      x1 y1){A}
\psdot[linecolor=red](A)
\pnode(!
    /x2 x0 nx sub def
    /y2 y0 ny sub def
      x2 y2){B}
\psdot[linecolor=red](B)
\psdot(!t O t mul sin A mul)
\psline(A)(B)}
\parametricplot[linestyle=dashed]{0}{10}{%
     t O t mul sin A mul
    }
\psaxes(0,0)(-1,-3)(10,3)
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-1,-3)(10,3)
\psset{plotpoints=360}
\psthick[E=2,K=45]{0}{10}{\fonctionSinus{10}{2}}%
\psaxes(0,0)(-1,-3)(10,3)%\psgrid(0,-3)(10,3)
\end{pspicture}
\end{center}}
\subsection{Sur l'épaisseur avec K=80°}
\begin{center}
\begin{pspicture}(-1,-3)(10,3)
\psset{plotpoints=360}
\psthick[E=2,K=80,stylethick=solide]{0}{10}{\fonctionSinus{10}{2}}%
\psaxes(0,0)(-1,-3)(10,3)%\psgrid(0,-3)(10,3)
\end{pspicture}
\end{center}
\section{Une frise}
Obtenue à coups de \verb+\psclip+\ldots\verb+\endpsclip+\ldots très laborieux et pas très beau : à revoir !
\newpsstyle{thicklinejaune}{fillstyle=solid,fillcolor=yellow!50!cyan!50,linecolor=yellow,plotpoints=360}
\newpsstyle{thicklinevert}{fillstyle=solid,fillcolor=green!50,linecolor=green,plotpoints=360}
\newpsstyle{onlycurvejaune}{linecolor=yellow,plotpoints=360}
\def\SinusPhase#1#2#3{%
    /P #1 def % période (10 unités)
    /A #2 def % amplitude
    /F #3 180 div 3.14 mul def
    /O 360 P div def % pulsation 2*pi/P
    /x0 t def
    /y0 t F add O mul sin A mul def % A*sin(O*t)
    /dx dt def
    /dy t F add dt add O mul sin
        t F add O mul sin
        sub
        A mul def }
\begin{center}
\psset{unit=0.5}
\begin{pspicture}(0,-4)(30,4)
\def\motif{%
\psclip{\psframe[linestyle=none,dimen=inner](0,-3)(10,3)}%
\psthick[stylethick=thicklineblue]{-1}{11}{\SinusPhase{10}{2}{90}}% bleu
\psthick[stylethick=thicklinejaune,E=0.5]{-1}{11}{\SinusPhase{10}{1.25}{-100}}% jaune
\psthick{-1}{11}{\SinusPhase{10}{2}{0}}% rose
%1-bleu dans intersection rose et bleu
\psclip{\psthick[stylethick=vide,E=1.1]{-1}{11}{\SinusPhase{10}{2}{0}}}% rose
\psthick[stylethick=thicklineblue]{0}{3}{\SinusPhase{10}{2}{90}}% bleu
\endpsclip%
%
\psclip{\psthick[stylethick=vide,E=1.1]{0}{11}{\SinusPhase{10}{2}{90}}}% bleu
\psthick{5}{9}{\SinusPhase{10}{2}{0}}% rose
\endpsclip%
%
\psclip{\psthick[stylethick=vide,E=0.6]{0}{11}{\SinusPhase{10}{1.25}{-100}}}% jaune
\psthick[stylethick=thicklineblue]{7}{9}{\SinusPhase{10}{2}{90}}% bleu
\endpsclip%
%
\psclip{\psthick[stylethick=vide,E=1.1]{0}{10}{\SinusPhase{10}{2}{0}}}% rose
\psthick[stylethick=thicklinejaune,E=0.5]{7}{11}{\SinusPhase{10}{1.25}{-100}}% jaune
\endpsclip%
%
\psclip{\psthick[stylethick=vide,E=1.1]{0}{11}{\SinusPhase{10}{2}{0}}}% rose
\psthick[stylethick=thicklinejaune,E=0.5]{-0.5}{1}{\SinusPhase{10}{1.25}{-100}}% jaune
\endpsclip%
\endpsclip}%
\motif\rput(10,0){\motif}\rput(20,0){\motif}
\psline[linewidth=0.1](0,3)(30,3)
\psline[linewidth=0.1](0,-3)(30,-3)
\end{pspicture}
\end{center}
\section{Les limites de la commande \/\texttt{psthick}}
Si l'épaisseur est trop grande par rapport au rayon de courbure, il apparaît le phénomène suivant(points de rebroussement)~:
\begin{center}
\psset{unit=0.5}
\begin{pspicture}(0,-6)(10,6)
\psthick[E=2,stylethick=default,plotpoints=720]{0}{10}{\fonctionSinus{5}{5}}%
\parametricplot[linestyle=dashed,plotpoints=720,linecolor=red]{0}{10}{%
    /P 5 def % période (5 unités)
    /A 5 def % amplitude
    /O 360 P div def
     t O t mul sin A mul
    }
\psaxes[Dx=10,Dy=5](0,0)(0,-5)(10,5)
\end{pspicture}
\hspace{2cm}%
\begin{pspicture}(0,-6)(10,6)
\parametricplot[plotpoints=720,linewidth=2]{0}{10}{%
    /P 5 def % période (5 unités)
    /A 5 def % amplitude
    /O 360 P div def
     t O t mul sin A mul
    }
\psaxes[Dx=10,Dy=5](0,0)(0,-5)(10,5)
\end{pspicture}
\end{center}
À droite la courbe obtenue avec la commande classique \verb+linewidth=2+ qui avec un pinceau de peinture noire de largeur 2~cm efface ces points.
\begin{verbatim}
\begin{pspicture}(0,-6)(10,6)
\psthick[E=2,stylethick=default,plotpoints=720]{0}{10}{\fonctionSinus{5}{5}}%
\end{pspicture}
\hfill
\begin{pspicture}(0,-6)(10,6)
\parametricplot[plotpoints=720,linewidth=2]{0}{10}{%
    /P 5 def % période (5 unités)
    /A 5 def % amplitude
    /O 360 P div def
     t O t mul sin A mul
    }
\end{pspicture}
\end{verbatim}
On peut en combinant les deux méthodes arriver à ``gommer'' ces points intérieurs de rebroussement tout en gardant le contour.
\begin{center}
\psset{unit=0.5}
\begin{pspicture}(0,-6)(10,6)
\psthick[curveonly,E=2,stylecurve2=onlythecurveblue,linewidth=0.2,plotpoints=720]{0}{10}{\fonctionSinus{5}{5}}%
\parametricplot[plotpoints=720,linewidth=2,linecolor=yellow]{0}{10}{%
    /P 5 def % période (5 unités)
    /A 5 def % amplitude
    /O 360 P div def
     t O t mul sin A mul
    }
\psaxes[Dx=10,Dy=5](0,0)(0,-5)(10,5)
\end{pspicture}
\end{center}
\begin{verbatim}
\begin{pspicture}(0,-6)(10,6)
\psthick[curveonly,E=2,stylecurve2=onlythecurveblue,linewidth=0.2]{0}{10}{\fonctionSinus{5}{5}}%
\parametricplot[plotpoints=720,linewidth=2,linecolor=yellow]{0}{10}{%
    /P 5 def % période (5 unités)
    /A 5 def % amplitude
    /O 360 P div def
     t O t mul sin A mul
    }
\psaxes[Dx=10,Dy=5](0,0)(0,-5)(10,5)
\end{pspicture}
\end{verbatim}
\end{document}

 

Validation CSS Validation XHTMLSyracuse — Dernière modification : 25 août 2007 (0.08s - 3788523 - 23 novembre 2008) vers le haut