Refactor wall points from lists to pairs
This commit is contained in:
+9
-9
@@ -63,26 +63,26 @@ yourItemRef w = (creatures . ix (_yourID w) . crInv . ix (_crInvSel (you w)))
|
||||
wallNormal :: Wall -> Point2
|
||||
wallNormal wl = normalizeV . vNormal $ a -.- b
|
||||
where
|
||||
(a:b:_) = _wlLine wl
|
||||
(a,b) = _wlLine wl
|
||||
|
||||
wallsOnLine :: Point2 -> Point2 -> IM.IntMap Wall -> [Wall]
|
||||
wallsOnLine p1 p2 ws = hitWalls
|
||||
where
|
||||
hitPoint w = intersectSegSeg' p1 p2 (_wlLine w !! 0) (_wlLine w !! 1)
|
||||
hitPoint w = intersectSegSeg' p1 p2 (fst $ _wlLine w) (snd $ _wlLine w)
|
||||
hitWalls = filter (isJust . hitPoint) (IM.elems ws)
|
||||
|
||||
wallOnLine :: Point2 -> Point2 -> IM.IntMap Wall -> Maybe Wall
|
||||
wallOnLine p1 p2 ws
|
||||
= listToMaybe $ sortBy f hitWalls
|
||||
where
|
||||
hitPoint w = intersectSegSeg' p1 p2 (_wlLine w !! 0) (_wlLine w !! 1)
|
||||
hitPoint w = intersectSegSeg' p1 p2 (fst $ _wlLine w) (snd $ _wlLine w)
|
||||
hitWalls = filter (isJust . hitPoint) (IM.elems ws)
|
||||
f w1 w2 = compare (magV (p1 -.- fromJust (hitPoint w1))) (magV (p1 -.- fromJust (hitPoint w2)))
|
||||
|
||||
wallsOnCirc :: Point2 -> Float -> IM.IntMap Wall -> [Wall]
|
||||
wallsOnCirc p r wls = IM.elems $ IM.filter f wls
|
||||
where
|
||||
f wl = circOnSeg (_wlLine wl !! 0) (_wlLine wl !! 1) p r
|
||||
f wl = circOnSeg (fst $ _wlLine wl) (snd $ _wlLine wl) p r
|
||||
|
||||
|
||||
allWalls :: World -> IM.IntMap Wall
|
||||
@@ -267,7 +267,7 @@ collideCircWalls' p1 p2 rad ws
|
||||
) ws
|
||||
where
|
||||
f (a,_) = magV (p1 -.- a)
|
||||
shiftByRad (a:b:_) = map ((rad *.* normalizeV (vNormal $ a -.- b)) +.+)
|
||||
shiftByRad (a,b) = map ((rad *.* normalizeV (vNormal $ a -.- b)) +.+)
|
||||
[a +.+ rad *.* normalizeV (a -.-b)
|
||||
,b +.+ rad *.* normalizeV (b -.-a)
|
||||
]
|
||||
@@ -284,7 +284,7 @@ collidePointWallsNorm p1 p2 ws
|
||||
= listToMaybe
|
||||
. sortOn f
|
||||
. IM.elems
|
||||
$ IM.mapMaybe (( \(x:y:_) -> intersectSegSeg' p1 p2 x y <&> (, vNormal $ x -.- y ) )
|
||||
$ IM.mapMaybe (( \(x,y) -> intersectSegSeg' p1 p2 x y <&> (, vNormal $ x -.- y ) )
|
||||
. _wlLine) ws
|
||||
where
|
||||
f (a,_) = magV (p1 -.- a)
|
||||
@@ -297,7 +297,7 @@ collidePointWallsCol p1 p2 ws
|
||||
. sortOn f
|
||||
. IM.elems
|
||||
$ IM.mapMaybe ( (\(m, c) -> m <&> (, c))
|
||||
. (\w -> (intersectSegSeg' p1 p2 (_wlLine w !! 0) (_wlLine w !! 1), _wlColor w))) ws
|
||||
. (\w -> (intersectSegSeg' p1 p2 (fst $ _wlLine w) (snd $ _wlLine w), _wlColor w))) ws
|
||||
where
|
||||
f (a,_) = magV (p1 -.- a)
|
||||
{- | Looks for first collision of a point with walls.
|
||||
@@ -312,7 +312,7 @@ collidePointWallsNormCol p1 p2 ws
|
||||
where
|
||||
f (a,_,_) = magV $ p1 -.- a
|
||||
m w =
|
||||
let (x:y:_) = _wlLine w
|
||||
let (x,y) = _wlLine w
|
||||
in intersectSegSeg' p1 p2 x y <&> (, vNormal (x -.- y), _wlColor w)
|
||||
-- | Returns the first creature, if any, that a point intersects with.
|
||||
collidePointCreatures :: Point2 -> Point2 -> World -> Maybe Int
|
||||
@@ -372,7 +372,7 @@ collidePointCrsWithoutPoint cid p1 p2 w
|
||||
{- | Test if a circle collides with any wall. -}
|
||||
circOnSomeWall :: Point2 -> Float -> World -> Bool
|
||||
circOnSomeWall p rad w
|
||||
= any (\(x:y:_) -> circOnSeg x y p rad)
|
||||
= any (\(x,y) -> circOnSeg x y p rad)
|
||||
. fmap _wlLine
|
||||
. IM.elems
|
||||
$ wallsNearPoint p w
|
||||
|
||||
Reference in New Issue
Block a user