将矩形分成 n x k 个相等的单元格

将矩形分成 n x k 个相等的单元格

有没有办法将 tikz 中的给定矩形划分为 n x k 个相等的单元格,并给出单元格坐标 (n_i,k_i) 列表,这些单元格应该获得彩色背景?

编辑:

我想我应该更明确地描述我想要什么:

我想要一个这样的函数\myrec,例如:

\myrec{(0,0),(4.2,6.7),(3,1)}

从起点 (0,0) 绘制一个矩形,其高度=4.2,宽度=6.7,并且按如下方式均匀划分:

矩形 3x1

或者

\myrec{(0,0),(4.2,6.7),(3,2)}

像这样的矩形:

3x2 矩形

现在让我们从左下角开始计算这样一个分割矩形中的单元格数量,然后我希望能够给 (i,k) 的单元格一些颜色,

例如

\myrec[(1,2),(3,1),blue]{(0,0),(4.2,6.7),(3,2)}

应该给出如下结果:

3x2 矩形,彩色

足以赋予每个彩色单元格相同的颜色。

答案1

下面假设您要绘制一个矩形,给出两个数字(n和)表示方向和方向k上的分区数,以及定义应填充哪些子分区的“坐标”列表。以下代码实现了这一点:xy

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
  \def\rectDiv#1#2#3#4#5{%#columns, #rows, rectangle start, rectangle end, list of elements to fill
    \begin{tikzpicture}
      \draw #3 rectangle #4;
      \path #3;
      \pgfgetlastxy{\firstx}{\firsty}
      \path #4;
      \pgfgetlastxy{\secondx}{\secondy}
      \pgfmathsetlengthmacro{\xdiff}{\secondx-\firstx}
      \pgfmathsetlengthmacro{\ydiff}{\secondy-\firsty}
      \pgfmathsetlengthmacro{\myxstep}{\xdiff/#1}
      \pgfmathsetlengthmacro{\myystep}{\ydiff/#2}
      \foreach \x in {1,...,#1}{
        \draw ($#3 +\x*(\myxstep,0)$) -- ($#3 +(0,\ydiff) +\x*(\myxstep,0)$);
      }
      \foreach \y in {1,...,#2}{
        \draw ($#3 +\y*(0,\myystep)$) -- ($#3 +(\xdiff,0) +\y*(0,\myystep)$);
      }
      \foreach \i/\j in {#5}{
        \path[fill=blue!20,draw] ($#3 + (\i*\myxstep,\j*\myystep)$) rectangle ($#3 + (\i*\myxstep,\j*\myystep) + (\myxstep,\myystep)$);
      }
    \end{tikzpicture}
  }
\begin{document}
  \rectDiv{7}{5}{(1,1)}{(4,3)}{0/0,1/1,2/0,5/3}
\end{document}

参数如下:

  1. 列数
  2. 行数
  3. 矩形起始坐标
  4. 矩形结束坐标
  5. 需要填充的索引对列表

索引对列表应以某种方式给出。然后填写i/j所标记的框。使用您的符号。(n_i,k_j)

您可以对其进行更改,以便仅指定矩形的端点,假设它从 开始(0,0)。 细分的索引从 0 开始。 结果如下:

TikZ 细分

更新:注释后。很容易将结束坐标修改#4(width, height)。因为结束坐标只是(start) + (width,height)。这可能会导致路径和使用中的一些问题\pgfgetlastxy,因此我们还定义了一个额外的坐标。可以通过替换来修改代码

\draw #3 rectangle #4;
\path #3;
\pgfgetlastxy{\firstx}{\firsty}
\path #4;

\draw #3 rectangle ($#3 + #4$) coordinate (end);
\path #3;
\pgfgetlastxy{\firstx}{\firsty}
\path (end);

将示例更改为

\rectDiv{7}{5}{(1,1)}{(3,2)}{0/0,1/1,2/0,5/3}

得到完全相同的结果。请注意,您必须指定(width,height)不是 (height,width)。这要容易得多,因为它允许进行简单的添加。

答案2

您可以使用\usetikzlibrary{shapes.multipart}

来自 pgfmanual 的示例:

\begin{tikzpicture}
  \tikzset{every node/.style={rectangle split, draw, minimum width=.5cm}}
  \node[rectangle split part fill={red!50, green!50, blue!50, yellow!50}]  {};
  \node[rectangle split part fill={red!50, green!50, blue!50}] at (0.75,0) {};
  \node[rectangle split part fill={red!50, green!50}]          at (1.5,0)  {};
  \node[rectangle split part fill={red!50}]                    at (2.25,0) {};
\end{tikzpicture}

您可以毫无问题地访问每个矩形(参见手册)

在此处输入图片描述

答案3

正如我在评论中所说,你正在寻找什么并不清楚,也许@Altermundus 的解决方案就是你正在寻找的。但这里有一种方法可以获取将矩形划分为特定数量的分区的坐标,这些分区在任一方向上由以下公式给出:\NumOfXDivisions\NumOfYDivisions

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

% Define the coordinates for the rectangle
\newcommand*{\xmin}{0}%
\newcommand*{\xmax}{10}%
\newcommand*{\ymin}{0}%
\newcommand*{\ymax}{5}%

\newcommand*{\NumOfXDivisions}{2}%
\newcommand*{\NumOfYDivisions}{5}%

\begin{document}
\begin{tikzpicture}
    \draw[red] (\xmin,\ymin) 
            -- (\xmax,\ymin)
            -- (\xmax,\ymax)
            -- (\xmin,\ymax)
            -- cycle;

    \pgfmathsetmacro{\xStepSize}{(\xmax-\xmin)/\NumOfXDivisions}
    \pgfmathsetmacro{\yStepSize}{(\ymax-\ymin)/\NumOfYDivisions}

    \foreach \i in {0,...,\NumOfXDivisions}{
        \foreach \j in {0,...,\NumOfYDivisions}{
            \pgfmathsetmacro{\xValue}{\i*\xStepSize+\xmin}
            \pgfmathsetmacro{\yValue}{\j*\yStepSize+\ymin}
            \fill (\xValue,\yValue) circle (2pt);
        }
    }
\end{tikzpicture}

\bigskip\noindent
The coordinates are:
    \pgfmathsetmacro{\xStepSize}{(\xmax-\xmin)/\NumOfXDivisions}
    \pgfmathsetmacro{\yStepSize}{(\ymax-\ymin)/\NumOfYDivisions}

    \foreach \i in {0,...,\NumOfXDivisions}{
        \foreach \j in {0,...,\NumOfYDivisions}{
            \pgfmathsetmacro{\xValue}{\i*\xStepSize+\xmin}
            \pgfmathsetmacro{\yValue}{\j*\yStepSize+\ymin}
            (\xValue,\yValue);
        }
    }
\end{document}

相关内容