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.