使用带有 hsb 颜色输入的公式时出现“数字太大”

使用带有 hsb 颜色输入的公式时出现“数字太大”

我正在尝试通过 HSL 颜色空间绘制 S=1 平面。据我所知,HSL 颜色空间未内置于 pgfplots 中,但 HSV(或 HSB)内置于其中。因此,我尝试使用从 HSL 到 HSV 的简单转换,如下所示(请注意限制 x 范围以避免在此 MWE 中除以 0)。

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{pgfplots}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}

\begin{document}
\begin{tikzpicture}

\def\S{1} % saturation (S)

\begin{axis}[
    view={0}{90}, % z rotation, x rotation
    domain=0:1,
    xmin=0.1, xmax=1, % lightness (L)
    ymin=0, ymax=1, % hue (H)
    samples=30,
    axis line style={draw=none},
    tick style={draw=none},
    xticklabels={,,},
    yticklabels={,,},
    width=500px,
    height=100px]
\addplot3[surf, shader=interp,
    mesh/color input=explicit mathparse,
    point meta={symbolic={hsb={y},{2-2*x/(x+\S*min(x,1-x))},{x+\S*min(x,1-x)}}},
    shader=interp] ({x},{y},{1});
\end{axis}

\end{tikzpicture}
\end{document}

但是,我得到了错误,

! Number too big.
<argument> 0000005000000000

这是由于

{2-2*x/(x+\S*min(x,1-x))},{x+\S*min(x,1-x)}

hsb={} 内的公式(倒数第三行)。我认为问题是由于在 hsb={} 内提供了两项公式造成的。一项公式似乎可以正常工作。手册显示,如果没有 hsb={}(因此这是默认的 RGB),两项公式也可以正常工作。我正在使用 mesh/color input=explicit mathparse。我没有主意了。

有人有什么建议吗?谢谢。

答案1

这不是一个完整的答案,而是一个提示和解决方法,太长了,无法放在评论中;我认为问题出在从“hsb”到 RGB 颜色空间的内部计算中。我建议你自己进行 RGB 转换(我不知道公式)以查看转换失败的位置。

如果将点元更改为(注意组件中的 0.99 b):

point meta={symbolic={hsb={y},
  {2-2*x/(x+\S*min(x,1-x))},
  {0.99*(x+\S*min(x,1-x))}}},

为了避免值太接近1,你有一个正确的编译,并且输出是:

在此处输入图片描述

(我不知道这是否合理)

您也收到了警告Package pgfplots Warning: Axis range for axis z is approximately empty; enlargi ng it (it is [1.0000000000:1.0000000000]) on input line 30,但我认为这是意料之中的。


我的发现:我发现您使用的两个公式在计算上没有问题,如您在此处所见:

\documentclass[tikz, border=2.178mm]{standalone}
\usepackage{pgfplots}\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\newcommand\myS{1} % saturation (S)
\begin{axis}[
    xmin=0, xmax=1,
    domain=0:1,
    xlabel = {$x$},
    ylabel = {$y$},
    clip mode = individual,
    samples=100,
    ]
    \addplot[blue, thick] { 2-2*x/(x+\myS*min(x,1-x)) };
    \addplot[red, thick] {x+\myS*min(x,1-x)};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

无关,但是:

  • 不要使用\def\S。如果你使用\newcommand,你会发现\S已经定义了。在这种情况下,这不是问题,但有时事情可能会爆发……你甚至可以简化表达式并在 中使用常量pgfmath,例如

     \tikzset{declare function={S=1;}}
    

    然后S在公式中简单地使用。

  • 始终添加一个\pgfplotsset{compat=...},至少使用高于 1.11 的版本,此时坐标的默认值会发生axis变化,否则您有时会遇到麻烦。

相关内容