我正在尝试使用 tikz 中的嵌套 \foreach 循环从左到右绘制高度减少 1 的框的相邻列。
\documentclass{amsart}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \x in {0,0.25,...,4.75}
{
\foreach \y in {-4,-3.75,...,0.75 - \x}
\filldraw[draw=black, fill=blue, opacity=0.2] (0, \y) rectangle (0.25, \y + 0.25);
}
\end{tikzpicture}
\end{document}
由于每列应该比其左侧少 1 个框,因此我需要根据 \x 更改 \foreach \y 循环的限制。但这种语法显然不正确,我不知道如何让它接受涉及 \x 的表达式。
我也不明白为什么 \filldraw 命令的不透明度参数被忽略。
答案1
{-4,...,0.75-\x}
在设置循环时,您需要先评估集合中的最后一个项,然后代码才能尝试读取它。有多种方法可以做到这一点。一种是使用 pgf 的evaluate
选项,
\foreach \i [evaluate=\i as \k using 0.75-\i] in {0,0.25,...,4.75}
{
\foreach \j in {-4,-3.75,...,\k}
\filldraw[draw=black, fill=blue,opacity=0.2] (0,\j) rectangle (0.25,\j+0.25);
}
结果如下图所示。
我不太确定结果应该是什么样的。opacity=.2
是效果不错,但如果你把足够多的 20% 不透明度的块层叠在一起,它们看起来就不再不透明了。要看到这一点,请尝试在每次循环迭代时移动块,而不是将它们一个叠在另一个上面。例如,
\foreach \j in {-4,-3.75,...,\k}
\filldraw[draw=black, fill=blue,opacity=0.2] (\i,\j) rectangle (\i+0.25,\j+0.25);
生产
或者你可能希望将不透明度应用于两个循环的结果,
\begin{scope}[transparency group,opacity=.2]
\foreach \i [evaluate=\i as \k using 0.75-\i] in {0,0.25,...,4.75}
{
\foreach \j in {-4,-3.75,...,\k}
\filldraw[draw=black, fill=blue] (0,\j) rectangle (0.25,\j+0.25);
}
\end{scope}
但您可能还希望看到一些我未能猜到的其他图像;)。
完整代码:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \i [evaluate=\i as \k using 0.75-\i] in {0,0.25,...,4.75}
{
\foreach \j in {-4,-3.75,...,\k}
\filldraw[draw=black, fill=blue,opacity=0.2] (0,\j) rectangle (0.25,\j+0.25);
}
\end{tikzpicture}
\begin{tikzpicture}
\foreach \i [evaluate=\i as \k using 0.75-\i] in {0,0.25,...,4.75}
{
\foreach \j in {-4,-3.75,...,\k}
\filldraw[draw=black, fill=blue,opacity=0.2] (\i,\j) rectangle (\i+0.25,\j+0.25);
}
\end{tikzpicture}
\begin{tikzpicture}
\begin{scope}[transparency group,opacity=.2]
\foreach \i [evaluate=\i as \k using 0.75-\i] in {0,0.25,...,4.75}
{
\foreach \j in {-4,-3.75,...,\k}
\filldraw[draw=black, fill=blue] (0,\j) rectangle (0.25,\j+0.25);
}
\end{scope}
\end{tikzpicture}
\end{document}
编辑
如果我想要第二张图片(但不是正方形),我会这样做,
\begin{tikzpicture}[x=2.5mm,y=2.5mm]
\foreach \i [evaluate=\i as \k using int(19-\i)] in {0,...,19}
{
\foreach \j in {0,...,\k}
\filldraw[draw=black, fill=blue,opacity=0.2] (\i,\j) rectangle ++(1,1);
}
\end{tikzpicture}
这涉及更少的计算,更容易理解并且会产生更准确的结果(因为用小数计算会引入不精确,尽管累积在这里可能并不重要)。