我正在使用HSL颜色空间。色调因子为0到360度,从0到360意味着在色圈上绕一整圈。所以0接近360(或者它们是相同的)。这意味着要进行一些范围检查,需要使用模函数。
我需要检查值HueX
是否在Hue
的距离RangeH
内:因此,如果Hue = 20
和RangeH = 50
,则如果HueX = 350
,则350
的值在范围内。
我一直在尝试一些数学组合,但没有得到我所希望的结果,因为我认为这可以写成布尔函数的一行。
我使用此方法处理色调值:
public static double HueDifference(double hue1, double hue2)
{
return Math.Min(Math.Abs(hue1 - hue2), 360 - Math.Abs(hue1- hue2));
}
然后你可以检查该值是否在给定的范围内,如下所示:
if (HueDifference(HueX, Hue) <= RangeH)
// ...
基于Taw4,我编写了一个包含HSL色调数学的函数。这不是在线检查,我认为这是使用mod计算存在的。我确实在找那个,但我不记得了。我从Taw4改写了链接的逻辑。
我写这篇文章是作为我的函数的一部分,该函数检查RGB颜色在HSL范围内,S和L因素很容易,但H让我很困扰。我只是把整件事都贴在这里,以防有人需要。
private Boolean RGBInHSLRange
(int r, int g, int b,
int h,int s,int l,
int RH, int RS, int RL)
{ // r,g,b colors
// h,s,l colors
// ranges for HSL in RH,RS,RL
// note color math is usually done in floats not integers
// if you need floats do a float conversion instead of int
// for me int ewas enough
Color myColor = Color.FromArgb(r, g, b);
int HSLhue = (int)myColor.GetHue();
int HSLsat = (int)(myColor.GetSaturation() * 100);
int HSLlight = (int)(myColor.GetBrightness() * 100);
if (( HSLlight < h -RL) ^ ( HSLlight > h +RL)) return false;
if (( HSLsat < s - RS) ^ ( HSLsat > s + RS)) return false;
int distance = Math.Abs(h - HSLhue);
if (distance > 180) distance = 360 - distance;
if (distance > RH) return false;
return true;
}