module Render where

import Shape

-- | A window specifies what part of the world to render and at which
--   resolution.
data Window = Window
  { bottomLeft :: Point
  , topRight   :: Point
  , resolution :: (Int, Int)
  }

defaultWindow :: Window
defaultWindow = Window
  { bottomLeft = point (-1.5) (-1.5)
  , topRight   = point 1.5 1.5
  , resolution = (25, 25)
--  , resolution = (50, 50) -- for larger terminal windows
  }

-- | Generate a list of evenly spaces samples between two values.
samples :: Double -> Double -> Int -> [Double]
samples x0 x1 n = take n $ iterate (+dx) x0
  where
    dx = (x1 - x0) / fromIntegral (n - 1)

-- | Generate the matrix of points corresponding to the pixels of a window.
pixels :: Window -> [[Point]]
pixels (Window p0 p1 (w,h)) =
  [ [ point x y | x <- samples (ptX p0) (ptX p1) w ]
  | y <- reverse $ samples (ptY p0) (ptY p1) h
  ]

-- | Render a shape in a given window.
render :: Window -> Shape -> String
render win sh = unlines $ map (concatMap putPixel) (pixels win)
  where
    putPixel p | p `inside` sh = "[]"
               | otherwise     = "  "