TikZ 嵌套 foreach 循环和 if-then-else 语句不起作用

TikZ 嵌套 foreach 循环和 if-then-else 语句不起作用

我正在尝试在方格上绘制一个环形,该环形表示图像传感器的像素。如果像素的中心位于环形上,即位于外圆和内圆之间,则将填充绿色。否则,像素应填充红色。

我当前的代码(尚未检查内圈)是:

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\def\outerradius{5}
\def\innerradius{1}
\begin{tikzpicture}[y=-1cm,scale=0.35,font=\small,
  lightgreenpixel/.style={green!20!white,},
  lightredpixel/.style={red!20!white,},
  ]

  \draw[help lines,thick,] (-5,-5) grid (5, 5);
  \draw[thick] (0, 0) circle [radius=5];
  \draw[thick] (0, 0) circle [radius=1];

  \foreach \x in {-5,-4,...,5}
    \foreach \y in {-5,-4,...,5}
    {
      \pgfmathparse{((\x+0.5)*(\x+0.5)+(\y+0.5)+(\y+0.5)) < \outerradius*\outerradius ? int(1) : int(0)}
      \ifnum\pgfmathresult=1
        \fill[lightgreenpixel] (\x,\y) rectangle ++(1,1);
      \else
        \fill[lightredpixel] (\x,\y) rectangle ++(1,1);
      \fi
    }

\end{tikzpicture}
\end{document}

下面显示的结果看起来完全不正确。

在此处输入图片描述

我一直在寻找如何使用如果-那么-否则语句在 TikZ\foreach循环中,感觉该\pgfmathparse命令是正确的。但是我可能错了。任何帮助或建议都将不胜感激!

答案1

您在 的第二项中使用了加法而不是乘法(\x+0.5)*(\x+0.5)+(\y+0.5)*(\y+0.5)(您的代码中有(\x+0.5)*(\x+0.5)+(\y+0.5)+(\y+0.5))。另外,循环上限需要稍微调整一下,否则您就没走太远。

我在像素后面画圆圈,以便我们可以看到它们(或者,您可以使用opacity)。

\documentclass[tikz, border=0mm]{standalone}
\begin{document}

\def\outerradius{5}
\def\innerradius{1}

\begin{tikzpicture}[
  y=-1cm, scale=0.35, font=\small,
  lightgreenpixel/.style={green!20!white,},
  lightredpixel/.style={red!20!white,},
  ]

  % These can be precomputed to save time.
  \pgfmathsetmacro{\innersquared}{(\innerradius)^2}
  \pgfmathsetmacro{\outersquared}{(\outerradius)^2}

  \foreach \x in {-5,-4,...,4}
    \foreach \y in {-5,-4,...,4}
    {
      \pgfmathsetmacro{\rtwo}{(\x+0.5)^2 + (\y+0.5)^2}
      \pgfmathparse{(\rtwo < \innersquared ? 0 :
                      (\rtwo < \outersquared ? 1 : 0))}
      \ifnum\pgfmathresult=1
        \fill[lightgreenpixel] (\x,\y) rectangle ++(1,1);
      \else
        \fill[lightredpixel] (\x,\y) rectangle ++(1,1);
      \fi
    }

  \draw[help lines,thick,] (-5,-5) grid (5, 5);
  \draw[thick] (0, 0) circle [radius=5];
  \draw[thick] (0, 0) circle [radius=1];
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

@frougon 答案的一个小变化(+1)。它在着色条件的定义上有所不同:

\documentclass[tikz, margin=3mm]{standalone}

\begin{document}

\def\outerradius{5}
\def\innerradius{1}
\begin{tikzpicture}[y=-1cm,scale=0.35,font=\small,
  lightgreenpixel/.style={green!20!white,},
  lightredpixel/.style={red!20!white,},
  ]
\pgfmathsetmacro{\r}{\innerradius^2}
\pgfmathsetmacro{\R}{\outerradius^2}
  \foreach \x in {-5,...,4}
    \foreach \y in {-5,...,4}
    {
      \pgfmathparse{int((\x+0.5)^2 + (\y+0.5)^2)}
    \ifnum\pgfmathresult>\r
        \ifnum\pgfmathresult<\R
            \fill[lightgreenpixel] (\x,\y) rectangle ++(1,1);
        \else
            \fill[lightredpixel] (\x,\y) rectangle ++(1,1);
        \fi
    \else
       \fill[lightredpixel] (\x,\y) rectangle ++(1,1);
    \fi
    }
\draw[help lines,thick] (-5,-5) grid (5, 5);
\draw[thick] (0, 0) circle [radius=5] 
             (0, 0) circle [radius=1];
\end{tikzpicture}

\end{document}

结果与@frougon 的回答相同:

在此处输入图片描述

相关内容