我正在使用HSL色彩空间。 色调系数从0到360度,从零到360意味着在色环上转一圈。所以0接近360(或者它们是相同的)。这意味着要进行一些范围检查,就需要模数函数。
我需要检查值HueX
是否在RangeH
的距离Hue
内:
因此,如果Hue = 20
和RangeH = 50
则HueX = 350
,那么350
的值就在范围内。
我一直在尝试一些数学组合,但没有考虑我希望的结果,因为我认为这可以写成一个布尔函数一个班轮。
答案 0 :(得分:2)
我使用此方法处理Hue值:
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)
// ...
答案 1 :(得分:0)
基于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;
}