在NetLogo中从RGB颜色获取HSB值 [英] Get HSB values from RGB color in NetLogo

查看:344
本文介绍了在NetLogo中从RGB颜色获取HSB值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

NetLogo提供 extract-hsb 获取NetLogo颜色的hsb值。但是,它似乎不工作在用rgb列表指定的颜色,即使rgb列表是NetLogo中的合法颜色。



我已经向NetLogo添加了一个功能请求来扩展 extract- hsb https://github.com/NetLogo/NetLogo/issues / 643

解决方案

这里是 extract-hsb 根据维基百科对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 rgb)
let chroma v - (min(list rgb))
let h 0
让s ifelse-value )[0] [chroma / v]

如果chroma> 0 [
if v = r [
set h((g - b)/ chroma)mod 6
]
如果v = g [
set h - r)/ chroma + 2
]
如果v = b [
set h(r - g)/ chroma + 4
]
set hh / 6
]
report map [precision(?* 255)3](list hsv)
end

除了44之外,由于某种原因,它匹配所有颜色数字上的 extract-hsb ...

  observer> show filter [(extract-hsb?)!=(to-hsb extract-rgb?)](n值140 [?])
观察者:
不幸的是,看起来NetLogo在从HSB转换时舍入RGB值(好吧,这实际上是有意义的)。这意味着你不能做一个完美的HSB-> RGB-> HSB转换。例如,使用上面的函数:

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


NetLogo provides an extract-hsb that gets the hsb values for a NetLogo color. However, it doesn't appear to work on colors specified with an rgb list, even though rgb lists are legitimate colors in NetLogo. So my question is, how might one go about doing this manually?

BTW, I've added a feature request to NetLogo to extend extract-hsb appropriately: https://github.com/NetLogo/NetLogo/issues/643

解决方案

Here is a generalization of extract-hsb based on wikipedia's definition of HSB (note that V and B are the same thing)

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

It matches extract-hsb perfectly on all color numbers except 44 for some reason...

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

Unfortunately, it looks like NetLogo rounds RGB values when converting from HSB (well, this actually makes sense). This means that you can't do a perfect HSB->RGB->HSB conversion. For example, using the function above:

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

Oh well.

这篇关于在NetLogo中从RGB颜色获取HSB值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