创建彩虹色宏

创建彩虹色宏

我正在尝试用 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.styrgbTikZ 使用。您也可以说\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}

彩虹

相关内容