gloss-examples-1.3.1.1: Visibility/World.hs
module World
( Segment
, World(..)
, initialWorld
, normaliseWorld)
where
import Graphics.Gloss
import Geometry.Randomish
import Geometry.Segment
import qualified Data.Vector.Unboxed as V
-- We keep this unpacked so we can use unboxed vector.
-- index, x1, y1, x2, y2
data World
= World
{ worldSegments :: V.Vector Segment }
-- | Generate the initial world.
initialWorld :: IO World
initialWorld
= do let n = 100
let minZ = -300
let maxZ = 300
let minDelta = -100
let maxDelta = 100
let centers = randomishPoints 1234 n minZ maxZ
let deltas = randomishPoints 4321 n minDelta maxDelta
let makePoint n' (cX, cY) (dX, dY)
= (n', (cX, cY), (cX + dX, cY + dY))
let segs = V.zipWith3 makePoint (V.enumFromTo 0 (n - 1)) centers deltas
return $ World segs
-- | Normalise the world so that the given point is at the origin,
-- and split segements that cross the y=0 line.
normaliseWorld :: Point -> World -> World
normaliseWorld (px, py) world
= let segments_trans = V.map (translateSegment (-px) (-py))
$ worldSegments world
segments_split = splitSegmentsOnY 0 segments_trans
in world { worldSegments = segments_split }