module Data.Mesh where import Linear type Vec2 = V2 Double data Mesh2D = Rectangle Vec2 Vec2 | Line Vec2 Vec2 | Triangle Vec2 Vec2 Vec2 vertices :: Mesh2D -> [Vec2] vertices (Rectangle (V2 x y) (V2 w h)) = [V2 x y, V2 x (y+h), V2 (x+w) (y+h), V2 (x+w) y] vertices (Line o s) = [o, o + s] vertices (Triangle o a b) = [o, o+a, o+b] vertexLoop :: Mesh2D -> [Vec2] vertexLoop m = verts ++ [head verts] where verts = vertices m edges :: Mesh2D -> [(Vec2, Vec2)] edges m = let verts = vertices m in zip verts (tail . cycle $ verts) centeredRectangle :: Double -> Double -> Mesh2D centeredRectangle w h = Rectangle (V2 x y) (V2 w h) where x = negate (w/2) y = negate (h/2) rectangle :: Double -> Double -> Mesh2D rectangle w h = Rectangle 0 (V2 w h) horizontalLine, verticalLine :: Double -> Mesh2D horizontalLine length = Line (V2 ((-length)/2) 0) (V2 (length/2) 0) verticalLine length = Line (V2 ((-length)/2) 0) (V2 (length/2) 0) translate :: Vec2 -> Mesh2D -> Mesh2D translate r (Rectangle o s) = Rectangle (o+r) s translate r (Line o s) = Line (o+r) s translate r (Triangle o a b) = Triangle (o+r) a b