\documentclass[11pt]{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[garamond]{mathdesign}
\usepackage{multido,animate,pst-math}
\usepackage[colorlinks=true]{hyperref}
\usepackage{pst-contourplot}
\title{psContourPlot}
\date{14 juillet 2018}
\author{Manuel Luque}
\title{L'algorithme ``\textit{marching squares}'' adapt� � PSTricks v\fileversion}
\begin{document}
\maketitle
\section{La commande \textbackslash{psContourPlot[options](x1,y1)(x2,y2)}}
Si vous ne connaissez pas les ``\textit{marching squares}'', l'article que Wikipedia lui consacre, tr�s joliment illustr�, me para�t tr�s complet :
\centerline{\url{
https://en.wikipedia.org/wiki/Marching_squares}}
Il s'agit d'une adaptation de cet algorithme � PSTricks, utilis� dans la commande \verb+\psContourPlot[options]+\footnote{Le nom de la commande est copi� sur celle de Mathematica : ContourPlot} qui poss�de les options suivantes :
\begin{enumerate}
\item \texttt{[function=])} : fonction implicite $f(x,y)$ de la courbe � repr�senter en mode algebraic ou postscript, il faut noter que le mode postscript est le plus rapide ;
\item \texttt{(x1,y1)(x2,y2)} : les limites du cadre d'�tude, comme pour \verb+\psframe(x1,y1)(x2,y2)+, coordonn�es du coin inf�rieur � gauche et du coin sup�rieur � droite ;
\item \texttt{[a=0.025]} : c�t� d'une cellule (carr�) ;
\item \texttt{[grid=false]} : bool�en pour dessiner la grille des cellules ;
\item \texttt{[Fill=false]} : bool�en pour colorier l'int�rieur avec l'option de PSTricks \texttt{[fillcolor]} ;
\item \texttt{[ReverseColors=false]} : le coloriage de l'int�rieur n'est valable que pour un seul objet (un cercle par exemple). S'il y a plusieurs objets (voir les 2 exemples des metaballs) c'est l'ext�rieur qui se colorise. En activant ce bool�en on corrige ce probl�me ;
\item \texttt{[showpoints]} : bool�en pour afficher les points la la courbe (option de PSTricks) ;
\item \texttt{[ChoicePoints= liste de num�ros de points]} : on place ici les points o� il y aura une fl�che sur la courbe, on indique une valeur n�gative si pour la valeur positive la fl�che n'est pas dans le sens souhait�~;
\item \texttt{[WriteData]} : bool�en permettant d'enregistrer les coordonn�es des points, le nom du fichier peut-�tre choisi avec l'option \texttt{[FileName=PointsCurve]}.
\end{enumerate}
Pour r�soudre les 2 cas ambigus de l'algorithme, j'ai adopt� la solution propos�e par Xiaoqiang Zheng et Alex Pang :
\centerline{\url{
https://classes.soe.ucsc.edu/cmps161/Winter14/papers/tensor/projects/contour/paper.pdf}}
Une deuxi�me commande \verb+\psReadData[FileName=...]+ permet repr�senter la courbe enregistr�e, l'option [Fill] n'est pas permise.
\section{Exemples}
\subsection{Un cercle}
\begin{center}
\begin{pspicture}[showgrid](-4,-4)(4,4)
\psContourPlot[algebraic,a=0.5,linecolor=red,grid,function=x^2+y^2-16,ChoicePoints=-4 120 -45,WriteData,FileName=circle,showpoints](-4,-4)(4,4)
\psline{<->}(0,4.5)(0,0)(4.5,0)
\uput[ul](0,0){$O$}
\uput[u](0,4.5){$y$}
\uput[r](4.5,0){$x$}
\end{pspicture}
\end{center}
\begin{verbatim}
\psContourPlot[algebraic,a=0.5,linecolor=red,grid,function=x^2+y^2-16,,showpoints,
ChoicePoints=-4 120 -45,WriteData,FileName=circle](-4,-4)(4,4)
\end{verbatim}
Cette grille contient 16 cellules suivant les 2 axes, le c�t� de chacune vaut 0.5 cm.
\subsection{Colorier l'int�rieur}
\begin{center}
\begin{pspicture}[showgrid=false](-6,-4)(6,4)
\psContourPlot[unit=0.5,algebraic,a=0.4,linecolor=blue,Fill,fillcolor=red,function=x*(x^2+y^2)-10*(x^2-y^2),grid](-10,-8)(10,8)
\psline{<->}(0,4.5)(0,0)(5.5,0)
\uput[d](0,0){$O$}
\uput[u](0,4.5){$y$}
\uput[r](5.5,0){$x$}
\end{pspicture}
\end{center}
\begin{verbatim}
\psContourPlot[unit=0.5,algebraic,a=0.4,
linecolor=blue,Fill,fillcolor=red,
function=x*(x^2+y^2)-10*(x^2-y^2),grid](-10,-8)(10,8)
\end{verbatim}
\subsection{2D metaballs}
\begin{center}
\begin{animateinline}[controls,palindrome,
begin={\begin{pspicture}(-8,-4)(8,4)},
end={\end{pspicture}}]{5}% 5 image/s
\multiframe{50}{r=-2+0.08}{%
\psframe*(-6.4,-4)(6.4,4)
\pstVerb{/xC \r\space def
/FonctionMetaballs {
1 x xC sub dup mul y dup mul add sqrt div
0.5 x xC add dup mul y dup mul add sqrt div
add
1 sub
} def}%
\psContourPlot[unit=2,a=0.1,linewidth=0.025,linecolor=red,fillcolor=cyan,Fill,ReverseColors,function=FonctionMetaballs](-4,-2)(4,2)
\psdots(! xC 2 mul 0)(! xC neg 2 mul 0)}
\end{animateinline}
\end{center}
\begin{verbatim}
\begin{animateinline}[controls,palindrome,
begin={\begin{pspicture}(-8,-4)(8,4)},
end={\end{pspicture}}]{5}% 5 image/s
\multiframe{50}{r=-2+0.08}{%
\psframe*(-6.4,-4)(6.4,4)
\pstVerb{/xC \r\space def
/FonctionMetaballs {
1 x xC sub dup mul y dup mul add sqrt div
0.5 x xC add dup mul y dup mul add sqrt div
add
1 sub
} def}%
\psContourPlot[unit=2,a=0.1,linewidth=0.025,linecolor=red,fillcolor=cyan,Fill,ReverseColors,
function=FonctionMetaballs](-8,-4)(8,4)
\psdots(! xC 2 mul 0)(! xC neg 2 mul 0)}
\end{animateinline}
\end{verbatim}
\newpage
% 5 metaballs
\begin{center}
% 1/((x-0.0001)^2+(y-1)^2)^2+
% 1/((x-0.95)^2+(y-0.309)^2)^2+
% 1/((x+0.5878)^2+(y+0.809)^2)^2+
% 1/((x-0.5878)^2+(y+0.809)^2)^2+
% 1/((x+0.95)^2+(y-0.309)^2)^2
% -17
\begin{pspicture}[showgrid](-4,-4)(4,4)
\psset{unit=2.5}
\pstVerb{/FonctionMetaballs {
1 x 0.0001 sub dup mul y 1 sub dup mul add dup mul div
1 x 0.95 sub dup mul y 0.309 sub dup mul add dup mul div add
1 x 0.5878 sub dup mul y 0.809 add dup mul add dup mul div add
1 x 0.5878 add dup mul y 0.809 add dup mul add dup mul div add
1 x 0.95 add dup mul y 0.309 sub dup mul add dup mul div add
17 sub
} def}%
\psContourPlot[a=0.025,linecolor=red,fillcolor=cyan,Fill,ReverseColors,
function=FonctionMetaballs](-4,-4)(4,4)
\psdots(0,1)(0.95,0.309)(-0.95,0.309)(-0.5878,-0.809)(0.5878,-0.809)
\pspolygon(0,1)(-0.95,0.309)(-0.5878,-0.809)(0.5878,-0.809)(0.95,0.309)
\end{pspicture}
\end{center}
\begin{verbatim}
% 5 metaballs
\begin{center}
% 1/((x-0.0001)^2+(y-1)^2)^2+
% 1/((x-0.95)^2+(y-0.309)^2)^2+
% 1/((x+0.5878)^2+(y+0.809)^2)^2+
% 1/((x-0.5878)^2+(y+0.809)^2)^2+
% 1/((x+0.95)^2+(y-0.309)^2)^2
% -17
\begin{pspicture}[showgrid](-4,-4)(4,4)
\psset{unit=2.5}
\pstVerb{/FonctionMetaballs {
1 x 0.0001 sub dup mul y 1 sub dup mul add dup mul div
1 x 0.95 sub dup mul y 0.309 sub dup mul add dup mul div add
1 x 0.5878 sub dup mul y 0.809 add dup mul add dup mul div add
1 x 0.5878 add dup mul y 0.809 add dup mul add dup mul div add
1 x 0.95 add dup mul y 0.309 sub dup mul add dup mul div add
17 sub
} def}%
\psContourPlot[a=0.05,linecolor=red,fillcolor=cyan,Fill,ReverseColors,
function=FonctionMetaballs](-4,-4)(4,4)
\psdots(0,1)(0.95,0.309)(-0.95,0.309)(-0.5878,-0.809)(0.5878,-0.809)
\pspolygon(0,1)(-0.95,0.309)(-0.5878,-0.809)(0.5878,-0.809)(0.95,0.309)
\end{pspicture}
\end{verbatim}
\newpage
\subsection{Les lignes de champ d'un dip�le hertzien}
\begin{center}
\begin{pspicture}(-5,-5)(5,5)
\pstVerb{/ti 0 def /k0 2 PI mul def}%
\multido{\rc=-0.9+0.2,\i=1+1}{11}{
\psContourPlot[unit=5,a=0.025,linewidth=0.01,linecolor={[rgb]{0 0.5 0}},
function=/ri x dup mul y dup mul add sqrt k0 mul def
/theta x y atan def
ri ti sub COS ri ti sub SIN ri div add theta sin dup mul mul \rc\space sub](-1,-1)(1,1)
}
\end{pspicture}
\end{center}
\begin{verbatim}
\pstVerb{/t 0 def /k0 2 PI mul def}%
\multido{\rc=-1.1+0.2}{11}{
\psContourPlot[unit=5,a=0.025,linewidth=0.01,linecolor={[rgb]{0 0.5 0}},
function=/r x dup mul y dup mul add sqrt k0 mul def
/theta x y atan def
r t sub COS r t sub SIN r div add theta sin dup mul mul \rc\space sub](-1,-1)(1,1)}
\end{verbatim}
\section{Compl�ments}
Des exemples sont inclus dans la documentation, mais vous trouverez d'autres exemples sur le blog :
\centerline{\url{
http://pstricks.blogspot.com/}}
\noindent et comme application d�di�e � la physique, le trac� des lignes de champ magn�tique de fils parall�les :
\centerline{\url{
http://pstricks.blogspot.com/2018/07/champs-magnetiques-crees-par-des-fils.html}}
\end{document}