如何绘制多边形网格?

如何绘制多边形网格?

现在我已经看到了如何使用 PGF/TikZ 创建一个由点组成的方形 3x3 网格,并在这些点之间绘制一个多边形,我想创建一个这样的网格,如下所示:

网格中的网格

如何使用 PDF/TikZ 生成它?我希望每个多边形都在相对坐标系中指定,以便我可以轻松更改多边形的顺序。

答案1

在这种情况下,您可以为网格创建一个宏,然后使用scopes 来更改坐标系。或者,如果网格之间的距离与点之间的距离相同,您可以创建一个比scopes 更大的网格。

例如,对于多个网格:

\documentclass[tikz,border=2mm]{standalone}

% grid
\newcommand{\mygrid}
{
  \foreach\i in {0,...,2} \foreach\j in {0,...,2}
    \fill (\i,\j) circle (1pt);
}

\begin{document}
\begin{tikzpicture}
[% options
   line join=round,
   %scale=1.5
]
% first polygon
\begin{scope}
  \draw[thick,blue] (0,0) -- (2,2) |- cycle;
  \mygrid
\end{scope}
% second polygon
\begin{scope}[shift={(3,0)}]  % <-- this changes the coordinate system
  \draw[thick,blue] (0,0) -- (1,1) -- (1,2) -- (2,1) |- cycle;
  \mygrid
\end{scope}
% third polygon
\begin{scope}[shift={(6,0)}]  % <-- this changes the coordinate system
  \draw[thick,blue] (0,0) -- (1,1) -- (0,2) -- (2,1) |- cycle;
  \mygrid
\end{scope}
% fourth polygon
\begin{scope}[shift={(0,-3)}] % <-- this changes the coordinate system
  \draw[thick,blue] (0,0) -- (1,1) -- (0,2) -- (1,2) -- (2,0) -- cycle;
  \mygrid
\end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

我喜欢精心设计的解决方案。

这包括

  • 自定义 TikZ 坐标系 ( dot grid cs: <num>),它接受其参数并将其转换为

    ( mod(<num>-1,<grid width>), int((<num>-1)/<grid height>) )
    

    这意味着,对于 3×3 网格,数字 1、...、9 对应于像计算器上的数字一样排列的九个点

    7 8 9
    4 5 6
    1 2 3
    

    或电话

    1 2 3
    4 5 6
    7 8 9
    

    如果轴反转。

    对于大于 3×3 的尺寸,这些数字有点不舒服,但我们可以调整,dot grid cs以便它<x>/<y>(<x>, <y>)往常一样解释,这样我们也可以通过它们来指定多边形上的点X值。(由于需要保护以免受到解析器的/攻击,因此更倾向于使用。),,.list

  • 网格 ( dots) 的设置方式是,点实际上是长度为零的线段,但通过 变成点line cap=round(这可能取决于查看者)。样式grid决定了网格的输出(线宽将是点的直径)。样式x vec dash确保虚线图案使用当前X向量。

    这可以通过以下方式改变

    • 改变grid样式(换成不同的颜色)或
    • 更改diameter默认使用的线宽值。

    如果这会带来麻烦,您可以将该dots样式替换为使用圆形节点的注释样式。

  • do实际使用坐标系绘制多边形的关键dot grid。绘制并关闭多边形后,dots调用将网格置于多边形顶部,就像在其他答案中一样。

我已将所有键放在polygon dot grid名称空间中,这样它就不会与任何原始 TikZ 键冲突。polygon dot grid设置该键是为了可以在名称空间中使用多个键,而不必每次都为其添加前缀。


另外几个键,即dosdos*Dos使用Dos*语法允许多个多边形{{poly 1}, {poly 2}, …, {poly n}}

带星号的版本绘制封闭多边形。大写D表示该版本还绘制点,但dots无论如何,这些点始终可以通过键获得。如果您想在同一个网格中使用开放和封闭多边形,您需要使用dos和,dos*其中最后一个实例可以是大写版本(这样点只绘制一次)。


我还添加了和几个s 的grid poly快捷方式。do*grid poly size

然后就只剩下

\tikz\draw[polygon dot grid={do*={2,4,8,6}, dots}];
\tikz[grid poly size=normal]\draw[red,            grid poly={2,4,8,6}];
\tikz[grid poly size=small] \draw[blue,           grid poly={2,4,8,6}];
\tikz[grid poly size=tiny]  \draw[green!50!black, grid poly={2,4,8,6}];
\tikz \draw[polygon dot grid={do*={4,5,7}, Dos={{1,2},{8,9}}}];
\tikz \draw[green, polygon dot grid/dos*={{1,2,4}, {5,6,8}}]
    {[
      scale=.5,
      polygon dot grid={size=5x5, do={21,12,8,5}}
    ]} [polygon dot grid/dots=red];

这将吸引

在此处输入图片描述在此处输入图片描述在此处输入图片描述在此处输入图片描述在此处输入图片描述在此处输入图片描述


