处理多重检查ruby的最佳方法

时间:2018-01-15 01:14:24

标签: ruby colors rgb hsl

所以我正在尝试为HSL写一个转换器到RGB(并最终转换成十六进制) 我正在关注这个colorspace conversion theory,我似乎陷入了第6步

  

现在我们需要做最多3次测试,为每种测试选择正确的公式   色彩通道。让我们从红色开始。

     

测试1 - 如果6 x temporary_R小于1,则Red = temporary_2 +   (temporary_1 - temporary_2)x 6 x temporary_R如果是第一个   测试大于1检查以下

     

测试2 - 如果2 x temporary_R小于1,则Red = temporary_1 In   第二次测试的情况也大于1,请执行以下操作

     

测试3 - 如果3 x temporary_R小于2,则Red = temporary_2 +   (temporary_1 - temporary_2)x(0.666 - temporary_R)x 6在这种情况下   第三个测试也大于2,你做了以下

     

红色=临时_2

     

好吧,让我们为我们的红色值

     

6 x temporary_R = 6 x 0.869 = 5.214,所以它大于1,我们需要   做测试2 2 x temporary_R = 2 x 0.869 = 1.738,它也大于   1,我们需要做测试3 3 x temporary_R = 3 x 0.869 = 2.607,这是   大于2,所以我们选择最后一个公式Red = temporary_2 =   向下舍入的0.0924是0.09,这是我们从RGB到HSL转换识别的数字

到目前为止,我已经修补了一个函数来获取我的HSL颜色

def toRGB(hue, sat, lum)
  temp_1 =
  case lum
   when lum < 0.0
     lum x (1.0 * sat)
   when lum > 0.0
     (lum + sat) - lum
  end
  temp_2 = (2 * lum) - temp_1.to_f
  h = (hue/360.0).round(4)
  temp_r = (h + 0.333).round(4)
  temp_r = temp_r + 1 if temp_r < 0
  temp_r = temp_r - 1 if temp_r > 1
  temp_g = h 
  temp_b = (h - 0.333).round(4)
  temp_b = temp_b + 1 if temp_b < 0
  temp_b = temp_b - 1 if temp_b > 1
  red = 
  #test 1
  #test 2
  #test 3
  "#{red}"
end

我试图使用case声明

red = 
  case temp_r
    when 6 * temp_r < 1
      temp_2 + (temp_1 - temp_2) * 6 * temp_r
    when 2 * temp_r < 1
      temp_1
    when 3 * temp_r < 2
      temp_2 + (temp_1 - temp_2) * (0.666 - temp_r * 6)
  end

然后我开始重新阅读说明书,现在我无法真正看到在ruby中做我需要的方法。也许我过度思考了。

如果您想在上下文中查看我的其余代码can see it here

1 个答案:

答案 0 :(得分:0)

我在代码段中注意到两件事:

您正在ruby中混合使用两种类型的switch case语句。

case a
when 1..5
 "It's between 1 and 5"
when 6
 "It's 6"
end

case
when a > 1 && a < 5
 "It's between 1 and 5"
when a == 6
 "It's 6"
end

查看差异,在第一种情况下,当您直接比较案例时,您需要提及您要比较的变量名称,而在第二种情况下,您要与真实&amp;进行比较。错误的条件,明确地在你的变量上加上条件,这样你就不需要把它放在案例旁边。

第二件事是根据您的条件陈述,您在案件陈述中需要一个其他案例。

red = 
  case
    when 6 * temp_r < 1
      temp_2 + (temp_1 - temp_2) * 6 * temp_r
    when 2 * temp_r < 1
      temp_1
    when 3 * temp_r < 2
      temp_2 + (temp_1 - temp_2) * (0.666 - temp_r * 6)
    else
      temp_2
  end