代码之家  ›  专栏  ›  技术社区  ›  LeggoMyEcho

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

  •  1
  • LeggoMyEcho  · 技术社区  · 6 年前

    因此,我正在尝试编写一个将HSL转换为RGB(最终转换为十六进制)的转换器 我正在关注这个 colorspace conversion theory 我似乎被第6步卡住了

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

    测试1–如果6 x临时值小于1,则红色=临时值2+ (temporary\u 1 temporary\u 2)x 6 x temporary\R如果是第一个 测试大于1检查以下内容

    测试2–如果2 x temporary\R小于1,则红色=temporary\u 1 In 如果第二次测试也大于1,请执行以下操作

    测试3–如果3 x临时值小于2,则红色=临时值2+ (temporary\u 1 temporary\u 2)x(0.666 temporary\u R)x 6 第三个测试也比2大,请执行以下操作

    红色=临时\u 2

    好吧,让我们用红色值

    6 x temporary\u R=6 x 0.869=5.214,所以它大于1,我们需要 进行测试2 2 x temporary\u R=2 x 0.869=1.738,其也大于 1,我们需要做测试3 3 x temporary\u R=3 x 0.869=2.607 大于2,所以我们使用最后一个公式Red=temporary\u 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 回复  |  直到 6 年前
        1
  •  0
  •   Anurag Aryan    6 年前

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

    您在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
    

    看到一个区别,在第一种情况下,当您直接比较案例时,您必须提到您要比较的变量名称,而在第二种情况下,您要与true比较&通过显式地在变量上放置条件,使其不需要放在case旁边,从而使条件为false。

    第二件事是根据您的条件声明,您需要在case声明中使用else case。

    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