124 lines
3.4 KiB
Haskell
124 lines
3.4 KiB
Haskell
--{-# LANGUAGE TupleSections #-}
|
|
module Dodge.Room.Foreground
|
|
where
|
|
--import Dodge.Picture
|
|
--import Dodge.Base
|
|
import Picture
|
|
import Geometry
|
|
--import Geometry.Data
|
|
import Geometry.Vector3D
|
|
import Shape
|
|
|
|
import Data.List
|
|
import Data.Maybe
|
|
|
|
highDiagonalMesh
|
|
:: Point2
|
|
-> Point2
|
|
-> Float -- ^ width
|
|
-> Float -- ^ vertical distance between lines
|
|
-> Picture
|
|
highDiagonalMesh pa pb w d = setDepth (-0.2) $ pictures $
|
|
map (flip thickLine 3 . tflat2) (diagonalLinesRect pb pa w d (3*pi/4))
|
|
++
|
|
map (flip thickLine 3 . tflat2) (diagonalLinesRect pb pc (negate h) d (pi/4))
|
|
where
|
|
pc = pb +.+ w *.* normalizeV (vNormal (pb -.- pa))
|
|
h = dist pa pb
|
|
|
|
diagonalLinesRect
|
|
:: Point2
|
|
-> Point2
|
|
-> Float -- ^ width
|
|
-> Float -- ^ vertical distance between lines
|
|
-> Float
|
|
-> [(Point2,Point2)]
|
|
diagonalLinesRect pa pb w d ang = zip lhsPoints $ map findDiPoint lhsPoints
|
|
where
|
|
xVec = negate w *.* vNormal (normalizeV $ pb -.- pa)
|
|
diVec = rotateV ang xVec
|
|
pax = pa +.+ xVec
|
|
pbx = pb +.+ xVec
|
|
lhsPoints = divideLineExact d (pa -.- yN) (pb +.+ yN)
|
|
findDiPoint p = head . sortOn (dist p) $ catMaybes
|
|
[intersectLineLine' p (p +.+ diVec) pax pbx
|
|
,intersectSegLine pa pax p (p +.+ diVec)
|
|
,intersectSegLine pb pbx p (p +.+ diVec)
|
|
]
|
|
yN = d * 0.5 *.* normalizeV (pa -.- pb)
|
|
|
|
highBar :: Float -> Point2 -> Point2 -> Shape
|
|
highBar h x y = translateSHz h $ colorSH orange $ upperPrismPoly 5
|
|
[x +.+ n, y +.+ n, y -.- n, x -.- n]
|
|
where
|
|
n = 2.5 *.* normalizeV (vNormal (y -.- x))
|
|
|
|
highPipe :: Float -> Point2 -> Point2 -> Shape
|
|
highPipe h x y = colorSH orange $ prismPoly
|
|
(map (addZ (h + 5)) [x +.+ n2, y +.+ n2, y -.- n2, x -.- n2])
|
|
(map (addZ h) [x +.+ n, y +.+ n, y -.- n, x -.- n] )
|
|
where
|
|
n2 = 1.25 *.* normalizeV (vNormal (y -.- x))
|
|
n = 2.5 *.* normalizeV (vNormal (y -.- x))
|
|
|
|
girderZ
|
|
:: Float -- ^ height
|
|
-> Float -- ^ distance between cross bars
|
|
-> Float -- ^ width
|
|
-> Point2 -> Point2 -> Shape
|
|
girderZ h d w x y = colorSH red $ mconcat $
|
|
[ highBar h xt yt
|
|
, highBar h xb yb
|
|
]
|
|
<> zipWith (highBar (h- 5)) ps qs
|
|
where
|
|
n = w *.* normalizeV (vNormal $ y -.- x)
|
|
xb = x +.+ n
|
|
yb = y +.+ n
|
|
xt = x -.- n
|
|
yt = y -.- n
|
|
ps = divideLineExact d xb yb
|
|
qs = tail $ divideLineExact d xt yt
|
|
|
|
girderV
|
|
:: Float -- ^ height
|
|
-> Float -- ^ distance between cross bars
|
|
-> Float -- ^ width
|
|
-> Point2 -> Point2 -> Shape
|
|
girderV h d w x y = colorSH red $ mconcat $
|
|
[ highBar h xt yt
|
|
, highBar h xb yb
|
|
]
|
|
<> zipWith (highBar (h- 5)) ps qs
|
|
where
|
|
n = w *.* normalizeV (vNormal $ y -.- x)
|
|
xb = x +.+ n
|
|
yb = y +.+ n
|
|
xt = x -.- n
|
|
yt = y -.- n
|
|
ps = evenDouble $ divideLineExact d xb yb
|
|
qs = head qs' : evenDouble(tail qs')
|
|
where
|
|
qs' = divideLineExact d xt yt
|
|
evenDouble (a:_:xs) = a:a:evenDouble xs
|
|
evenDouble xs = xs
|
|
|
|
girder
|
|
:: Float -- ^ height
|
|
-> Float -- ^ distance between cross bars
|
|
-> Float -- ^ width
|
|
-> Point2 -> Point2 -> Shape
|
|
girder h d w x y = colorSH red $ mconcat $
|
|
[ highBar h xt yt
|
|
, highBar h xb yb
|
|
]
|
|
<> zipWith (highBar (h- 5)) ps qs
|
|
where
|
|
n = w *.* normalizeV (vNormal $ y -.- x)
|
|
xb = x +.+ n
|
|
yb = y +.+ n
|
|
xt = x -.- n
|
|
yt = y -.- n
|
|
ps = divideLineExact d xb yb
|
|
qs = divideLineExact d xt yt
|