如何绘制缺少两个对角方块的棋盘?

如何绘制缺少两个对角方块的棋盘?

我该如何绘制残缺的棋盘,即缺少两个对角的角方块?使用该chessboard包,我只能绘制完整的棋盘……

在此处输入图片描述

答案1

PSTricks 解决方案:

\documentclass{article}

\usepackage{multido}
\usepackage{pstricks}

\def\boardsize{8 } % a space after the number is required


\begin{document}

\begin{pspicture}(\boardsize,\boardsize)
\psset{dimen = middel}
  \multido{\iA = 0+1}{\numexpr\boardsize-1}{%
    \multido{\iB = 0+1}{\numexpr\boardsize-1}{\psframe(\iB,\iA)(!\iB\space 1 add \iA\space 1 add)}}
  \multido{\iC = 1+1}{\numexpr\boardsize-1}{\psframe(!\iC\space \boardsize 1 sub)(!\iC\space 1 add \boardsize)}
  \multido{\iD = 1+1}{\numexpr\boardsize-2}{\psframe(!\boardsize 1 sub \iD)(!\boardsize \iD\space 1 add)}
\end{pspicture}

\end{document}

输出

您所要做的就是选择的值\boardsize

更新

如果您想绘制线条而不是正方形,可以使用以下命令:

\documentclass{article}

\usepackage{multido}
\usepackage{pstricks}

\def\boardsize{8 } % a space after the number is required


\begin{document}

\begin{pspicture}(\boardsize,\boardsize)
\psset{linecap = 2}
  \multido{\iA = 1+1}{\numexpr\boardsize-1}{\psline(\iA,0)(\iA,\boardsize)}
  \multido{\iB = 1+1}{\numexpr\boardsize-1}{\psline(0,\iB)(\boardsize,\iB)}
  \psline(0,0)(!0 \boardsize 1 sub)
  \psline(\boardsize,1)(\boardsize,\boardsize)
  \psline(0,0)(!\boardsize 1 sub 0)
  \psline(1,\boardsize)(\boardsize,\boardsize)
\end{pspicture}

\end{document}

答案2

这很容易做到\foreach;请参阅 TikZ/PGF 手册第 56 节。

关于效率的评论

绘制棋盘的方格(如图所示Svend Tveskæg 的第一个方法<guy-whose-name-always-changes>的回答) 的效率相当低,对应的算法复杂度为 Θ(n^2),其中 n 是行数。相比之下,绘制棋盘的线条所需的工作量较少,对应的算法复杂度仅为 Θ(n)。因此,绘制棋盘的线条比绘制方格要好。

对于一次性的、小型的棋盘来说,这种考虑可能并不重要,但是如果您想在文档中多次绘制这种类型的图表,和/或如果您想绘制具有异常大量方格的棋盘(n×n,n 很大),您可能需要绘制线条而不是方格以减少编译时间。

在此处输入图片描述

\documentclass{article}

\usepackage{tikz}
\tikzset{chessboard/.style={thick}}%

\begin{document}
\begin{tikzpicture}
  \newif\iffirstdiag          % Switch to control which corners are ommitted.
  \firstdiagtrue              % (flip the switch here)
  %
  \pgfmathtruncatemacro\N{8}  % number of rows/columns
  \pgfmathtruncatemacro\Nmone{\N-1}
  %
  % draw internal lines
  \foreach \i in {1,2,...,\Nmone}
  {
    \draw[chessboard] (0,\i) -- (\N,\i);  % We control the horizontals...
    \draw[chessboard] (\i,0) -- (\i,\N);  % ...and the verticals.
                                          % We can deluge you with a thousand
                                          % channels or expand one single
                                          % image to crystal clarity and 
                                          % beyond...
  }
  %
  % draw external lines
  \iffirstdiag
    \draw[chessboard] (0,0)  -- (\Nmone,0);    % bottom
    \draw[chessboard] (1,\N) -- (\N,\N);       % top
    \draw[chessboard] (0,0)  -- (0,\Nmone);    % left
    \draw[chessboard] (\N,1) -- (\N,\N);       % right
  \else
    \draw[chessboard] (1,0)  -- (\N,0);        % bottom
    \draw[chessboard] (0,\N) -- (\Nmone,\N);   % top
    \draw[chessboard] (0,1)  -- (0,\N);        % left
    \draw[chessboard] (\N,0)  -- (\N,\Nmone);  % right
  \fi
\end{tikzpicture}
\end{document}

答案3

另一个解决方案是使用 PSTricks。只是为了减少其他现有答案中使用的击键次数。

特征:

  1. 只需将数字更改4为任意正整数即可更改单元格的数量。
  2. 代码使用最少的击键次数来节省更多字节。绿色环保!
  3. 所使用的算法很容易理解,但对于“相对较少”的数量来说它不会对您造成伤害\N

PSTricks 解决方案(推荐)

\documentclass[pstricks,border=12pt]{standalone}


\def\N{5}
\def\M{\numexpr\N-1}
\def\A{\multips(0,1){\M}{\multips(1,0){\M}{\psframe(1,1)}}}

\begin{document}

\begin{pspicture}[dimen=m](\N,\N)
\A\rput(1,1){\A}
\end{pspicture}

\end{document}

在此处输入图片描述

TikZ 解决方案

\documentclass[tikz,border=12pt]{standalone}


\def\N{5}
\def\M{\numexpr\N-1}
\def\A{\tikz{\foreach \j in {1,...,\M}{\foreach \i in {1,...,\M}{\draw (\i,\j) rectangle +(1,1);}}}}

\begin{document}
\tikz \draw (0,0) node {\A} (1,1) node {\A};
\end{document}

答案4

这是一个老问题,但这可能是一个更简单的 TikZ 解决方案。只需重叠两个网格即可。

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\draw grid (7,7) (1,1) grid (8,8);
\end{tikzpicture}

\end{document}

相关内容