【问题标题】:Get HSB values from RGB color in NetLogo从 NetLogo 中的 RGB 颜色获取 HSB 值
【发布时间】:2014-09-01 23:55:24
【问题描述】:

NetLogo 提供了一个extract-hsb,用于获取 NetLogo 颜色的 hsb 值。但是,它似乎不适用于使用 rgb 列表指定的颜色,即使 rgb 列表是 NetLogo 中的合法颜色。所以我的问题是,如何手动执行此操作?

顺便说一句,我已经向 NetLogo 添加了一个功能请求,以适当地扩展 extract-hsbhttps://github.com/NetLogo/NetLogo/issues/643

【问题讨论】:

    标签: colors netlogo


    【解决方案1】:

    这里是基于wikipedia's definition of HSBextract-hsb的概括(注意V和B是一回事)

    to-report to-hsb [ rgb-color ]
      if is-number? rgb-color [ set rgb-color extract-rgb rgb-color ]
      let r item 0 rgb-color / 255
      let g item 1 rgb-color / 255
      let b item 2 rgb-color / 255
      let v max (list r g b)
      let chroma v - (min (list r g b))
      let h 0
      let s ifelse-value (v = 0) [ 0 ] [ chroma / v ]
    
      if chroma > 0 [
        if v = r [
          set h ((g - b) / chroma) mod 6
        ]
        if v = g [
          set h (b - r) / chroma + 2
        ]
        if v = b [
          set h (r - g) / chroma + 4
        ]
        set h h / 6
      ]
      report map [ precision (? * 255) 3 ] (list h s v)
    end
    

    由于某种原因,它在除 44 之外的所有颜色编号上都完美匹配 extract-hsb...

    observer> show filter [ (extract-hsb ?) != (to-hsb extract-rgb ?) ] (n-values 140 [ ? ])
    observer: [44]
    

    不幸的是,看起来 NetLogo 在从 HSB 转换时会舍入 RGB 值(嗯,这实际上是有道理的)。这意味着您无法进行完美的 HSB->RGB->HSB 转换。比如使用上面的函数:

    observer> show to-hsb hsb 30 64 128
    observer: [30.547 63.75 128]
    

    哦,好吧。

    【讨论】:

      【解决方案2】:

      同意这个问题。同时,您可以通过approximate-rgb 传递列表以获得extract-hsb 将处理的颜色:

      to-report extract-hsb-from [ c ]
        report ifelse-value (is-list? c)
          [ extract-hsb approximate-rgb (item 0 c) (item 1 c) (item 2 c) ]
          [ extract-hsb c ]
      end
      

      编辑:但是,请参阅下面赛斯的评论以了解重大警告。)

      【讨论】:

      • 这有时会产生好的结果,有时会很糟糕,这取决于 NetLogo 的原生颜色空间中是否有接近输入颜色的东西。
      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2013-12-02
      相关资源
      最近更新 更多