% luamesh: compute and draw meshes with lua, luamplib and tikz % % Originally written by Maxime Chupin , % 2017. % % Distributed under the terms of the GNU free documentation licence: % http://www.gnu.org/licenses/fdl.html % without any invariant section or cover text. \documentclass{luameshdoc} \usepackage{tcolorbox} \usepackage{enumitem} \usepackage[tikz]{bclogo} \usepackage{wrapfig} \usepackage{animate} \title{\Verb+luamesh+: compute and draw meshes with \lualatex} \author{Maxime Chupin \email{notezik@gmail.com}} \date{\today} \addbibresource{biblio.bib} \definecolor{darkred}{rgb}{0.8,0.1,0.1} \newcommand*\commande{\noindent\hspace{-30pt}% \SaveVerb[aftersave={% \UseVerb{Vitem} }% ]{Vitem}} \newcommand*\textme[1]{\textcolor{black}{\rmfamily\textit{#1}}} \newcommand*\meta[1]{% % meta \textme{\ensuremath{\langle}#1\ensuremath{\rangle}}} \newcommand*\optstar{% % optional star \meta{\ensuremath{*}}\xspace} \DefineShortVerb{\|} \newcommand\R{\mathbf{R}} \setlength{\fboxsep}{2pt} \fvset{% codes={\catcode`\«\active \catcode`\×\active }, defineactive={\makefancyog\makefancytimes}, formatcom=\color{darkred}, frame=single } % rendre «...» équivalent à \meta{...} {\catcode`\«\active \newcommandx\makefancyog[0][addprefix=\global]{% \def«##1»{\meta{##1}}}} % rendre × équivalent à \optstar {\catcode`\×\active \newcommandx\makefancytimes[0][addprefix=\global]{% \def×{\optstar{}}}} \tcbuselibrary{listings,breakable} \definecolor{vert}{rgb}{0.1,0.4,0.1} \definecolor{bleu}{rgb}{0.1,0.1,0.4} \lstset{ numberstyle=\footnotesize\color{vert}, keywordstyle=\ttfamily\bfseries\color{blue}, basicstyle=\ttfamily\footnotesize, commentstyle=\itshape\color{vert}, stringstyle=\ttfamily, showstringspaces=false, language=[LaTeX]TeX, breaklines=true, breakindent=30pt, defaultdialect=[LaTeX]TeX, morekeywords={buildMeshBW,buildMeshBWinc,drawPointsMesh,buildVoronoiBW,buildVoronoiBWinc, drawPointsMeshinc, meshAddPointBW, meshAddPointBWinc,drawGmsh,drawGmshinc,gmshVoronoi,gmshVoronoiinc}% frame=tb } \lstdefinelanguage{lua} {morekeywords={for,end,function,do,if,else,elseif,then, tex.print,tex.sprint,io.read,io.open,string.find,string.explode,require}, morecomment=[l]{--}, morecomment=[s]{--[[}{]]}, morestring=[b]'' } \newtcblisting{Exemple}{% arc=0pt,outer arc=0pt, colback=red!2!white, colframe=red!75!black, breakable, boxsep=0pt,left=5pt,right=5pt,top=5pt,bottom=5pt, bottomtitle = 3pt, toptitle=3pt, boxrule=0pt,bottomrule=0.5pt,toprule=0.5pt, toprule at break = 0pt, bottomrule at break = 0pt, listing options={breaklines}, } \newtcblisting{commandshell}{colback=black,colupper=white,colframe=black, arc=0pt, listing only,boxsep=0pt,listing options={style=tcblatex,language=sh}, every listing line={\textcolor{red}{\small\ttfamily\bfseries user \$> }}} \newtcblisting{latexcode}{ arc=0pt,outer arc=0pt, colback=red!2!white, colframe=red!75!black, breakable, boxsep=0pt,left=5pt,right=5pt,top=5pt,bottom=5pt, bottomtitle = 3pt, toptitle=3pt, boxrule=0pt,bottomrule=0.5pt,toprule=0.5pt, toprule at break = 0pt, bottomrule at break = 0pt, listing only,boxsep=0pt,listing options={breaklines} } \newcommand\luamesh{\Verb+luamesh+\xspace} \newenvironment{optionsenum}[1][] {\begin{description}[font=\color{darkred}\ttfamily]} {\end{description}} \newenvironment{warning}{% \setlength{\logowidth}{24pt} \tcbset{% arc=0pt,outer arc=0pt,colback=gray!10!white,colframe=gray!60!white, boxsep=0pt,left=5pt,right=5pt,top=5pt,bottom=5pt, bottomtitle = 3pt, toptitle=3pt, boxrule=0pt,bottomrule=0.5pt,toprule=0.5pt} \medskip \begin{tcolorbox}% \begin{wrapfigure}[2]{L}{17pt}% % \raisebox{-5pt}{ \vspace*{-0.55cm} \bcinfo % }% \end{wrapfigure} }% {\end{tcolorbox}\medskip} \lstset{moredelim=*[s][\color{red}\rmfamily\itshape]{<}{>}} \lstset{moredelim=*[s][\color{blue}\rmfamily\itshape]{<<}{>>}} \begin{document} %% === Page de garde =================================================== \thispagestyle{empty} \begin{tikzpicture}[remember picture, overlay] \node[below right, shift={(-4pt,4pt)}] at (current page.north west) {% \includegraphics{fond.pdf}% }; \end{tikzpicture}% \noindent \includegraphics{luamesh-title}\\ {\large compute and draw meshes with \lualatex}\\[1cm] \parbox{0.6\textwidth}{ \meshAddPointBW[ mode=ext,step=badtriangles, colorNew =green!20!red, colorBack=red!10, colorCircle = blue, bbox = show, colorBbox = black!30 ] {meshgarde.txt}{7} }\hfill \parbox{0.4\textwidth}{\Large\raggedleft \textbf{Contributor}\\ Maxime \textsc{Chupin} } \vfill \begin{center} Version 0.7, 2022, July, 8th \\ \url{https://plmlab.math.cnrs.fr/mchupin/luamesh} \end{center} %% == Page de garde ==================================================== \newpage \maketitle \begin{abstract} The package \Verb|luamesh| allows to compute and draw 2D Delaunay triangulation. The algorithm is written with lua, and depending on the choice of the ``engine'', the drawing is done by MetaPost (with \Verb|luamplib|) or by \Verb|tikz|. The Delaunay triangulation algorithm is the Bowyer and Watson algorithm. Several macros are provided to draw the global mesh, the set of points, or a particular step of the algorithm. \end{abstract} I would like to thank Jean-Michel Sarlat, who hosts first the development with a git project on the \Verb+melusine+ machine. Now the project is hosted here : \begin{center} \url{https://plmlab.math.cnrs.fr/mchupin/luamesh} \end{center} I would also like to thank the first user, an intensive \emph{test} user, and a very kind English corrector: Nicole Spillane. For the references of the algorithm, see~\cite{Bowyer,Watson} and a reference about mesh is~\cite{Frey}. \tableofcontents \section{Installation} \luamesh is on the CTAN and can be installed with the package manager of your distribution. \begin{center} \url{https://www.ctan.org/pkg/luamesh} \end{center} \subsection{With \TeX live and Linux or Mac OSX} To install \luamesh with \TeX live, you have to create the local \Verb+texmf+ directory in your \Verb+home+. \begin{commandshell} mkdir ~/texmf \end{commandshell} Then place the files in the correct directories. The \Verb+luamesh.sty+ file must be in directory: \begin{center} \Verb+~/texmf/tex/latex/luamesh/+ \end{center} the \Verb+luamesh.lua+, the \Verb+luamesh-tex.lua+ and the \Verb-luamesh-polygon.lua+ files must be in directory: \begin{center} \Verb+~/texmf/scripts/luamesh/+ \end{center} and the \Verb+luamesh.mp+ file must be in directory: \begin{center} \Verb+~/texmf/metapost/luamesh/+ \end{center} Once you have done this, \luamesh can be included in your document with \begin{latexcode} \usepackage{luamesh} \end{latexcode} \subsection{With Mik\TeX{} and Windows} As these two systems are unknown to the contributor, we refer to the documentation for integrating local additions to Mik\TeX: \begin{center} \url{http://docs.miktex.org/manual/localadditions.html} \end{center} \subsection{A \lualatex package} If you want to use this package, you must compile your document with \Verb+lualatex+: \begin{commandshell} lualatex mylatexfile.tex \end{commandshell} \subsection{Dependencies} This package is built upon two main existing packages that one used to draw the triangulations : \begin{enumerate} \item \Verb+luamplib+ to use MetaPost~\cite{luamplib} via the \luatex library \Verb+mplib+; \item \Verb+tikz+~\cite{tikz}. \end{enumerate} We will see how to choose between these two \emph{drawing engines}. Moreover, the following packages are necessary: \begin{enumerate} \item \Verb+xkeyval+ to manage the optional arguments; \item \Verb+xcolor+ to use colors (required by \Verb+luamplib+); \item \Verb+ifthen+ to help programming with \TeX. \end{enumerate} \section{The Basic Macros} This package provides macros to draw two dimensional triangulations (or meshes). \subsection{Draw a Complete Mesh}\label{sec:buildMesh} \commande|\buildMeshBW[«options»]{«list of points» or «file name»}|\medskip This macro produces the Delaunay triangulation (using the Bowyer and Watson algorithm, \cite[Bowyer]) of the given \meta{list of points}. The list of points must be given in the following way : \begin{center} \verb+(x1,y1);(x2,y2);(x3,y3);...;(xn,yn)+ \end{center} \begin{Exemple} \buildMeshBW{(0.3,0.3);(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)} \end{Exemple} \subsubsection{The Options} There are several options to customize the drawing. \begin{optionsenum} \item[mode = int (default) \textme{or} ext:] this option allows to use either the previously described set of points in the argument, or a file containing the points line by line (in 2 columns). Such a file looks like : \begin{verbatim} x1 y1 x2 y2 x3 y3 ... xn yn \end{verbatim} \item[bbox = none (default) \textme{or} show:] this option allows to draw the points added to form the \emph{bounding box}\footnote{The bounding box is defined by four points place at 15\% around the box defined by $(x_{\min},y_{\min})$, $(x_{\min},y_{\max})$, $(x_{\max},y_{\max})$, and $(x_{\min},y_{\max})$. It is used by the algorithm and will be computed in any case.} and the triangles attached. By default, these triangles are removed at the end of the algorithm. \item[color = \meta{value} (default: black):] The color of the drawing. \item[colorBbox = \meta{value} (default: black):] The color of the drawing for the elements (points and triangles) belonging to the bounding box. \item[print = none (default) \textme{or} points \textme{or} dotpoints:] The \Verb+point+ value allows to label the vertices of the triangulation. This also adds a \emph{dot} at each vertex. The \Verb+dotpoints+ value only add a dot without the labeling. \item[meshpoint = \meta{value} (default: P):] The letter(s) used to label the vertices of the triangulation. It is included in the math mode delimiters \Verb+$...$+. The bounding box points are labeled with numbers 1 to 4 and with a star exponent. \item[tikz (boolean, default:false):] By default, this boolean is set to \Verb+false+, and MetaPost (with \Verb+luamplib+) is used to draw the picture. With this option, \Verb+tikz+ becomes the \textit{drawing engine}. \item[scale = \meta{value} (default: 1cm):] The scale option defines the scale at which the picture is drawn (the same for both axes). It must contain the unit of length (cm, pt, etc.). \item[thickness = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines. It must contain the unit of length (cm, pt, etc.). \end{optionsenum} To illustrate the options, let us show you an example. We consider a file \Verb+mesh.txt+: \begin{verbatim} 0.3 0.3 1.5 1 4 0 4.5 2.5 1.81 2.14 2.5 0.5 2.8 1.5 \end{verbatim} \begin{Exemple} \buildMeshBW[% tikz, mode = ext, bbox = show, color = red, colorBbox = blue!30, print = points, meshpoint = x, scale = 1.3cm, thickness = 1pt ]{mesh.txt} \end{Exemple} \begin{warning} The drawing engine is not very relevant here, although it is useful to understand how the drawing is produced. However, the engine will be relevant to the so called \emph{inc} macros (section~\ref{sec:inc}) for adding code before and after the one generated by \luamesh. \end{warning} \subsection{Draw the Set of Points} \commande|\drawPointsMesh[«options»]{«list of points» or «file name»}|\medskip With the \Verb+\drawPointsMesh+, we plot the set of (user chosen) points from which the Bowyer and Watson algorithm computes the triangulation. The use of this macro is quite similar to \Verb+\buildMeshBW+. Here is an example of the basic uses. \begin{Exemple} \drawPointsMesh{(0.3,0.3);(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)} \end{Exemple} \subsubsection{The Options} There are several options (exactly the same as for the \Verb+\buildMeshBW+) to customize the drawing. \begin{optionsenum} \item[mode = int (default) \textme{or} ext:] this option allows to use either the previously described set of points as the argument, or a file containing the points line by line (in 2 columns). Such a file looks like : \begin{verbatim} x1 y1 x2 y2 x3 y3 ... xn yn \end{verbatim} \item[bbox = none (default) \textme{or} show:] this option allows to draw the points added to form the \emph{bounding box}\footnote{The bounding box is defined by four points place at 15\% around the box defined by $(x_{\min},y_{\min})$, $(x_{\min},y_{\max})$, $(x_{\max},y_{\max})$, and $(x_{\min},y_{\max})$. It is used by the algorithm and will be computed in any case.} and the triangles attached. By default, these triangles are removed at the end of the algorithm. \emph{Here, because we plot only the vertices of the mesh, there are no triangles, only dots.} \item[color = \meta{value} (default: black):] The color of the drawing. \item[colorBbox = \meta{value} (default: black):] The color of the drawing for the elements (points and triangles) belonging to the bounding box. \item[print = none (default) \textme{or} points:] To label the vertices of the triangulation. This also adds a \emph{dot} at each vertex. With no label, the dot remains. \item[meshpoint = \meta{value} (default: P):] The letter(s) used to label the vertices of the triangulation. This is included in the math mode delimiters \Verb+$...$+. The bounding box points are labeled with numbers 1 to 4 and with a star exponent. \item[tikz (boolean, default:false):] By default, this boolean is set to \Verb+false+, and MetaPost (with \Verb+luamplib+) is used to draw the picture. With this option, \Verb+tikz+ becomes the \textit{drawing engine}. \item[scale = \meta{value} (default: 1cm):] The scale option defines the scale at which the picture is drawn (the same for both axes). It must contain the unit of length (cm, pt, etc.). \end{optionsenum} With the same external mesh point file presented in section~\ref{sec:buildMesh}, we illustrate the different options. \begin{Exemple} \drawPointsMesh[% tikz, mode = ext, bbox = show, color = blue, colorBbox = red, print = points, meshpoint = y, scale = 1.3cm, ]{mesh.txt} \end{Exemple} \subsection{Draw a Step of the Bowyer and Watson Algorithm} \commande|\meshAddPointBW[«options»]{«list of points» or «file name»}{«point» or «number of line»}|\medskip This command allows to plot the steps within the addition of a point in a Delaunay triangulation by the Bowyer and Watson algorithm. This macro produces the Delaunay triangulation (using the Bowyer and Watson algorithm) of the given \meta{list of points} and shows a step of the algorithm when the \meta{point} is added. The list of points must be given in the following way: \begin{center} \verb+(x1,y1);(x2,y2);(x3,y3);...;(xn,yn)+ \end{center} and the point is of the form \verb+(x,y)+. The \meta{file name} and \meta{number of line} will be explained in the option description. One can use the macro as follows: \begin{Exemple} \meshAddPointBW[step=badtriangles]{(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)}{(2.2,1.8)} \meshAddPointBW[step=cavity]{(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)}{(2.2,1.8)} \meshAddPointBW[step=newtriangles]{(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)}{(2.2,1.8)} \end{Exemple} The default value for \Verb+step+ is \Verb+badtriangles+. Consequently, the first line is equivalent to \begin{latexcode} \meshAddPointBW{(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)}{(2.2,1.8)} \end{latexcode} \subsubsection{The Options} There are several options (some of them are the same as for \Verb+\buildMeshBW+) to customize the drawing. \begin{optionsenum} \item[mode = int (default) \textme{or} ext:] this option allows to use either the previously described set of points as the argument, or a file containing the points line by line (in 2 columns). Such a file looks like : \begin{verbatim} x1 y1 x2 y2 x3 y3 ... xn yn \end{verbatim} For the second argument of the macro, if we are in \Verb+mode = ext+, the argument must be the \emph{line number} of the file corresponding to the point we want to add. The algorithm will stop at the previous line to build the initial triangulation and proceed to add the point corresponding to the line requested. The subsequent lines in the file are ignored. \item[bbox = none (default) \textme{or} show:] this option allows to draw the added points that form the \emph{bounding box} and the triangles attached. Although they are always computed, by default, these triangles are removed at the end of the algorithm. \item[color = \meta{value} (default: black):] The color of the drawing. \item[colorBbox = \meta{value} (default: black):] The color of the drawing for the elements (points and triangles) belonging to the bounding box. \item[colorNew = \meta{value} (default: red):] The color of the drawing of the ``new'' elements which are the point to add, the polygon delimiting the cavity, and the new triangles. \item[colorBack = \meta{value} (default: black!20):] The color for the filling of the region concerned by the addition of the new point. \item[colorCircle = \meta{value} (default: green):] The color for the circumcircle of the triangles containing the point to add. \item[meshpoint = \meta{value} (default: P):] The letter(s) used to label the vertices of the triangulation. It is included in the math mode delimiters \Verb+$...$+. The bounding box points are labeled with numbers 1 to 4 and with a star exponent. \item[step = badtriangles (default) \textme{or} cavity \textme{or} newtriangles:] To choose the step we want to draw, corresponding to the steps of the Bowyer and Watson algorithm. \item[newpoint = \meta{value} (default: P):] The letter(s) used to label the new point of the triangulation. It is include in the math mode delimiters \Verb+$...$+. \item[tikz (boolean, default:false):] By default, this boolean is set to \Verb+false+, and MetaPost (with \Verb+luamplib+) is used to draw the picture. With this option, \Verb+tikz+ is the \textit{drawing engine}. \item[scale = \meta{value} (default: 1cm):] The scale option defines the scale at which the picture is drawn (the same for both axis). It must contain the unit of length (cm, pt, etc.). \item[thickness = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines for the mesh. It must contain the unit of length (cm, pt, etc.). \item[thicknessNew = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines for the polygon and the \emph{new} elements. It must contain the unit of length (cm, pt, etc.). \item[thicknessCircle = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines of the circles. It must contain the unit of length (cm, pt, etc.). \end{optionsenum} Here is an example of customizing the drawing. First, recall that the external file \Verb+mesh.txt+ is: \begin{verbatim} 0.3 0.3 1.5 1 4 0 4.5 2.5 1.81 2.14 2.5 0.5 2.8 1.5 \end{verbatim} We draw the addition of the 6th point. The 7th line will be ignored. \begin{Exemple} \meshAddPointBW[ tikz, mode = ext, color = blue!70, meshpoint = \alpha, newpoint = y, colorBack=red!10, colorNew = green!50!red, colorCircle = blue, colorBbox = black!20, bbox = show, scale=1.4cm, step=badtriangles, thickness=0.2pt, thicknessCircle=1pt, thicknessNew=3pt % useless because this step ] {mesh.txt}{6} \end{Exemple} \subsection{Mesh a Polygon} \commande|\meshPolygon[«options»]{«list of points» or «file name»}|\medskip With \luamesh, it is possible to mesh an object giving the \emph{border}, \emph{i.e.}, one closed polygon. The polygon is given as a list of points as above: \begin{center} \verb+(x1,y1);(x2,y2);(x3,y3);...;(xn,yn)+ \end{center} Once again we can also give a file of points using the \Verb+mode+ option. This command allows to plot the steps within the building of a complete mesh. The followed method is, given a parameter $h$: \begin{itemize} \item to build a squared grid of points with a unit distance equal to $h$; \item to keep the grid points inside the polygon; \item if necessary to add points along the polygon to respect the distance parameter; \item to mesh the complete set of points (using the Bowyer and Watson algorithm). \end{itemize} One can use the macro as follows: \begin{Exemple} \meshPolygon[step=polygon,scale=2cm]{(0,0);(1,0);(1,0.5);(0,0.5);(-0.20,0.35);(-0.25,0.25);(-0.20,0.15)} \meshPolygon[step=grid,scale=2cm]{(0,0);(1,0);(1,0.5);(0,0.5);(-0.20,0.35);(-0.25,0.25);(-0.20,0.15)} \meshPolygon[step=points,scale=2cm]{(0,0);(1,0);(1,0.5);(0,0.5);(-0.20,0.35);(-0.25,0.25);(-0.20,0.15)} \meshPolygon[step=mesh,scale=2cm]{(0,0);(1,0);(1,0.5);(0,0.5);(-0.20,0.35);(-0.25,0.25);(-0.20,0.15)} \end{Exemple} Note that if the points of the grid are too closed to the points of the refined boundary, they are ejected. \subsubsection{The Options} There are several options (some of them are the same as for \Verb+\buildMeshBW+) to customize the drawing. \begin{optionsenum} \item[mode = int (default) \textme{or} ext:] this option allows to use either the previously described set of points as the argument, or a file containing the points line by line (in 2 columns). Such a file looks like : \begin{verbatim} x1 y1 x2 y2 x3 y3 ... xn yn \end{verbatim} \item[h = \meta{value} (default: 0.2):] The mesh parameter, it is the unit distance for the grid. If necessary, the boundary is refined to get points which respect the distance constrain. \item[color = \meta{value} (default: black):] The color of the drawing (the grid point and the mesh). \item[colorPolygon = \meta{value} (default: red):] The color of the drawing for the boundary polygon. \item[print = none (default) \textme{or} points \textme{or} dotpoints:] The \Verb+point+ value allows to label the vertices of the triangulation. This also adds a \emph{dot} at each vertex. The \Verb+dotpoints+ value only add a dot without the labeling. \item[meshpoint = \meta{value} (default: P):] The letter(s) used to label the vertices of the triangulation. It is included in the math mode delimiters \Verb+$...$+. \item[step = polygon \textme{or} grid \textme{or} points \textme{or} mesh (default):] To choose the step we want to draw, see the description above. \item[tikz (boolean, default:false):] By default, this boolean is set to \Verb+false+, and MetaPost (with \Verb+luamplib+) is used to draw the picture. With this option, \Verb+tikz+ is the \textit{drawing engine}. \item[scale = \meta{value} (default: 1cm):] The scale option defines the scale at which the picture is drawn (the same for both axis). It must contain the unit of length (cm, pt, etc.). \item[gridpoints = rect (default) \textme{or} perturb:] This option allows to specify the mode of generation of the grid points. The value \Verb+rect+ produces a simple rectangular grid, and the value \Verb+pertub+ randomly perturbs the rectangular grid. \item[thickness = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines of the mesh. It must contain the unit of length (cm, pt, etc.). \item[thicknessPolygon = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines of the polygon. It must contain the unit of length (cm, pt, etc.). \end{optionsenum} Here is an example of customizing the drawing. \begin{Exemple} \meshPolygon[ tikz, color = blue!70, meshpoint = \alpha, colorPolygon=red!100, scale=4cm, step=mesh, print=points, gridpoints=perturb, thickness=0.5pt, thicknessPolygon=1pt] {(0,0);(1,0);(1,0.5);(0,0.5);(-0.20,0.35);(-0.25,0.25);(-0.20,0.15)} \end{Exemple} \section{The \emph{inc} Macros}\label{sec:inc} The three macros presented in the above sections have complementary macros, with the suffix \Verb+inc+ that allow the user to add code (MetaPost or \Verb+tikz+, depending of the drawing engine) before and after the code generated by \luamesh. These commands have the same options as the non \emph{inc} one. The three macros are:\medskip \commande|\buildMeshBWinc[«options»]{«list of points» or «file name»}{«code before»}{«code after»}|\medskip \commande|\drawPointsMeshinc[«options»]{«list of points» or «file name»}{«code before»}{«code after»}|\medskip \commande|\meshAddPointBWinc[«options»]{«list of points» or «file name»}%| \commande| {«point» or «number of line»}{«code before»}{«code after»}|\medskip \subsection{With MetaPost} We consider the case where the drawing engine is MetaPost (through the \Verb+luamplib+ package). The feature is described for the \Verb+\buildMeshBWinc+ but the mechanism and possibilities are exactly the same for all three macros. When we use the MetaPost drawing engine, the macros previously described produce a code of the form \begin{latexcode} \begin{luamplib} u:=; beginfig(0); endfig; \end{luamplib} \end{latexcode} Then, the arguments \meta{code before} and \meta{code after} are inserted as follows: \begin{latexcode} \begin{luamplib} u:=; <> <> \end{luamplib} \end{latexcode} \begin{warning} With the \emph{inc} macros, the user has to add the \Verb+beginfig();+ and \Verb+endfig;+ commands to produce a picture. Indeed, this allows to use the \Verb+\everymplib+ command from the \Verb+\luamplib+ package. \end{warning} \subsubsection{The \LaTeX{} Colors Inside the MetaPost Code}\label{sec:mpcolor} The configurable colors of the \LaTeX{} macro are accessible inside the MetaPost code. For \Verb+\buildMeshBWinc+ and \Verb+\drawPointsMeshinc+, \Verb+\luameshmpcolor+, and \Verb+\luameshmpcolorBbox+ have been defined. For the macro \Verb+\meshAddPointBWinc+ three additional colors are present: \Verb+\luameshmpcolorBack+, \Verb+\luameshmpcolorNew+, and \Verb+\luameshmpcolorCircle+. For the macro \Verb+\meshPolygon+, the color \Verb+\luameshmpcolorPoly+ is defined. Of course, MetaPost colors can be defined as well. Finally, the \Verb+luamplib+ mechanism \Verb+\mpcolor+ is also available. \subsubsection{The Mesh Points} At the beginning of the automatically generated code, a list of MetaPost \Verb+pair+s are defined corresponding to all the vertices in the mesh (when the option \Verb+bbox=show+, the last 4 points are the \emph{bounding box points}). The points are available with the \Verb+MeshPoints[]+ table of variables. The \Verb+pair+s ($\R^{2}$ points) \Verb+MeshPoints[i]+ are defined using the unit length \Verb+u+. With the \Verb+\meshPolygon+ macro, we have the points of the polygon (refined) that are available with the \Verb+polygon[]+ table of variables. \subsubsection{Examples} Here is three examples for the different macros. \begin{Exemple} \drawPointsMeshinc[ color = blue!50, print = points, meshpoint = x, scale=0.8cm, ]{(0.3,0.3);(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)}% {% code before beginfig(0); }% {% code after label(btex Mesh $\mathbb{T}$ etex, (0,2u)) withcolor \luameshmpcolor; endfig; } \buildMeshBWinc[% bbox = show, color = red, colorBbox = blue!30, print = points, meshpoint = x, scale=0.8cm, thickness = 1.4pt ]{(0.3,0.3);(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)}% {% code before beginfig(0); } {% code after drawdblarrow MeshPoints[3] -- MeshPoints[9] withpen pencircle scaled 1pt withcolor (0.3,0.7,0.2); endfig; } \meshAddPointBWinc[ meshpoint = \alpha, newpoint = y, colorBack=red!10, colorNew = green!50!red, colorCircle = blue, colorBbox = black!20, bbox = show, scale=0.8cm, step=badtriangles] {(0.3,0.3);(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5)}{(2.8,1.5)}% {%code before picture drawing; drawing := image( }{%code after ); beginfig(0); fill MeshPoints[7]--MeshPoints[8]--MeshPoints[9]--MeshPoints[10]--cycle withcolor \mpcolor{blue!10}; draw drawing; endfig; } \end{Exemple} \begin{warning} The variables \Verb+MeshPoints[]+ are not defined for the argument corresponding to the code placed \textbf{before} the code generated by \luamesh. Hence, to use such variables, we have to define a \Verb+picture+ as shown in the third example above. \end{warning} \subsection{With TikZ} If we have chosen \Verb+tikz+ as the drawing engine, the added code will be written in \Verb+tikz+. In that case, the two arguments \meta{code before} and \meta{code after} will be inserted as follows: \begin{latexcode} \noindent \begin{tikzpicture}[x=,y=] <> <> \end{tikzpicture} \end{latexcode} Because the engine is \Verb+tikz+ their is no issue with colors, the \LaTeX{} colors (e.g.: \Verb+xcolor+) can be used directly. \subsubsection{The Mesh Points} The mesh points are defined here as \Verb+tikz+ \Verb+\coordinate+ and named as follows \begin{latexcode} \coordinate (MeshPoints1) at (...,...); \coordinate (MeshPoints2) at (...,...); \coordinate (MeshPoints3) at (...,...); %etc. \end{latexcode} With the \Verb+\meshPolygon+ we have also the polygon points coordinates: \begin{latexcode} \coordinate (polygon1) at (...,...); %etc. \end{latexcode} Once again these coordinates are not yet defined to be used in the code given by \meta{code before} argument. \subsubsection{Examples} \begin{Exemple} \drawPointsMeshinc[ tikz, color = blue!50, print = points, meshpoint = x, scale=0.8cm, ]{(0.3,0.3);(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)}% {% code before }% {% code after \node[color = blue!50] at (0,2) {Mesh $\mathbb{T}$} ; } \buildMeshBWinc[% tikz, bbox = show, color = red, colorBbox = blue!30, print = points, meshpoint = x, scale=0.8cm, thickness=1pt ]{(0.3,0.3);(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5)}% {% code before } {% code after \draw[<->,thick, color=green] (MeshPoints3) -- (MeshPoints9); } \end{Exemple} \section{Voronoï Diagrams} Another interesting feature of the Delaunay triangulation is that its \emph{dual} is the so-called Voronoï diagram. More precisely, for a finite set of points $\{p_{1},\ldots, p_{n}\}$ in the Euclidean plane, the Voronoï cell $R_{k}$ corresponding to $p_{k}$ is the set of all points in the Euclidean plane $\R^{2}$ whose distance to $p_{k}$ is less than or equal to its distance to any other $p_{k'}$.\bigskip \commande|\buildVoronoiBW[«options»]{«list of points» or «file name»}|\medskip This macro produce the Voronoï diagram of the given \meta{list of points}. Once again, the list of points must be given in the following way : \begin{center} \verb+(x1,y1);(x2,y2);(x3,y3);...;(xn,yn)+ \end{center} \begin{Exemple} \buildVoronoiBW{(0.3,0.3);(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5);(0.1,2);(1.5,-0.3)} \end{Exemple} \subsection{The Options}\label{sec:voronoiOptions} There are several options to customize the drawing. \begin{optionsenum} \item[mode = int (default) \textme{or} ext:] this option allows to use either the previously described set of points in the argument, or a file containing the points line by line (in 2 columns). Such a file looks like : \begin{verbatim} x1 y1 x2 y2 x3 y3 ... xn yn \end{verbatim} \item[bbox = none (default) \textme{or} show:] this option allows to draw the added points to form a \emph{bounding box}\footnote{The bounding box is defined by four points place at 15\% around the box defined by $(x_{\min},y_{\min})$, $(x_{\min},y_{\max})$, $(x_{\max},y_{\max})$, and $(x_{\min},y_{\max})$. It is used by the algorithm and will be computed in any case.} and the corresponding triangulation. By default, these points are removed at the end of the algorithm. \item[color = \meta{value} (default: black):] The color of the drawing of the Delaunay mesh. \item[colorBbox = \meta{value} (default: black):] The color of the drawing for the elements (points and triangles) belonging to the bounding box. \item[colorVoronoi = \meta{value} (default: red):] The color of the drawing for the elements (points and polygons) belonging to the Voronoï diagram. \item[print = none (default) \textme{or} points:] To label the vertices in the triangulation. Contrary to the previous macros, where \Verb+print=none+, a \emph{dot} is produced at each vertex of the set of points and at the circumcircle centers which are the nodes of the Voronoï diagram. \item[meshpoint = \meta{value} (default: P):] The letter(s) used to label the vertices of the triangulation. This is included in the math mode delimiters \Verb+$...$+. The bounding box points are labelled with numbers 1 to 4 and with a star exponent. \item[circumpoint = \meta{value} (default: P):] The letter(s) used to label the vertices of the Voronoï diagram. This is included in the math mode delimiters \Verb+$...$+. \item[tikz (boolean, default:false):] By default, this boolean is set to \Verb+false+, and MetaPost (with \Verb+luamplib+) is used to draw the picture. With this option, \Verb+tikz+ becomes the \textit{drawing engine}. \item[scale = \meta{value} (default: 1cm):] The scale option defines the scale at which the picture is drawn (the same for both axes). It must contain the unit of length (cm, pt, etc.). \item[delaunay = none (default) \textme{or} show:] This option allows to draw the Delaunay triangulation under the Voronoï diagram. \item[styleDelaunay = none (default) \textme{or} dashed:] This option allows to draw the Delaunay triangulation in dashed lines. \item[styleVoronoi = none (default) \textme{or} dashed:] This option allows to draw the Voronoï edges in dashed lines. \item[thickness = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines of the mesh (if plotted). It must contain the unit of length (cm, pt, etc.). \item[thicknessVoronoi = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines of the Voronoï diagram. It must contain the unit of length (cm, pt, etc.). \end{optionsenum} \begin{Exemple} \buildVoronoiBW[tikz, delaunay=show, styleDelaunay=dashed, thickness = 1pt, thicknessVoronoi=2pt] {(0.3,0.3);(1.5,1);(4,0);(4.5,2.5);(1.81,2.14);(2.5,0.5);(2.8,1.5);(0.1,2);(1.5,-0.3)} \end{Exemple} \subsection{The \emph{inc} variant} Once again, a variant of the macros is available allowing the user to add code before and after the code produced by \luamesh (with the same options as the non \emph{inc} command). We refer to section~\ref{sec:inc} because it works the same way. Let us note that: \begin{itemize} \item with MetaPost, the circumcenters are defined using \Verb+pair CircumPoints[];+ and so they are accessible. \item With \Verb+tikz+, there are new coordinates defined as follows \begin{latexcode} \coordinate (CircumPoints1) at (...,...); \coordinate (CircumPoints2) at (...,...); \coordinate (CircumPoints3) at (...,...); % etc. \end{latexcode} \end{itemize} Finally, when the MetaPost drawing engine is used another color is available (see~\ref{sec:mpcolor}): \Verb+\luameshmpcolorVoronoi+. \section{With Gmsh} Gmsh~\cite{gmsh} is an open source efficient software that produces meshes. The exporting format is the \emph{MSH ASCII file format} and can be easily read by a Lua program. \luamesh provides the user with dedicated macros to read and draw meshes coming from a Gmsh exportation.\bigskip \commande|\drawGmsh[«options»]{«file name»}|\medskip This macro draws the triangulation produced by Gmsh and exported in the \Verb+msh+ format. The argument is the name of the file to be read (e.g.: \Verb+maillage.msh+). Since the version 0.6, \luamesh support both version 2 and 4 of the \emph{MSH ASCII file format}. \begin{Exemple} \drawGmsh{maillage.msh} % version 2.2 of MSH ASCII file format \end{Exemple} \begin{Exemple} \drawGmsh{maillagev4.msh} % version 4.1 of MSH ASCII file format \end{Exemple} There are several options to customize the drawing. \begin{optionsenum} \item[color = \meta{value} (default: black):] The color of the drawing. \item[print = none (default) \textme{or} points:] To label the vertices of the triangulation. Contrary to some previous macros, when \Verb+print=none+ a \emph{dot} is produced at each vertex of the set of points and at the circumcircle centers (these are the nodes of the Voronoï diagram). \item[meshpoint = \meta{value} (default: P):] The letter(s) used to label the vertices of the triangulation. This is included in the math mode delimiters \Verb+$...$+. The bounding box points are labeled with numbers 1 to 4 and with a star exponent. \item[tikz (boolean, default:false):] By default, this boolean is set to \Verb+false+, and MetaPost (with \Verb+luamplib+) is used to draw the picture. With this option, \Verb+tikz+ becomes the \textit{drawing engine}. \item[scale = \meta{value} (default: 1cm):] The scale option defines the scale at which the picture is drawn (the same for both axes). It must contain the unit of length (cm, pt, etc.). \item[thickness = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines of the mesh. It must contain the unit of length (cm, pt, etc.). \end{optionsenum} Here is an example: \begin{Exemple} \drawGmsh[scale=2cm,print=points, color=blue!30,thickness=0.8pt]{maillage.msh} \end{Exemple} \subsection{Gmsh and Voronoï Diagrams} Because Gmsh generates Delaunay triangulations, we can plot the associated Voronoï diagram. This is done by the following macro:\bigskip \commande|\gmshVoronoi[«options»]{«file name»}|\medskip \begin{Exemple} \gmshVoronoi{maillage.msh} \end{Exemple} \subsection{The Options}\label{sec:voronoiOptions} There are several options to customize the drawing. \begin{optionsenum} \item[color = \meta{value} (default: black):] The color of the drawing of the Delaunay mesh. \item[colorVoronoi = \meta{value} (default: red):] The color of the drawing for the elements (points and polygons) belonging to the Voronoï diagram. \item[print = none (default) \textme{or} points:] To label the vertices of the triangulation. Contrary to some previous macros, when \Verb+print=none+, a \emph{dot} is produced at each vertex of the set of points and at the circumcircle centers (these are the nodes of the Voronoï diagram). \item[meshpoint = \meta{value} (default: P):] The letter(s) used to label the vertices of the triangulation. It is included in the math mode delimiters \Verb+$...$+. The bounding box points are labeled with numbers 1 to 4 and with a star exponent. \item[circumpoint = \meta{value} (default: P):] The letter(s) used to label the vertices of the Voronoï diagram. This is included in the math mode delimiters \Verb+$...$+. \item[tikz (boolean, default:false):] By default, this boolean is set to \Verb+false+, and MetaPost (with \Verb+luamplib+) is used to draw the picture. With this option, \Verb+tikz+ becomes the \textit{drawing engine}. \item[scale = \meta{value} (default: 1cm):] The scale option defines the scale at which the picture is drawn (the same for both axes). It must contain the unit of length (cm, pt, etc.). \item[delaunay = none (default) \textme{or} show] This option allows to draw the Delaunay triangulation overlapped with the Voronoï diagram. \item[styleDelaunay = none (default) \textme{or} dashed] This option allows to draw the Delaunay triangulation in dashed lines. \item[styleVoronoi = none (default) \textme{or} dashed] This option allows to draw the Voronoï edges in dashed lines. \item[thickness = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines of the mesh (if plotted). It must contain the unit of length (cm, pt, etc.). \item[thicknessVoronoi = \meta{value} (default: 0.4pt):] The thickness option defines the thickness of the lines of the Voronoï diagram. It must contain the unit of length (cm, pt, etc.). \end{optionsenum} \begin{Exemple} \gmshVoronoi[tikz, scale=4cm, delaunay=show, styleVoronoi=dashed, thickness=0.4pt, thicknessVoronoi=2pt ]{maillagev4.msh} \end{Exemple} \subsection{The \emph{inc} variants} Once again, there exist \emph{inc} variant macros (with the same options):\bigskip \commande|\drawGmshinc[«options»]{«file name»}{«code before»}{«code after»}|\medskip \commande|\gmshVoronoiinc[«options»]{«file name»}{«code before»}{«code after»}|\medskip We refer to the previous sections for explanations. \section{\texttt{mplibcode} environments} All the \Verb+mplibcode+ environments produced by this package use instance mechanism provided by the \Verb+luamplib+ package~\cite{luamplib}. The name of the instance is \verb+luamesh+. \subsection{A MetaPost package} This package comes with a \Verb+luamesh.mp+ file. This file provide for the moment only one macro to draw circumscribed circles of three points. All of the \Verb+luamesh+ instances of \Verb+mplibcode+ environments include the MetaPost \Verb+luamesh.mp+ package. \bigskip \commande|circumcircle(«pair1»,«pair2»,«pair3»)|\medskip This macro returns a \Verb+path+: the circumscribed circle passing by the three argument \Verb+pair+s.\footnote{For the tikz users, we refer to \texttt{tkz-euclide}~\cite{tkzeuclide} package that provides a large number of tools including on to draw circumscribed circles.} \begin{Exemple} \buildVoronoiBWinc{(0, 0);(6,0);(2,4);(1.5,2);(2.,0.5);(3,2.6);(3.5,1);(5,3.);(0.3,3.2)}{beginfig(0);}{draw circumcircle(MeshPoints1,MeshPoints2,MeshPoints3);endfig;} \end{Exemple} \section{Gallery} \subsection{With Animate} If you use \emph{Adobe Acrobat reader} or \emph{Okular}, you can easily produce an animation of the Bowyer and Watson algorithm with the package \Verb+animate+~\cite{animate}. For example, the following code (in a file name \Verb+animation.tex+): \begin{latexcode} \documentclass{article} %% lualatex compilation \usepackage[margin=2.5cm]{geometry} \usepackage{luamesh} \usepackage{fontspec} \usepackage{multido} \pagestyle{empty} \def\drawPath{draw (-2,-2)*u--(8,-2)*u--(8,6)*u--(-2,6)*u--cycle withcolor 0.99white;} \def\clipPath{clip currentpicture to (-2,-2)*u--(8,-2)*u--(8,6)*u--(-2,6)*u--cycle;} \begin{document} \drawPointsMeshinc[mode=ext, bbox = show,colorBbox = blue!20,print=points]{mesh.txt}% {% beginfig(0); \drawPath }% {% \clipPath endfig; } \newpage\buildMeshBWinc[mode=ext,bbox = show,colorBbox = blue!20,print=points]{meshInit.txt}% {% beginfig(0); \drawPath }% {% \clipPath endfig; } \multido{\ii=5+1}{4}{% \newpage\meshAddPointBWinc[mode=ext,step=badtriangles,colorNew =green!20!red,colorBack=red!10,colorCircle = blue,bbox = show,colorBbox = blue!20]{mesh.txt}{\ii}% {% beginfig(0); \drawPath }% {% \clipPath endfig; } \newpage \meshAddPointBWinc[mode=ext,step=cavity,colorNew =green!20!red,colorBack=red!10,colorCircle = blue,bbox = show,colorBbox = blue!20]{mesh.txt}{\ii}% {% beginfig(0); \drawPath }% {% \clipPath endfig; } \newpage \meshAddPointBWinc[mode=ext,step=newtriangles,colorNew =green!20!red,colorBack=red!10,colorCircle = blue,bbox = show,colorBbox = blue!20]{mesh.txt}{\ii}% {% beginfig(0); \drawPath }% {% \clipPath endfig; } } \newpage \buildMeshBWinc[mode=ext,bbox = show,colorBbox = blue!20,print=points]{mesh.txt}% {% beginfig(0); \drawPath }% {% \clipPath endfig; } \newpage \buildMeshBWinc[mode=ext,print=points]{mesh.txt}% {% beginfig(0); \drawPath }% {% \clipPath endfig; } \end{document} \end{latexcode} produces a PDF with multiple pages. Using the \Verb+pdfcrop+ program, we crop the pages to the material, and then we can animate the PDF using the \Verb+animate+ package. %\begin{Exemple} %\animategraphics[controls]{1}{animation-crop}{}{} %\end{Exemple} \section{History} \begin{itemize} \item July, 2022, v~0.7, adding of thickness options, creation of the MetaPost package, and improvement of the documentation. \item June, 6th, 2020, v 0.6, correction of bug produced by the deleted \Verb+\mplibcolor+ function of \Verb+luamplib+ package. \item June, 6th, 2020, v 0.6, add support of version 4 of the \emph{MSH ASCII file format}. \end{itemize} \printbibliography \end{document} %%% Local Variables: %%% flyspell-mode: 1 %%% ispell-local-dictionary: "american" %%% End: