Fix wall zoning bug

This commit is contained in:
jgk
2021-08-16 16:54:27 +02:00
parent c58ee6d56c
commit 37db056f23
4 changed files with 63 additions and 11 deletions
+41 -9
View File
@@ -9,15 +9,15 @@ import Data.Foldable
import qualified Data.IntMap.Strict as IM
import qualified Data.IntSet as IS
foldl2'
:: (b -> a -> a -> b)
-> b
-> [a]
-> b
foldl2' f s (t:ts) = fst $ foldl' g (s, t) ts
where
g (r,x) y = (f r x y,y)
foldl2' _ s _ = s
--foldl2'
-- :: (b -> a -> a -> b)
-- -> b
-- -> [a]
-- -> b
--foldl2' f s (t:ts) = fst $ foldl' g (s, t) ts
-- where
-- g (r,x) y = (f r x y,y)
--foldl2' _ s _ = s
sortArguments
:: Ord a
@@ -82,6 +82,35 @@ increasingInterval x y
-- point.
ddaExt :: Float -> V2 Float -> V2 Float -> IM.IntMap IS.IntSet
ddaExt s sp@(V2 sx sy) ep@(V2 ex ey)
| x1 <= x2 = addsp . addys . IM.fromDistinctAscList $ zip [x1 .. x2]
$ map (IS.singleton . divTo s) [x1y,x1y+ydx..]
| otherwise = addsp . addys . IM.fromDistinctAscList $ zip [x2-1 .. x1-1]
$ map (IS.singleton . divTo s) [x2y,x2y+ydx..]
where
addsp im = let V2 x y = sizeZoneOfPoint' s sp
in insertXY im (x,y)
x1 = divTo s sx
x2 = divTo s ex
x1y = fx' sp ep $ s * (fromIntegral x1)
x2y = fx' sp ep $ s * (fromIntegral x2)
ydx = s * ydx' sp ep
addys m = add2s m ypairs
y1 = divTo s sy
y2 = divTo s ey
y1x = fy' sp ep $ s * (fromIntegral y1)
y2x = fy' sp ep $ s * (fromIntegral y2)
xdy = s * xdy' sp ep
ypairs
| y1 <= y2 = zip (map (divTo s) [y1x,y1x+xdy..])
[y1 .. y2]
| otherwise = zip (map (divTo s) [y2x,y2x+xdy..])
[y2-1 .. y1-1]
-- | Determines which horizontal and vertical lines on a grid are crossed by a
-- line. For each adds the x-y index of the square to the right or above the
-- crossed grid line. Also adds the index of the square containing the start
-- point.
ddaExtExt :: Float -> V2 Float -> V2 Float -> IM.IntMap IS.IntSet
ddaExtExt s sp@(V2 sx sy) ep@(V2 ex ey)
| x1 <= x2 = addys . IM.fromDistinctAscList $ zip [x1 .. x2]
$ map (IS.singleton . divTo s) [x1y,x1y+ydx..]
| otherwise = addys . IM.fromDistinctAscList $ zip [x2-1 .. x1-1]
@@ -137,6 +166,9 @@ add2s imis = foldl'
(\m (k,x) -> IM.insertWith (\_ old -> IS.insert x old) k (IS.singleton x) m)
imis
insertXY :: IM.IntMap IS.IntSet -> (Int,Int) -> IM.IntMap IS.IntSet
insertXY m (k,x) = IM.insertWith (\_ old -> IS.insert x old) k (IS.singleton x) m
addV2s :: IM.IntMap IS.IntSet -> [V2 Int] -> IM.IntMap IS.IntSet
{-# INLINE addV2s #-}
addV2s imis = foldl'