在 tikz 中绘制棋盘的最佳方法是什么?我对在棋盘上绘制许多圆形棋子的最佳方法感兴趣。(棋盘背景并不重要)
答案1
我建议使用matrix of nodes
来自 tikz 矩阵库的。
一个小例子,使用在其他主题:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\tikzstyle{ball} = [circle, shading=ball,
ball color=black!80!white, minimum size=1cm]
\begin{tikzpicture}
\matrix (m) [matrix of nodes,nodes=ball] {
{} & & {} & & {} & & {} & \\
& {} & & {} & & {} & & {} \\
{} & & {} & & {} & & {} & \\};
\end{tikzpicture}
\end{document}
输出:
答案2
Caramdir 的方法的难点在于也规则,因此很难在实际游戏中显示棋盘的布局。Stefan 的方法在这方面做得更好,但没有网格。但是,网格非常规则,因此 Caramdir 的方法可以适应这种情况。
以下是我的版本,是两者的融合。首先,结果如下:
需要注意的事项:
- 毕竟,这些都是跳棋棋子!
- 使用矩阵间距中的“原点之间”选项意味着棋盘格(又名节点)非常精确地放置在方格上。
- 正如 Stefan 的回答一样,将棋子实际放置在方格上的语法非常直观。
- 剩下的只是用于改变碎片颜色的简单语法!
\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{matrix,shapes.geometric}
\begin{document}
\tikzstyle{checker} = [cylinder, minimum width=.8cm,
shape border rotate=90,cylinder end fill=gray!50!white,
cylinder body fill=gray, cylinder uses custom fill]
\begin{tikzpicture}
\draw[ultra thick] (0,0) rectangle (8,-8);
\foreach \row in {0,1, ..., 7} {
\foreach \column in {0, ..., 3} {
\fill ({2*\column + mod(\row,2)}, -\row) rectangle +(1,-1);
}
}
\matrix (m) at (0,0) [matrix of nodes,nodes=checker,
anchor=north west,column sep={1cm,between origins},
row sep={1cm,between origins}] {
{} & {} & {} & & {} & & {} & \\
& & & {} & {} & {} & & {} \\
& {} & {} & & & & {} & \\
& {} & & {} & & {} & & {} \\
{} & & & {} & {} & & {} & \\
& {} & & {} & & {} & & {} \\
& & {} & & & & {} & \\
& & & {} & {} & {} & & {} \\
};
\end{tikzpicture}
\end{document}
更新2012-03-09:由于这篇文章刚刚回到头版,我决定看看能否修复颜色和“国王”。感谢 Ryan Reich 的跟踪-pgfkeys包,我找到了一种设置颜色和尺寸的方法。
这是新代码;我稍微整理了一下原来的代码,并添加了颜色检查。其中比较复杂的部分(Ryan 的代码非常有用)是弄清楚如何根据可能设置的任何环境颜色来设置颜色。
\documentclass{article}
%\url{https://tex.stackexchange.com/a/1911/86}
\usepackage{tikz}
%\usepackage{trace-pgfkeys}
\usetikzlibrary{matrix,shapes.geometric}
\makeatletter
\colorlet{checkertint}{gray!70!white}
\tikzset{
checker/.style={
draw,
cylinder,
minimum width=.8cm,
shape border rotate=90,
set checker colour=#1,
cylinder uses custom fill,
},
king/.style={
minimum height=.8cm,
},
checker default colour/.initial=gray!50!white,
set checker colour/.code={%
\tikz@addoption{%
\def\ch@color{#1}%
\def\@tempa{\pgfkeysnovalue}%
\ifx\ch@color\@tempa
\ifx\tikz@fillcolor\pgfutil@empty
\ifx\tikz@strokecolor\pgfutil@empty
\ifx\tikz@textcolor\pgfutil@empty
\pgfkeysgetvalue{/tikz/checker default colour}{\ch@color}%
\else
\let\ch@color\tikz@textcolor
\fi
\else
\let\ch@color\tikz@strokecolor
\fi
\else
\let\ch@color\tikz@fillcolor
\fi
\fi
\pgfsetstrokecolor{\ch@color!50!checkertint}%
\pgfkeys{
/tikz/cylinder end fill=\ch@color!80!checkertint,
/tikz/cylinder body fill=\ch@color!50!checkertint
}
}
}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\draw[ultra thick] (0,0) rectangle (8,-8);
\foreach \row in {0,1, ..., 7} {
\foreach \column in {0, ..., 3} {
\fill ({2*\column + mod(\row,2)}, -\row) rectangle +(1,-1);
}
}
\matrix (m) at (0,0) [
matrix of nodes,
checker default colour=white,
nodes=checker,
anchor=north west,
column sep={1cm,between origins},
row sep={1cm,between origins}
] {
|[black]| {} & {} & {} & & {} & & {} & \\
& & & {} & {} & {} & & {} \\
&|[black,king]| {} & {} & & & & {} & \\
& {} & & {} & & {} & & {} \\
|[king]| {} & & & {} & {} & & {} & \\
& {} & & {} & & {} & & {} \\
& & {} & & & & {} & \\
& & & {} & {} & {} & & {} \\
};
\end{tikzpicture}
\end{document}
这是一张新图片。
答案3
TikZ 通常有多种方法来产生结果。Stefan 的解决方案非常好,但还有另一种方法:TikZ 有一些编程结构和许多内置的数学函数,可用于快速生成各种图表:
\begin{tikzpicture}
\foreach \row in {0, 1, 2} {
\foreach \column in {0, 1, ..., 3} {
\fill[shading=ball, ball color=black!80]
({2*\column+mod(\row,2)}, -\row) circle (0.5cm);
}
}
\end{tikzpicture}
这会产生与 Stefan 的解决方案完全相同的图片(除了由于矩阵填充而略微改变的边界框)。优点是您可以通过更改几个数字轻松更改大小,并且可以在 foreach 循环中放入任何您喜欢的内容。
答案4
这是一个较晚的解决方案,使用矩阵.骨架。其优点是可以轻松绘制棋盘,而无需牺牲放置棋子的语法。
\documentclass[tikz]{standalone}
\usetikzlibrary{matrix.skeleton}
\begin{document}
\tikzstyle{ball} = [circle, shading=ball, minimum size=1cm]
\newcommand{\bl}{\node [ball, ball color=black!80!white, draw=black!65!white, thin]{};}
\newcommand{\wh}{\node [ball, ball color=white] {};}
\begin{tikzpicture}
\matrix (m) [matrix of nodes, nodes in empty cells, label skeleton, nodes={minimum size = 1.2cm}] {
\bl & & \bl & & \bl & & \bl & \\
& \bl & & \bl & & \bl & & \bl \\
\bl & & \bl & & & & \bl & \\
& & & \bl & & & & \\
\wh & & & & & & & \\
& & & \wh & & \wh & & \wh \\
\wh & & \wh & & \wh & & \wh & \\
& \wh & & \wh & & \wh & & \wh \\
};
\foreach \row in {1, ..., 8} {
\foreach \col in {1, ..., 8} {
\pgfmathparse{Mod(\row + \col, 2) ? "white" : "black"}
\colorlet{squarebg}{\pgfmathresult}
\fitandstyle[background]{(m-cell-\row-\col)}{fill = squarebg}
}
}
\end{tikzpicture}
\end{document}