【问题标题】:A boolean function for finding if a HSL based color is near to another color用于查找基于 HSL 的颜色是否接近另一种颜色的布尔函数
【发布时间】:2013-01-21 19:45:28
【问题描述】:

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

为此,我使用了 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 将在范围内,如果它是 (360 -(5-20)) .. 如果色相差异超过 0 或 360 限制,请进行特殊构造。

好吧,那会起作用,但后来我想知道是否有可能用单行中的模计算替换这种“如果那么”构造?,这让我仍然想知道 由于模计算可用于检查边界内,如果它超过 360 的边界,它将再次变为红色,接近于零,

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

【问题讨论】:

    标签: c# colors


    【解决方案1】:

    您需要做的是确保所比较的值尽可能接近。例如,如果background = 358mycolor = 4,则可以通过从background 中减去360 使它们更接近,这不会改变有效值。只要区别>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;
    

    【讨论】:

    • 你写的第一个,我也有类似的想法,我们在那里也有相同的想法,最后一个接缝,我很好奇为什么它是 361 而不是 360?
    • @user613326:说实话,我通过反复试验发现了361。我认为使用模数的某种形式会起作用,并编写了一个脚本来比较所有可能输入的原始代码和新代码之间的结果。 360 不正确,但 361 正确。我没有进一步深入研究以确定原因。
    • 如果 0 和 360 都是有效值,这意味着有 361 个可能的值 - 这就是为什么 mod 是 361 而不是 360。如果只有 360 个可能的值(IE 0 到 359(含)
    • @thorkia:实际上是 0 到 359(含)。就它所代表的颜色而言,值 360 与值 0 相同。
    • @mellamokb - 360 度可能是相同的颜色,但它是一个有效值。您可以将颜色值设置为 360,然后它会要求返回值,它会说 360 而不是 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2015-02-04
    • 2012-07-15
    • 1970-01-01
    • 2015-11-21
    • 2012-07-08
    • 1970-01-01
    相关资源
    最近更新 更多