在NetLogo中从RGB颜色获取HSB值 [英] Get HSB values from RGB color in NetLogo
问题描述
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屋!