3

我想写一个函数来检查颜色是否接近背景颜色。

为此,我使用了 HSL 配色方案,让我解释一下;HSL 颜色定义为色相饱和度和亮度。简而言之,色调告诉您使用了彩虹的哪种颜色,它的范围在 0 到 360 之间。我想检查一下它的色调。

因此,饱和度颜色的强度,例如纯色或混合灰色或不言自明的亮度,无法进行比较。我只想检查色调。起初我写了一个像这样的 Near 函数:

Private boolean Near(int background, int mycolor, int difference)
{
  if(math.abs( background - mycolor)<difference){return true;}else{return false}
}

后来我意识到这是错误的。因为 HSL 就像你在下面看到的图像一样,颜色是一个圆圈,所以从红色 0 开始,在 360 处再次变为红色。所以 358 和 4 的色调值很接近,上面的函数不会反映那。

(饱和度到中心 0..100 变亮 0..100 就像上升或下降,色调是从 0 到 360 度左右。)

在此处输入图像描述

我可以用大的 if then 构造重写一个函数,例如,如果红色 5 和允许的差异为 20 的背景,那么mycolor如果它 < 5+20 或 > (360-(5-20) ) .. 因此,如果色相差异超过 0 或 360 限制,请进行特殊构造。

好吧,那会起作用,但后来我想知道是否有可能用单行中的模计算替换这种“if then”构造?,这让我仍然想知道因为模计算可用于检查边界内以及它是否在 360 度的边界上,它会再次变成接近零的红色,

好吧,我认为是这样,这样的行也可能包含一些 AND 或 OR 以及减法或 ABS 函数..是否可以将它写在一个比较行中?

4

1 回答 1

0

您需要做的是确保您正在比较的值尽可能接近。例如,如果background = 358mycolor = 4,那么它们可以通过360从中减去来使它们更接近background,这不会改变有效值。只要差异 > ,就需要使它们更接近180

if (mycolor - background > 180) mycolor -= 360;
if (background - mycolor > 180) background -= 360;

通过这些转换,您的原始逻辑应该是正确的(这if是不必要的):

return Math.Abs(background - mycolor) < difference;

编辑:我发现了一个似乎是正确的更简单的表达式。

return Math.Abs(background - mycolor) % (361 - difference) < difference;
于 2013-01-21T20:08:17.880 回答