module Graphics.Chalkboard.Shapes where
import Graphics.Chalkboard.Board
import Graphics.Chalkboard.Utils
import Graphics.Chalkboard.Types
import Control.Applicative
circle :: Board Bool
circle = (\ (x,y) -> x*x + y*y <= 0.5 * 0.5) <$> coord
vbar :: Board Bool
vbar = (\ (_x,y) -> y <= 0.5 && y >= 0.5) <$> coord
hbar :: Board Bool
hbar = (\ (x,_y) -> x <= 0.5 && x >= 0.5) <$> coord
square :: Board Bool
square = liftA2 (&&) vbar hbar
checker :: Board Bool
checker = (\ (x,y) -> even ((floor x + floor y) :: Int)) <$> coord
straightline :: (Point,Point) -> R -> Board Bool
straightline ((x1,y1),(x2,y2)) width = (\ (x,y) ->
( let u = intervalOnLine ((x1,y1),(x2,y2)) (x,y)
in u >= 0
&& u <= 1
&& distance (lerp (x1,y1) (x2,y2) u) (x,y) <= width
)) <$> coord
functionline :: (R -> Point) -> R -> Int -> Board Bool
functionline line width steps = stack
[ straightline (p1,p2) width
| (p1,p2) <- zip samples (tail samples)
] `over` stack
[ dotAt p | p <- tail (init samples) ]
where
samples = map line (outerSteps steps)
dotAt p = move p $ scale (width * 2) circle
arrowhead :: Point -> Radian -> R -> Board Bool
arrowhead p rad sz = move p $ rotate rad $ scale sz $ (\ (x,y) -> y >= 0 && y <= 1 && abs x * 2 <= 1 y) <$> coord