Advertisement
ZornTaov

code that looks fun

Aug 14th, 2010
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.23 KB | None | 0 0
  1. -- HSL(bi-hexcone) color conversion
  2.  
  3. local abs = math.abs
  4. local min = math.min
  5. local tiny = -math.huge
  6.  
  7. module "color_conv"
  8.  
  9. local function max_sel(...)
  10. local mi, mv = -tiny
  11. for i,v in ipairs{...} do
  12. if v > mv then mi = i ; mv = v end
  13. end
  14. return mi, mv
  15. end
  16.  
  17. function rgb2hsl(r, g, b)
  18. local r, g, b = r / 256, g / 256, b / 256
  19. local m = min(r, g, b)
  20. local i, M = max_sel(r, g, b)
  21. local C = M - m
  22. local l = .5 * (M + m)
  23. local h,s
  24. if C == 0 then
  25. h = 0
  26. s = 0
  27. else
  28. if i == 1 then
  29. h = (g-b) / C % 6
  30. elseif i == 2 then
  31. h = (b-r) / C + 2
  32. elseif i == 3 then
  33. h = (r-g) / C + 4
  34. end
  35. h = h / 6
  36.  
  37. if l <= 1/2 then
  38. s = C / (2 * l)
  39. else
  40. s = C / (2 - 2 * l)
  41. end
  42. end
  43. return h,s,l
  44. end
  45.  
  46. function hsl2rgb(h, s, l)
  47. if s == 0 then
  48. return l, l, l
  49. end
  50.  
  51. local C
  52. if l <= 1/2 then
  53. C = 2 * l * s
  54. else
  55. C = (2 - 2 * l) * s
  56. end
  57.  
  58. local h = h * 6
  59. local X = C * (1 - abs(h % 2 - 1))
  60. local m = l - .5 * C
  61. local r, g, b
  62.  
  63. if h < 1 then r = C+m ; g = X+m ; b = m
  64. elseif h < 2 then g = C+m ; r = X+m ; b = m
  65. elseif h < 3 then g = C+m ; b = X+m ; r = m
  66. elseif h < 4 then b = C+m ; g = X+m ; r = m
  67. elseif h < 5 then b = C+m ; r = X+m ; g = m
  68. else r = C+m ; b = X+m ; g = m
  69. end
  70.  
  71. return r * 256, g * 256, b * 256
  72. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement