由外挂武器准心取色理解RGB,ESL,HSL空间与HSV空间,愿愿。

以下有公式:愿愿就贴图片啦。

    我们玩腾讯生死狙击游戏往往,会狙击打枪后马上换刀躲避,所以,需要一个辅助工具来,完成这个想法。我推荐的是AutoHotkey。当然你可以选择按键精灵。

    首先,我们要取色,判断该颜色是武器准心颜色。由于RGB空间表示的颜色并不能均匀的描述人类的眼睛的辨色规律,所以有了HSL与HSV颜色空间。

请参阅《关于HSL和HSV颜色空间的详细论述》学海无涯GL 和《HSL and HSV》Wikipedia以下是两篇文章的网住地址。

http://www.360doc.com/content/13/1105/14/10724725_326803150.shtml

https://en.wikipedia.org/wiki/HSL_and_HSV

    其次,拷贝了RGB空间到HSL空间的转换代码,如下:

/**

 * Converts an RGB color value to HSL. Conversion formula

 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.

 * Assumes r, g, and b are contained in the set [0, 255] and

扫描二维码关注公众号,回复: 3447436 查看本文章

 * returns h, s, and l in the set [0, 1].

 *

 * @param   {number}  r       The red color value

 * @param   {number}  g       The green color value

 * @param   {number}  b       The blue color value

 * @return  {Array}           The HSL representation

 */

function rgbToHsl(r, g, b){

    r /= 255, g /= 255, b /= 255;

    var max = Math.max(r, g, b), min = Math.min(r, g, b);

    var h, s, l = (max + min) / 2;

    if(max == min){

        h = s = 0; // achromatic

    }else{

        var d = max - min;

        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);

        switch(max){

            case r: h = (g - b) / d + (g < b ? 6 : 0); break;

            case g: h = (b - r) / d + 2; break;

            case b: h = (r - g) / d + 4; break;

        }

        h /= 6;

    }

    return [h, s, l];

}

/********代码完******/
    再次,要判断狙击枪准心位置,可以拷屏,用windows画图程序,点网格,来查看,准心坐标,当然,该坐标游戏时,一般在鼠标位置,就不细说了。

    再次,开始取色吧,颜色是红色,而游戏中该颜色是有变化的,所以并不是一个简单的RGB(255,0,0),往往是什么(197,22,39),(227,42,39)等等乱七八糟的红色。

但我们人眼是可以识别该色为红色的。所以我们要将RGB转成HSL来,判断,该颜色是不是我们要找的颜色。一般来说:有如下规律

-30<=h<30, 红色

30<=h<90,  黄色

90<=h<150,绿色

150<=h<210,青色

210<=h<270,蓝色

270<=h<330,品红色

    再再次,用windows画板mspaint中是ESL,而不是HSL,所以需要简单的转换下,本质上,ESL与HSL没有区别,只是取值范围不同。也就是说,如果ESL的值域是[0,239],[240],[240],HSL的值域分别为[0,360],[0,1],[0,1],那么我们只要将E除以239,再乘以360,就完成了转换。反过来,一样一样的。

    我的程序判断红色是这样的,如下:(autohotkey代码)

;//////////////////////////////////////////代码开始////////

 PixelGetColor, StarColor0, StarX0pos, StarY0pos

 ;以下为红色准心判断条件

 ;h<(1/30) 且 L>0.333333 且 L<0.625 且 s>0.625

 ;或者 h>(230/240) 且 L>0.375 且 L<0.625 且 s>0.625

   blue:=((StarColor0&0xff0000)>>16)

   green:=((StarColor0&0x00ff00)>>8)

   red:=((StarColor0&0x0000ff))

   imax:= Max(red, green, blue) ;

   if(red>140 and red=imax)

   {

   ;   0<h,l,s<1,单精度浮点型小数点后面有效数字为6~7位

      r:= red/255.0 ;

      g:= green/255.0 ;

      b:= blue/255.0 ;

      fmax:= r ;

      fmin:= min(r, g, b) ;

      h:=0.0 ;

      s:=0.0 ;   0<h,l,s<1

      l:= (fmax + fmin) / 2.0 ;

      if(l<0.625 and l>0.33333)

      {

         if(fmax != fmin)

         {

            d:= fmax - fmin ;

            s:= l > 0.5 ? d / (2 - fmax - fmin): d / (fmax + fmin) ;;   0<h,l,s<1

            h:= (g - b) / d + (g < b ? 6 : 0) ;

            h /= 6 ;;   0<h,l,s<1

         }

         if(s>0.625)

         {

            if(h<0.03333 or (h>0.958333 and l>0.375))

            {

               return true ;

            }

         }

      }

   }

;//////////////////////////////////////////代码结束/////

代码不好看,直接给你不等式。

条件1:(H<0.03333  且  ( (L>0.333333)且(L<0.625) )  )

条件2:(H>0.958333 且  ( (L>0.375)且(L<0.625) )  )

条件1与条件2是或的关系,满足其一,就可以判定是人眼可以辨别的准心红色。(注意,饱和度s都要大于0.625。别说我没有说,霍霍~~!)

    再再次,我们如何理解HSL公式呢,不然读者不明白其中的道理,如果准心变成绿色就傻眼了。以下愿愿就详细给大家推导下。

还需要注意的是,在(O,青,蓝)这个三角区域,B永远大于R,为什么呢?我们可以这样得出结论,做一个B=R的面(在六边形上是pink到Green的线),该面把立方体分割成了两个三棱柱,容易看出靠近在该线的Blue一侧,R都是小于B的,说这个的原因是,上面公式简化只是给出了B最大的情况,没有说G最大,R最大的。所以只剩下G最大,R最小的情况,容易得出结论,大家自己算算。

猜你喜欢

转载自blog.csdn.net/tom_xuzg/article/details/82948678