我正在尝试用 tikz 画一幅画,其代码由另一个计算机程序生成。该程序输出 0 到 100 之间的数百个数字,我想根据这些数字按光谱为图片中的对象着色。
例如,假设我选择的光谱是红橙黄绿蓝紫。那么我想定义一个宏,它有一个输入(0 到 100 之间的数字),并根据以下规则给出颜色:
0=红色
20=橙色
40=黄色
60=绿色
80=蓝色
100=紫色
介于两者之间的任何数字都是合适的组合。例如,5 表示主要为红色,略带橙色。55 表示主要为绿色,略带黄色。
先感谢您!
答案1
嵌套使用\ifnum
来定义颜色可以\colorlet
完成以下工作:
代码:
\documentclass{article}
\usepackage{xcolor}
\usepackage{pgffor}
\colorlet{MyColor}{black}%
\newcommand{\MixValue}{0}
\newcommand*{\SetColor}[1]{%
\ifnum#1<21
\pgfmathtruncatemacro{\MixValue}{100*#1/20}%
\colorlet{MyColor}{orange!\MixValue!red}%
\else
\ifnum#1<41
\pgfmathtruncatemacro{\MixValue}{100*(#1-20)/20}%
\colorlet{MyColor}{yellow!\MixValue!orange}%
\else
\ifnum#1<61
\pgfmathtruncatemacro{\MixValue}{100*(#1-40)/20}%
\colorlet{MyColor}{green!\MixValue!yellow}%
\else
\ifnum#1<81
\pgfmathtruncatemacro{\MixValue}{100*(#1-60)/20}%
\colorlet{MyColor}{blue!\MixValue!green}%
\else
\ifnum#1<101
\pgfmathtruncatemacro{\MixValue}{100*(#1-80)/20}%
\colorlet{MyColor}{violet!\MixValue!blue}%
\else
\fi%
\fi%
\fi%
\fi%
\fi%
}%
\newcommand*{\ShowInAppropriateColor}[1]{%
\SetColor{#1}%
\textcolor{MyColor}{#1}%
}%
\begin{document}
\noindent
\foreach \x in {0,...,100} {%
\ShowInAppropriateColor{\x}
}%
\end{document}
答案2
您可以使用wave
颜色模型更简单地完成此操作:
\documentclass{article}
\usepackage{xcolor}
\usepackage{pgffor}
\begin{document}
\noindent
\foreach \x in {300,320,...,900} {\textcolor[wave]{\x}{\x}\ }
\end{document}
根据xcolor 手册,参数 λ 应该是可见光波长,以纳米 (nm) 为单位,因此 λ ∈ [380, 780]。如我的示例所示,“不可见”波长显示为黑色。
答案3
这种方法由于几个原因而很有趣。
\documentclass{article}
\usepackage{xcolor}
\usepackage{tikz}
\newcommand{\makemycolor}[2]{%
\pgfmathsetmacro{\hue}{(#1/100)^1.715*0.8}%
\definecolor{myhsbcolor}{hsb}{\hue,1,1}%
\textcolor{myhsbcolor}{#2}%
}
\begin{document}
\noindent\begin{tikzpicture}
\foreach \k in {0,1,...,100}{%
\pgfmathsetmacro{\hue}{(\k/100)^1.715*0.79}
\definecolor{mycolor}{rgb:hsb}{\hue,1,1}
\node[color=mycolor] () at (\k/10,0) {$\bullet$};
}%
\foreach \f in {0,1,...,10}{%
\pgfmathtruncatemacro{\num}{\f*10}
\node () at (\f,-.5) {\num};
}
\foreach \g/\h in {0/Red,2/Orange,4/Yellow,6/Green,8/Blue,10/Purple}{%
\pgfmathtruncatemacro{\num}{\g*10}
\node at (\g,-1) {\makemycolor{\num}{\h}};
}%
\end{tikzpicture}
\end{document}
首先,hsb
正如 Thruston 所建议的,这使用了(色调-饱和度-亮度)模型。
第二:通常,TikZ
不能使用模型。通过指定导致所有颜色从任何颜色空间转换为颜色空间来hsb
解决该问题\usepackage[rgb]{xcolor}
xcolor.sty
rgb
TikZ
能使用。您也可以说\usepackage[cmyk]{xcolor}
如果您要打印这个 --TikZ
也明白cmyk
。还请注意,您可以说但用或\usepackage{xcolor}
定义颜色-- 再次将 hsb 转换为 rgb 或 cmyk,但视具体情况而定。\definecolor{mycolor}{rgb:hsb}{\hue,1,1}
\definecolor{mycolor}{cmyk:hsb}{\hue,1,1}
注意xcolor.sty
必须加载前 tikz.sty
。
第三,实际设置色调的函数
\pgfmathsetmacro{\hue}{(\k/100)^1.715*0.8}
可以随意改变以获得更好的色彩分布。0.8
决定最终颜色,因此您可以稍微向上或向下调整以微调光谱末端的紫色色调。
因此,对于可以调用特定颜色的宏,您可以尝试如下操作:
\documentclass{article}
\usepackage{xcolor}
\usepackage{tikz}
\newcommand{\makemycolor}[2]{%
\pgfmathsetmacro{\hue}{(#1/100)^1.715*0.79}%
\definecolor{myhsbcolor}{hsb}{\hue,1,1}%
\textcolor{myhsbcolor}{#2}%
}
\begin{document}
\makemycolor{0}{Red}
\makemycolor{40}{Yellow}
\makemycolor{55}{Green with a touch of yellow}
\makemycolor{100}{Purple}
\end{document}
另外,您还可以\usepackage[gray]{xcolor}
在序言中指定以获取以下内容:
不确定其实际用途,但仍然很有趣。
答案4
混合Paul Gaborit 的回答使用xcolor
波浪模型和颜色转换:
\documentclass[tikz, margin=2mm]{standalone}
\begin{document}
\begin{tikzpicture}[x=1mm,y=1mm]
\foreach \wav in {380, 384,...,780}{
\definecolor{tmpcolor}{wave}{\wav}
\colorlet{mycolor}[rgb]{tmpcolor}
\fill[fill=mycolor,draw=white] (\wav,1) rectangle +(4mm,15mm);
}
\end{tikzpicture}
\end{document}