与往常一样,使用 TikZ/PGFkeys,您可以全局设置这些设置,或者使用其他宏或样式来执行其中一些操作(我在\matrixwith中使用\tikzGridPoly)。


由于想要绘制多个这样的网格,我们可以使用,\matrix它允许我们将单独的图形以表格状对齐。

由于我不喜欢重复,我设置了单元格 (→ polygon dot grid/matrix),以便它们\tikzGridPoly默认使用。这意味着,单元格的内容需要是多边形上的点 (复数!) 列表{}- 或者{\onlyGrid}作为特殊情况仅绘制网格。

我们execute at empty cell=\tikzGridPoly{\onlyGrid}还可以使空单元格具有网格,但也许您实际上也想在网格之间插入空白处。

代码

\documentclass[tikz]{standalone}

\tikzset{
  polygon dot grid/.code=\pgfqkeys{/tikz/polygon dot grid}{#1},
  polygon dot grid={
    x dots/.initial=3, y dots/.initial=3, diameter/.initial=+3pt,
    polygon/.style = blue, % default style for \tikzGridPoly
    dots/.default=,
    grid/.style={
      black, line width=\pgfkeysvalueof{/tikz/polygon dot grid/diameter}}},
  polygon dot grid/dimension/.style args={#1x#2}{/tikz/x={#1}, /tikz/y={#2}},
  polygon dot grid/size/.style args={#1x#2}{
      /tikz/polygon dot grid/x dots={#1}, /tikz/polygon dot grid/y dots={#2}},
  polygon dot grid/dots/.style={
    /tikz/insert path={(0,0) edge[x vec dash,
      to path={grid (\tikztotarget)}, polygon dot grid/grid, #1]
        (\pgfkeysvalueof{/tikz/polygon dot grid/x dots}-1,%
         \pgfkeysvalueof{/tikz/polygon dot grid/y dots}-1)}},
%  polygon dot grid/dots/.style={/tikz/insert path={foreach[parse=true]\i in {
%       1,...,\pgfkeysvalueof{/tikz/polygon dot grid/x dots}
%            *\pgfkeysvalueof{/tikz/polygon dot grid/y dots}} {
%    node[at=(dot grid cs:\i), polygon dot grid/grid, shape=circle,
%      inner sep=+0pt, draw=none, fill, node contents=,
%      minimum size=\pgfkeysvalueof{/tikz/polygon dot grid/diameter}, #1]}}},
  polygon dot grid/do/.style args={#1,#2}{
    /tikz/insert path={(dot grid cs:#1)},      % start polygon
    /tikz/polygon dot grid/lineto/.list={#2}}, % lines to other points,
  polygon dot grid/do*/.style={
    /tikz/polygon dot grid/do={#1}, % normal polygon
    /tikz/insert path={--cycle}},   % but closed
  %% dos  = multiple        polygons
  %% dos* = multiple closed polygons
  %% Dos  = multiple        polygons with dots on top
  %% Dos* = multiple closed polygons with dots on top
  polygon dot grid/dos/.style ={/tikz/polygon dot grid/do/.list={#1}},
  polygon dot grid/dos*/.style={/tikz/polygon dot grid/do*/.list={#1}},
  polygon dot grid/Dos/.style ={/tikz/polygon dot grid={dos={#1},  dots}},
  polygon dot grid/Dos*/.style={/tikz/polygon dot grid={dos*={#1}, dots}},
  polygon dot grid/lineto/.style={/tikz/insert path={--(dot grid cs:#1)}},
  polygon dot grid/matrix/.style={
    /tikz/execute at begin cell=\tikzGridPoly,
    /utils/exec=\def\onlyGrid{\onlyGrid}%
     \def\tikzGridPoly##1{%
        \ifx\onlyGrid##1\path[polygon dot grid/dots];
        \else\draw[polygon dot grid/polygon, polygon dot grid={do*={##1},dots}];\fi}},
}
\tikzdeclarecoordinatesystem{dot grid}{%
  \pgfpointxy{mod(#1-1,\pgfkeysvalueof{/tikz/polygon dot grid/x dots})}
             {int((#1-1)/(\pgfkeysvalueof{/tikz/polygon dot grid/y dots}))}}
\makeatletter
\tikzset{x vec dash/.style={dash pattern={on 0pt off veclen(\pgf@xx,\pgf@xy)},
                                             line cap=round, ystep=0, xstep=1}}
\makeatother

\tikzset{
  grid poly/.style={polygon dot grid/do*={#1}, polygon dot grid/dots},
  grid poly size/.is choice,
  grid poly size/normal/.style={
    very thick, polygon dot grid={dimension=1cmx1cm, diameter=+3pt}},
  grid poly size/small/.style={
    thin,       polygon dot grid={dimension=7.5mmx7.5mm, diameter=+2pt}},
  grid poly size/tiny/.style={
    thin,       polygon dot grid={dimension=5mmx5mm, diameter=+1.3333pt}},
}
\begin{document}
\tikz\matrix[row sep=5mm, column sep=5mm,
    polygon dot grid={matrix, diameter=1.333pt, dimension=4mm x 4mm}]{
  {1,3,9}       & {1,3,6,8,5}   & {1,3,6,7,5}   & {1,3,6,5,8} & {1,3,6,4}     \\
  {1,3,8,7,5}   & {1,3,8,4,5}   & {1,3,8}                                     \\
  {1,6,9,8,4,5} & {1,6,9,8}     & {1,6,9,8,5,4} & {1,6,9,4}   & {1,6,9,5,8,4} \\
  {1,6,8,7,4,5} & {1,6,8,7,5,4} & {1,6,8,4}     &             & {\onlyGrid}   \\
};

\tikz\draw[polygon dot grid={do*={2,4,8,6}, dots}];
\tikz[grid poly size=normal]\draw[red,            grid poly={2,4,8,6}];
\tikz[grid poly size=small] \draw[blue,           grid poly={2,4,8,6}];
\tikz[grid poly size=tiny]  \draw[green!50!black, grid poly={2,4,8,6}];
\tikz \draw[polygon dot grid={do*={4,5,7}, Dos={{1,2},{8,9}}}];
\tikz \draw[green, polygon dot grid/dos*={{1,2,4}, {5,6,8}}]
    {[ % This is nasty.
      scale=.5,
      polygon dot grid={size=5x5, do={21,12,8,5}}
    ]} [polygon dot grid/dots=red];
\end{document}

输出

在此处输入图片描述

答案3

以你上一个问题为参考,这里有一种方法可以绘制相同的多边形,但使用相对坐标。只有第一个坐标是绝对的(这里(0,0)):

图形网格多边形

\documentclass[tikz,border=3.14mm]{standalone}

\begin{document}
    \begin{tikzpicture}
        \draw[thick,blue] (0,0) --++ (1,0) --++ (1,1) --++ (0,1) --++ (-1,0) --++ (0,-1) --++ (-1,-1) -- cycle;
        % grid
        \foreach\i in {0,...,2} \foreach\j in {0,...,2}
            \fill (\i,\j) circle (1pt);
    \end{tikzpicture}
\end{document}

答案4

我建议将每个特定的多边形绘制在一个内pic。这样,matrix只需使用图片名称就可以轻松构建一个图片集。

正确的距离有助于column sep获得row sep连续的网格。

在图书馆的帮助下tikz.transformations.mirror(来自tikz-ext包)可以轻松地转换多边形,而不必定义新的多边形。

\documentclass[border=2mm,tikz]{standalone}

\usetikzlibrary{ext.transformations.mirror}

\newcommand{\grid}{\foreach \i in {0,1,2} \foreach \j in {0,1,2}
            \fill (\i,\j) circle (1pt);}
            
\tikzset{
    line join=round,
    polygon/.style={thick, blue},
    empty/.pic={
        \grid
    },
   one/.pic={
        \grid
        \draw[polygon] (0,0)--(2,2)|-cycle;
    },
   two/.pic={
        \grid
        \draw[polygon] (0,0)-|(2,1)--(1,2)--(1,1)--cycle;
    },
   three/.pic={
        \grid
        \draw[polygon] (0,0)-|(2,1)--(0,2)--(1,1)--cycle;
    },
   four/.pic={
        \grid
        \draw[polygon] (0,0)-|(2,1)-|(1,2)--cycle;
    },
   five/.pic={
        \grid
        \draw[polygon] (0,0) rectangle ++(2,1);
    },
   six/.pic={
        \grid
        \draw[polygon] (0,0)--(2,0)--(1,2)--(0,2)--(1,1)--cycle;
    },
   seven/.pic={
        \grid
        \draw[polygon] (0,0)--(2,0)--(1,2)--(0,1)--(1,1)--cycle;
    },
   eight/.pic={
        \grid
        \draw[polygon] (0,0)--(2,0)--(1,2)--cycle;
    },
   nine/.pic={
        \grid
        \draw[polygon] (0,0)--(1,0)--(2,1)|-(1,2)--(1,1)--cycle;
    },
   ten/.pic={
        \grid
        \draw[polygon] (0,0)--(1,0)--(2,1)--(2,2)--(1,1)--(1,2)--cycle;
    },
}

\begin{document}

\begin{tikzpicture}
  \matrix [column sep={3cm,between origins}, row sep={3cm,between origins}] {
      \pic{one}; & \pic{two}; & \pic{three}; & \pic{four}; & \pic{empty};\\
      \pic{five}; & \pic{six}; & \pic{seven}; & \pic{eight}; & \pic{nine}; \\
      \pic{ten}; & \pic[xmirror={(1,1)}]{ten}; & 
      \pic[ymirror={(1,1)}]{ten}; &
      \pic[xmirror={(1,1)}, ymirror={(1,1)}]{ten}; &
      \pic[mirror={(0,2)--(2,0)}]{ten}; \\
    };
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容