我正在尝试在方格上绘制一个环形,该环形表示图像传感器的像素。如果像素的中心位于环形上,即位于外圆和内圆之间,则将填充绿色。否则,像素应填充红色。
我当前的代码(尚未检查内圈)是:
\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 的回答相同: