NetLogo提供extract-hsb
,获取NetLogo颜色的hsb值。但是,它似乎不适用于使用rgb列表指定的颜色,即使rgb列表是NetLogo中的合法颜色。所以我的问题是,人们怎么可能手动这样做?
顺便说一下,我已经向NetLogo添加了一个功能请求,以适当地扩展extract-hsb
:https://github.com/NetLogo/NetLogo/issues/643
答案 0 :(得分:3)
以下是基于wikipedia's definition of HSB的extract-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评论,但需要注意。)