现在我已经看到了如何使用 PGF/TikZ 创建一个由点组成的方形 3x3 网格,并在这些点之间绘制一个多边形,我想创建一个这样的网格,如下所示:
如何使用 PDF/TikZ 生成它?我希望每个多边形都在相对坐标系中指定,以便我可以轻松更改多边形的顺序。
答案1
在这种情况下,您可以为网格创建一个宏,然后使用scope
s 来更改坐标系。或者,如果网格之间的距离与点之间的距离相同,您可以创建一个比scope
s 更大的网格。
例如,对于多个网格:
\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
设置该键是为了可以在名称空间中使用多个键,而不必每次都为其添加前缀。
另外几个键,即dos
,dos*
和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,您可以全局设置这些设置,或者使用其他宏或样式来执行其中一些操作(我在\matrix
with中使用\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}