{- | Compound, universal pictures. Creates uniform sizes and commands for the Dodge modules. -} module Dodge.Picture where import Geometry import Geometry.Vector3D import Geometry.Data import Picture -- {- | -- Current thickness: 2 -} -- thickLine :: [Point2] -> Picture -- thickLine = lineOfThickness 2 {- | Current thickness: 3 -} vThickLine :: [Point2] -> Picture vThickLine = lineOfThickness 3 {- | Current thickness: 6 -} vvThickLine :: [Point2] -> Picture vvThickLine = lineOfThickness 6 -- shit this is ugly lineOfThickness :: Float -> [Point2] -> Picture lineOfThickness t = pictures . f where f (x:y:ys) | x == y = f (x:ys) | otherwise = polygon [x +.+ n x y, x -.- n x y, y -.- n x y, y +.+ n x y] : f (y:ys) f _ = [] n a b = (t*0.5) *.* errorNormalizeV 42 (vNormal (a -.- b)) wedgeOfThickness :: Float -> Point2 -> Point2 -> Picture wedgeOfThickness t x y | x == y = blank | otherwise = pictures [uncurry translate x $ circleSolid (0.5*t) ,polygon [x +.+ n x y, x -.- n x y, y] ] where n a b = (t*0.5) *.* errorNormalizeV 4200 (vNormal (a -.- b)) verticalPipe :: Float -> Color -> Point2 -> Float -> Float -> Picture verticalPipe w col (xx,xy) za zb = pictures $ map (poly3Col . f) ps where x = (xx,xy,0) xs = map (\(a,b) -> x +.+.+ (a,b,za)) [(w,0),(0,w),(-w,0),(0,-w)] ps = zip xs (tail xs ++ [head xs]) f (a,b) = map f' [a,b,g b,g a] g :: Point3 -> Point3 g (a,b,_) = (a,b,zb) f' a = (a,col) expandLine :: Point3 -> Point3 -> Point3 -> [Point3] expandLine v x y = [x -.-.- v, y -.-.- v, y +.+.+ v, x +.+.+ v]