在三维中绘制彩色球体时,嵌套的 \foreach 功能不可预测

在三维中绘制彩色球体时,嵌套的 \foreach 功能不可预测

我正在用 TikZ 向我的学生展示色彩系统,在这里我创建了一组 3D 轴,以阴影球体表示红色、绿色、蓝色及其组合。

RGB 空间

由于某种原因,结果在蓝轴上看起来还好,但在绿轴和红轴上却没有按预期工作,因为当它们的值增加时,球体保持灰色。问题出在哪里?

我已经注意了,所有内容都以相同的顺序(RGB)在代码中表示。代码首先设置一些有关轴(x、y、z)的变量,然后设置步长/球体之间的距离,然后设置假定 8 位颜色的最大值 255。

要点是,嵌套的每个函数都会遍历红色、绿色和蓝色(所有组合)之间 0-255 的所有整数值,第二个 \tikzmath 会创建用于颜色信息的比例变量,然后每次传递都会用适当的颜色和在轴上的位置绘制一个阴影球体。

\documentclass{memoir}
\usepackage{tikz}
\usetikzlibrary{math}

\begin{document}

\begin{tikzpicture}[scale=0.03]
\tikzmath{\x = 300; \y = \x; \z=\x; \step=51;\maxvalue=255;} %optimal step size 51
\draw[->, very thick, red] (0,0,0) -- (\x,0,0) node[right]{R};
\draw[->, very thick, green] (0,0,0) -- (0,\y,0) node[above]{G};
\draw[->, very thick, blue] (0,0,0) -- (0,0,\z) node[below left]{B};

\foreach \red in {0,\step,...,\maxvalue}{
    \foreach \green in {0,\step,...,\maxvalue}{
        \foreach \blue in {0,\step,...,\maxvalue}{

\tikzmath{\reds=\red/\maxvalue*100;\greens=\green/\maxvalue*100;\blues=\blue/\maxvalue*100;}

\shadedraw[ball color=red!\reds!green!\greens!blue!\blues!] (\red,\green,\blue) circle [radius=10cm];
        }
    }
}

\end{tikzpicture}

\end{document}

答案1

我不知道恰恰出了什么问题,但我猜想当分数加起来不等于 100 时,就会出现某种幺正性问题。这里有其他一些方法可以实现我认为你想要的功能。

\documentclass{memoir}
\usepackage{tikz}
\usetikzlibrary{math}

\begin{document}

\begin{tikzpicture}[scale=0.03]
\tikzmath{\x = 300; \y = \x; \z=\x; \step=51;\maxvalue=255;} %optimal step size 51
\draw[->, very thick, red] (0,0,0) -- (\x,0,0) node[right]{R};
\draw[->, very thick, green] (0,0,0) -- (0,\y,0) node[above]{G};
\draw[->, very thick, blue] (0,0,0) -- (0,0,\z) node[below left]{B};

\foreach \red in {0,\step,...,\maxvalue}{
    \foreach \green in {0,\step,...,\maxvalue}{
        \foreach \blue in {0,\step,...,\maxvalue}{

\tikzmath{\reds=(\red/\maxvalue)*255;
\greens=(\green/\maxvalue)*255;\blues=(\blue/\maxvalue)*255;}
\definecolor{mycolor}{RGB}{\reds,\greens,\blues}

\shadedraw[ball color=mycolor] (\red,\green,\blue) circle [radius=10cm];
        }
    }
}

\end{tikzpicture}
\end{document}

在此处输入图片描述

编辑:附加了具有独特颜色名称的版本。周围有这么多不同的观众,谁也不知道。输出是一样的。

\documentclass{memoir}
\usepackage{tikz}
\usetikzlibrary{math}

\begin{document}

\begin{tikzpicture}[scale=0.03]
\tikzmath{\x = 300; \y = \x; \z=\x; \step=51;\maxvalue=255;} %optimal step size 51
\draw[->, very thick, red] (0,0,0) -- (\x,0,0) node[right]{R};
\draw[->, very thick, green] (0,0,0) -- (0,\y,0) node[above]{G};
\draw[->, very thick, blue] (0,0,0) -- (0,0,\z) node[below left]{B};

\foreach \red in {0,\step,...,\maxvalue}{
    \foreach \green in {0,\step,...,\maxvalue}{
        \foreach \blue in {0,\step,...,\maxvalue}{

\tikzmath{\reds=(\red/\maxvalue)*255;
\greens=(\green/\maxvalue)*255;\blues=(\blue/\maxvalue)*255;}
\definecolor{mycolor-\reds-\greens-\blues}{RGB}{\reds,\greens,\blues}

\shadedraw[ball color=mycolor-\reds-\greens-\blues] (\red,\green,\blue) circle [radius=10cm];
        }
    }
}

\end{tikzpicture}
\end{document}

相关内容