47 lines
1 KiB
Nim
47 lines
1 KiB
Nim
import math, colors
|
|
|
|
proc hsbToRgb*(h:float64, s:float64, v:float64): Color =
|
|
var
|
|
H = h
|
|
R = 0'f64
|
|
G = 0'f64
|
|
B = 0'f64
|
|
|
|
while H < 0'f64:
|
|
H = H + 360'f64
|
|
while H >= 360'f64:
|
|
H = H - 360'f64
|
|
|
|
if v <= 0'f64:
|
|
R = 0'f64
|
|
G = 0'f64
|
|
B = 0'f64
|
|
elif s <= 0'f64:
|
|
R = v
|
|
G = v
|
|
B = v
|
|
else:
|
|
let
|
|
hf = H / 60'f64
|
|
i = int(floor(hf))
|
|
f = hf - float64(i)
|
|
pv = v * (1'f64 - s)
|
|
qv = v * (1'f64 - s * f)
|
|
tv = v * (1'f64 - (1'f64 - f))
|
|
|
|
case i:
|
|
of 0:
|
|
R = v; G = tv; B = pv
|
|
of 1: R = qv; G = v; B = pv
|
|
of 2: R = pv; G = v; B = tv
|
|
of 3: R = pv; G = qv; B = v
|
|
of 4: R = tv; G = pv; B = v
|
|
of 5: R = v; G = pv; B = qv
|
|
of 6: R = v; G = tv; B = pv
|
|
of -1: R = v; G = pv; B = qv
|
|
else:
|
|
R = v; G = v; B = v
|
|
|
|
result = rgb(clamp(int(R*255), 0, 255),
|
|
clamp(int(G*255), 0, 255),
|
|
clamp(int(B*255), 0, 255))
|