module World ( Segment , World(..) , initialWorld , normaliseWorld) where import Graphics.Gloss import Geometry.Randomish import Geometry.Segment import qualified Array as A import Array (Array) -- We keep this unpacked so we can use unboxed vector. -- index, x1, y1, x2, y2 data World = World { worldSegments :: Array 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 = A.zipWith3 makePoint (A.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 = A.map (translateSegment (-px) (-py)) $ worldSegments world segments_split = splitSegmentsOnY 0 segments_trans in world { worldSegments = segments_split }