Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

69 rindas
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 }