module Dyna.Gloss.Data.Picture
( Picture (..)
, Point, Vec, Path
, blank
, polygon
, line
, circle, thickCircle
, arc, thickArc
, text
, bitmap
, bitmapSection
, color
, translate, rotate, scale
, pictures
, lineLoop
, circleSolid
, arcSolid
, sectorWire
, rectanglePath
, rectangleWire
, rectangleSolid
, rectangleUpperPath
, rectangleUpperWire
, rectangleUpperSolid
)
where
import Data.VectorSpace
import Graphics.Gloss.Data.Bitmap
import Graphics.Gloss.Data.Color
import Graphics.Gloss.Data.Picture (Picture(..))
import Graphics.Gloss.Geometry.Angle
import Dyna.Gloss.Data.Point
import Dyna.Gloss.Data.Vec
blank :: Picture
blank :: Picture
blank = Picture
Blank
polygon :: Path -> Picture
polygon :: Path -> Picture
polygon = Path -> Picture
Polygon (Path -> Picture) -> (Path -> Path) -> Path -> Picture
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Vec -> (Float, Float)) -> Path -> Path
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Vec -> (Float, Float)
toTuple
line :: Path -> Picture
line :: Path -> Picture
line = Path -> Picture
Line (Path -> Picture) -> (Path -> Path) -> Path -> Picture
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Vec -> (Float, Float)) -> Path -> Path
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Vec -> (Float, Float)
toTuple
circle :: Float -> Picture
circle :: Float -> Picture
circle = Float -> Picture
Circle
thickCircle :: Float -> Float -> Picture
thickCircle :: Float -> Float -> Picture
thickCircle = Float -> Float -> Picture
ThickCircle
arc :: Float -> Float -> Float -> Picture
arc :: Float -> Float -> Float -> Picture
arc = Float -> Float -> Float -> Picture
Arc
thickArc :: Float -> Float -> Float -> Float -> Picture
thickArc :: Float -> Float -> Float -> Float -> Picture
thickArc = Float -> Float -> Float -> Float -> Picture
ThickArc
text :: String -> Picture
text :: String -> Picture
text = String -> Picture
Text
bitmap :: BitmapData -> Picture
bitmap :: BitmapData -> Picture
bitmap BitmapData
bitmapData = BitmapData -> Picture
Bitmap BitmapData
bitmapData
bitmapSection :: Rectangle -> BitmapData -> Picture
bitmapSection :: Rectangle -> BitmapData -> Picture
bitmapSection = Rectangle -> BitmapData -> Picture
BitmapSection
color :: Color -> Picture -> Picture
color :: Color -> Picture -> Picture
color = Color -> Picture -> Picture
Color
translate :: Vec -> Picture -> Picture
translate :: Vec -> Picture -> Picture
translate (Vec Float
x Float
y) = Float -> Float -> Picture -> Picture
Translate Float
x Float
y
rotate :: Float -> Picture -> Picture
rotate :: Float -> Picture -> Picture
rotate Float
x = Float -> Picture -> Picture
Rotate (Float
360 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
x)
scale :: Vec -> Picture -> Picture
scale :: Vec -> Picture -> Picture
scale (Vec Float
x Float
y) = Float -> Float -> Picture -> Picture
Scale Float
x Float
y
pictures :: [Picture] -> Picture
pictures :: [Picture] -> Picture
pictures = [Picture] -> Picture
Pictures
lineLoop :: Path -> Picture
lineLoop :: Path -> Picture
lineLoop Path
xs = Path -> Picture
line (Path -> Picture) -> Path -> Picture
forall a b. (a -> b) -> a -> b
$ case Path
xs of
[] -> []
(Vec
x:Path
xs) -> (Vec
xVec -> Path -> Path
forall a. a -> [a] -> [a]
:Path
xs) Path -> Path -> Path
forall a. [a] -> [a] -> [a]
++ [Vec
x]
circleSolid :: Float -> Picture
circleSolid :: Float -> Picture
circleSolid Float
r
= Float -> Float -> Picture
thickCircle (Float
rFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
2) Float
r
arcSolid :: Float -> Float -> Float -> Picture
arcSolid :: Float -> Float -> Float -> Picture
arcSolid Float
a1 Float
a2 Float
r
= Float -> Float -> Float -> Float -> Picture
thickArc Float
a1 Float
a2 (Float
rFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
2) Float
r
sectorWire :: Float -> Float -> Float -> Picture
sectorWire :: Float -> Float -> Float -> Picture
sectorWire Float
a1 Float
a2 Float
r_
= let r :: Float
r = Float -> Float
forall a. Num a => a -> a
abs Float
r_
in [Picture] -> Picture
Pictures
[ Float -> Float -> Float -> Picture
Arc Float
a1 Float
a2 Float
r
, Path -> Picture
line [Vec
0, Float
Scalar Vec
r Scalar Vec -> Vec -> Vec
forall v. VectorSpace v => Scalar v -> v -> v
*^ Float -> Vec
unitVecAtAngle (Float -> Float
degToRad Float
a1) ]
, Path -> Picture
line [Vec
0, Float
Scalar Vec
r Scalar Vec -> Vec -> Vec
forall v. VectorSpace v => Scalar v -> v -> v
*^ Float -> Vec
unitVecAtAngle (Float -> Float
degToRad Float
a2) ]
]
rectanglePath
:: Float
-> Float
-> Path
rectanglePath :: Float -> Float -> Path
rectanglePath Float
sizeX Float
sizeY
= let sx :: Float
sx = Float
sizeX Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
2
sy :: Float
sy = Float
sizeY Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
2
in [Float -> Float -> Vec
Vec (-Float
sx) (-Float
sy), Float -> Float -> Vec
Vec (-Float
sx) Float
sy, Float -> Float -> Vec
Vec Float
sx Float
sy, Float -> Float -> Vec
Vec Float
sx (-Float
sy)]
rectangleWire :: Float -> Float -> Picture
rectangleWire :: Float -> Float -> Picture
rectangleWire Float
sizeX Float
sizeY
= Path -> Picture
lineLoop (Path -> Picture) -> Path -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Path
rectanglePath Float
sizeX Float
sizeY
rectangleUpperWire :: Float -> Float -> Picture
rectangleUpperWire :: Float -> Float -> Picture
rectangleUpperWire Float
sizeX Float
sizeY
= Path -> Picture
lineLoop (Path -> Picture) -> Path -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Path
rectangleUpperPath Float
sizeX Float
sizeY
rectangleUpperPath :: Float -> Float -> Path
rectangleUpperPath :: Float -> Float -> Path
rectangleUpperPath Float
sizeX Float
sy
= let sx :: Float
sx = Float
sizeX Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
2
in [Float -> Float -> Vec
Vec (-Float
sx) Float
0, Float -> Float -> Vec
Vec (-Float
sx) Float
sy, Float -> Float -> Vec
Vec Float
sx Float
sy, Float -> Float -> Vec
Vec Float
sx Float
0]
rectangleSolid :: Float -> Float -> Picture
rectangleSolid :: Float -> Float -> Picture
rectangleSolid Float
sizeX Float
sizeY
= Path -> Picture
Polygon (Path -> Picture) -> Path -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Path
forall b a. (Fractional b, Fractional a) => a -> b -> [(a, b)]
rectanglePath' Float
sizeX Float
sizeY
where
rectanglePath' :: a -> b -> [(a, b)]
rectanglePath' a
sizeX b
sizeY =
let sx :: a
sx = a
sizeX a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
2
sy :: b
sy = b
sizeY b -> b -> b
forall a. Fractional a => a -> a -> a
/ b
2
in [(-a
sx, -b
sy), (-a
sx, b
sy), (a
sx, b
sy), (a
sx, -b
sy)]
rectangleUpperSolid :: Float -> Float -> Picture
rectangleUpperSolid :: Float -> Float -> Picture
rectangleUpperSolid Float
sizeX Float
sizeY = Path -> Picture
Polygon (Path -> Picture) -> Path -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Path
forall a b. (Fractional a, Num b) => a -> b -> [(a, b)]
path Float
sizeX Float
sizeY
where
path :: a -> b -> [(a, b)]
path a
sizeX b
sy
= let sx :: a
sx = a
sizeX a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
2
in [(-a
sx, b
0), (-a
sx, b
sy), (a
sx, b
sy), (a
sx, b
0)]