Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

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