编辑

编辑

我正在尝试使用 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}

非分级蓝色台阶

这涉及更少的计算,更容易理解并且会产生更准确的结果(因为用小数计算会引入不精确,尽管累积在这里可能并不重要)。

相关内容