在NetLogo中从RGB颜色获取HSB值

时间:2014-08-31 06:44:30

标签: colors netlogo

NetLogo提供extract-hsb,获取NetLogo颜色的hsb值。但是,它似乎不适用于使用rgb列表指定的颜色,即使rgb列表是NetLogo中的合法颜色。所以我的问题是,人们怎么可能手动这样做?

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

2 个答案:

答案 0 :(得分:3)

以下是基于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

它完全匹配extract-hsb所有颜色数字,除了44由于某种原因......

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

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

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

哦,好吧。

答案 1 :(得分:1)

同意这个问题。同时,您可以通过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

编辑:请参阅下面的Seth评论,但需要注意。)