有没有办法将 tikz 中的给定矩形划分为 n x k 个相等的单元格,并给出单元格坐标 (n_i,k_i) 列表,这些单元格应该获得彩色背景?
编辑:
我想我应该更明确地描述我想要什么:
我想要一个这样的函数\myrec
,例如:
\myrec{(0,0),(4.2,6.7),(3,1)}
从起点 (0,0) 绘制一个矩形,其高度=4.2,宽度=6.7,并且按如下方式均匀划分:
或者
\myrec{(0,0),(4.2,6.7),(3,2)}
像这样的矩形:
现在让我们从左下角开始计算这样一个分割矩形中的单元格数量,然后我希望能够给 (i,k) 的单元格一些颜色,
例如
\myrec[(1,2),(3,1),blue]{(0,0),(4.2,6.7),(3,2)}
应该给出如下结果:
足以赋予每个彩色单元格相同的颜色。
答案1
下面假设您要绘制一个矩形,给出两个数字(n
和)表示方向和方向k
上的分区数,以及定义应填充哪些子分区的“坐标”列表。以下代码实现了这一点:x
y
\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}
参数如下:
- 列数
- 行数
- 矩形起始坐标
- 矩形结束坐标
- 需要填充的索引对列表
索引对列表应以某种方式给出。然后填写i/j
所标记的框。使用您的符号。(n_i,k_j)
您可以对其进行更改,以便仅指定矩形的端点,假设它从 开始(0,0)
。 细分的索引从 0 开始。 结果如下:
更新:注释后。很容易将结束坐标修改#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}