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 }