|
- module ColorWheel.HSVTransformations where
-
- import ColorWheel.Radian
- import qualified ColorWheel.Cordinates as Cordinate
- import ColorWheel.RGBDefinition
- import Data.Fixed
-
- -- hsv2rgb 207 148 120 75 == RGB {r = 19.125, g = 191.25, b = 19.125}
-
- hsv2rgbFromXY :: Float -> Float -> Float -> Float -> IO RGB
- -- degree can be calculated from cordnates
- hsv2rgbFromXY cordinateX cordinateY degree value =
- do
- let distanceFromOrigin = ( ((sqrt $ (cordinateX ^ 2) + (cordinateY ^ 2))/255) * 10)
- let distanceFromOriginAsPercent = fromIntegral ((floor distanceFromOrigin) * 10) / 100
- hsv2rgb (degree+90) distanceFromOriginAsPercent value
-
-
-
-
- calculateC :: Float -> Float -> Float
- calculateC v s = v * s
-
- calculateM :: Float -> Float -> Float
- calculateM v c = v - c
-
- calculateX :: Float -> Float -> Float
- calculateX degree c = c * ( 1 - (abs $ (mod' (degree / 60) (2)) - 1))
-
-
- to255Percent :: Float -> Float
- to255Percent value = (255 * (value*100)) / 100
-
- -- parameters actually are; H S V
-
- -- H is degree
- -- S is sue
- -- V is value
-
- hsv2rgb :: Float -> Float -> Float -> IO RGB
- hsv2rgb degree distanceFromOriginAsPercent value =
- do
-
- let saturation = distanceFromOriginAsPercent
-
- let valueAs255 = to255Percent value
- let radian = toRadianFloor degree
-
-
- let v = valueAs255
- let s = saturation
-
- let c = calculateC v s
- let m = calculateM v c
- let x = calculateX degree c
-
- return $ cmxToRGB radian c m x
-
-
-
- cmxToRGB :: Int -> Float -> Float -> Float -> RGB
- cmxToRGB radian c m x = do
- case radian of
- 1 -> RGB { r = c+m, g = x+m, b = m }
- 2 -> RGB { r = x+m, g = c+m, b = m }
- 3 -> RGB { r = m, g = c+m, b = x+m }
- 4 -> RGB { r = m, g = x+m, b = c+m }
- 5 -> RGB { r = x+m, g = m, b = c+m }
- 6 -> RGB { r = c+m, g = m, b = x+m }
|