You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.2KB

  1. module ColorWheel.HSVTransformations where
  2. import ColorWheel.Radian
  3. import qualified ColorWheel.Cordinates as Cordinate
  4. import ColorWheel.RGBDefinition
  5. import Data.Fixed
  6. -- hsv2rgb 207 148 120 75 == RGB {r = 19.125, g = 191.25, b = 19.125}
  7. hsv2rgbFromXY :: Float -> Float -> Float -> Float -> IO RGB
  8. -- degree can be calculated from cordnates
  9. hsv2rgbFromXY cordinateX cordinateY degree value =
  10. do
  11. let distanceFromOrigin = ( ((sqrt $ (cordinateX ^ 2) + (cordinateY ^ 2))/255) * 10)
  12. let distanceFromOriginAsPercent = fromIntegral ((floor distanceFromOrigin) * 10) / 100
  13. hsv2rgb (degree+90) distanceFromOriginAsPercent value
  14. calculateC :: Float -> Float -> Float
  15. calculateC v s = v * s
  16. calculateM :: Float -> Float -> Float
  17. calculateM v c = v - c
  18. calculateX :: Float -> Float -> Float
  19. calculateX degree c = c * ( 1 - (abs $ (mod' (degree / 60) (2)) - 1))
  20. to255Percent :: Float -> Float
  21. to255Percent value = (255 * (value*100)) / 100
  22. -- parameters actually are; H S V
  23. -- H is degree
  24. -- S is sue
  25. -- V is value
  26. hsv2rgb :: Float -> Float -> Float -> IO RGB
  27. hsv2rgb degree distanceFromOriginAsPercent value =
  28. do
  29. let saturation = distanceFromOriginAsPercent
  30. let valueAs255 = to255Percent value
  31. let radian = toRadianFloor degree
  32. let v = valueAs255
  33. let s = saturation
  34. let c = calculateC v s
  35. let m = calculateM v c
  36. let x = calculateX degree c
  37. return $ cmxToRGB radian c m x
  38. cmxToRGB :: Int -> Float -> Float -> Float -> RGB
  39. cmxToRGB radian c m x = do
  40. case radian of
  41. 1 -> RGB { r = c+m, g = x+m, b = m }
  42. 2 -> RGB { r = x+m, g = c+m, b = m }
  43. 3 -> RGB { r = m, g = c+m, b = x+m }
  44. 4 -> RGB { r = m, g = x+m, b = c+m }
  45. 5 -> RGB { r = x+m, g = m, b = c+m }
  46. 6 -> RGB { r = c+m, g = m, b = x+m }