Make Gif animation more nice, TODO: IMPROVE CODE
This commit is contained in:
parent
4936023c14
commit
87393af71a
@ -102,28 +102,41 @@ grahamGetCH vs =
|
|||||||
|
|
||||||
-- |Compute all steps of the graham scan algorithm to allow
|
-- |Compute all steps of the graham scan algorithm to allow
|
||||||
-- visualizing it.
|
-- visualizing it.
|
||||||
grahamGetCHSteps :: [PT] -> [[PT]]
|
-- Whether the upper or lower hull is computed depends on the input.
|
||||||
grahamGetCHSteps vs =
|
grahamGetCHSteps :: Int -> [PT] -> [PT] -> [[PT]]
|
||||||
(++) (rmdups . reverse . g ((* 2) . length $ vs) lH $ lHRest)
|
grahamGetCHSteps c xs' ys'
|
||||||
(rmdups . init . reverse . g ((* 2) . length $ vs) uH $ uHRest)
|
| c >= 0 = scanH 0 xs' ys' : grahamGetCHSteps (c - 1) xs' ys'
|
||||||
|
| otherwise = []
|
||||||
where
|
where
|
||||||
sortedXY = fmap p2 . sortLex . fmap unp2 $ vs
|
scanH c' hs@(x:y:z:xs) (r':rs')
|
||||||
(lH, lHRest) = first reverse . splitAt 3 $ sortedXY
|
| c' >= c = hs
|
||||||
|
| notcw z y x = scanH (c' + 1) (r':hs) rs'
|
||||||
|
| otherwise = scanH (c' + 1) (x:z:xs) (r':rs')
|
||||||
|
scanH c' hs@(x:y:z:xs) []
|
||||||
|
| c' >= c = hs
|
||||||
|
| notcw z y x = hs
|
||||||
|
| otherwise = scanH (c' + 1) (x:z:xs) []
|
||||||
|
scanH c' hs (r':rs')
|
||||||
|
| c' >= c = hs
|
||||||
|
| otherwise = scanH (c' + 1) (r':hs) rs'
|
||||||
|
scanH _ xs _ = xs
|
||||||
|
|
||||||
|
|
||||||
|
grahamGetUpperHullSteps :: [PT] -> [[PT]]
|
||||||
|
grahamGetUpperHullSteps vs =
|
||||||
|
(++) [getLastX 2 sortedXY] . rmdups . init . reverse . grahamGetCHSteps ((* 2) . length $ vs) uH $
|
||||||
|
uHRest
|
||||||
|
where
|
||||||
|
sortedXY = fmap p2 . sortLex . fmap unp2 $ vs
|
||||||
(uH, uHRest) = first reverse . splitAt 3 . reverse $ sortedXY
|
(uH, uHRest) = first reverse . splitAt 3 . reverse $ sortedXY
|
||||||
g c xs' ys'
|
|
||||||
| c >= 0 = scanH 0 xs' ys' : g (c - 1) xs' ys'
|
|
||||||
| otherwise = []
|
grahamGetLowerHullSteps :: [PT] -> [[PT]]
|
||||||
where
|
grahamGetLowerHullSteps vs =
|
||||||
scanH c' hs@(x:y:z:xs) (r':rs')
|
(++) [take 2 sortedXY] . rmdups . reverse . grahamGetCHSteps ((* 2) . length $ vs) lH $ lHRest
|
||||||
| c' >= c = hs
|
where
|
||||||
| notcw z y x = scanH (c' + 1) (r':hs) rs'
|
sortedXY = fmap p2 . sortLex . fmap unp2 $ vs
|
||||||
| otherwise = scanH (c' + 1) (x:z:xs) (r':rs')
|
(lH, lHRest) = first reverse . splitAt 3 $ sortedXY
|
||||||
scanH _ [x,y] [] = [y,x]
|
|
||||||
scanH c' hs@(x:y:z:xs) []
|
{- - (++) (rmdups . reverse . g ((* 2) . length $ vs) lH $ lHRest) -}
|
||||||
| c' >= c = hs
|
{- - (rmdups . init . reverse . g ((* 2) . length $ vs) uH $ uHRest) -}
|
||||||
| notcw z y x = hs
|
|
||||||
| otherwise = scanH (c' + 1) (x:z:xs) []
|
|
||||||
scanH c' hs (r':rs')
|
|
||||||
| c' >= c = hs
|
|
||||||
| otherwise = scanH (c' + 1) (r':hs) rs'
|
|
||||||
scanH _ xs _ = xs
|
|
||||||
|
@ -18,11 +18,16 @@ gifDiag p xs =
|
|||||||
fmap (\x -> x <> nonChDiag) .
|
fmap (\x -> x <> nonChDiag) .
|
||||||
flip (++)
|
flip (++)
|
||||||
[mkDiag (convexHullPointsText `mappend`
|
[mkDiag (convexHullPointsText `mappend`
|
||||||
convexHullLines `mappend`
|
|
||||||
convexHullPoints)
|
convexHullPoints)
|
||||||
p xs] $
|
p xs <> lastUpperHull <> lastLowerHull] $
|
||||||
(convexHullLinesInterval p xs)
|
(lowerHullList ++
|
||||||
|
((<> lastLowerHull) <$>
|
||||||
|
upperHullList))
|
||||||
where
|
where
|
||||||
|
upperHullList = convexHullLinesIntervalUpper p xs
|
||||||
|
lastUpperHull = last upperHullList
|
||||||
|
lowerHullList = convexHullLinesIntervalLower p xs
|
||||||
|
lastLowerHull = last lowerHullList
|
||||||
-- add the x-axis and the other default stuff
|
-- add the x-axis and the other default stuff
|
||||||
nonChDiag =
|
nonChDiag =
|
||||||
mconcat .
|
mconcat .
|
||||||
|
@ -85,19 +85,30 @@ convexHullLines = Diag chl
|
|||||||
vtf = filter (inRange (dX p) (dY p)) vt
|
vtf = filter (inRange (dX p) (dY p)) vt
|
||||||
|
|
||||||
|
|
||||||
-- |Same as showConvexHullLines, except that it returns an array
|
convexHullLinesIntervalLower :: DiagProp -> [PT] -> [Diagram Cairo R2]
|
||||||
-- of diagrams with each step of the algorithm.
|
convexHullLinesIntervalLower p xs =
|
||||||
-- Unfortunately this is very difficult to implement as a Diag (TODO).
|
fmap mkChDiag (grahamGetLowerHullSteps xs)
|
||||||
convexHullLinesInterval :: DiagProp -> [PT] -> [Diagram Cairo R2]
|
|
||||||
convexHullLinesInterval p xs =
|
|
||||||
fmap mkChDiag (grahamGetCHSteps xs)
|
|
||||||
where
|
where
|
||||||
mkChDiag vt =
|
mkChDiag vt =
|
||||||
(strokeTrail .
|
(strokeTrail .
|
||||||
fromVertices $
|
fromVertices $
|
||||||
vtf) #
|
vtf) #
|
||||||
moveTo (head vtf) #
|
moveTo (head vtf) #
|
||||||
lc red
|
lc orange
|
||||||
|
where
|
||||||
|
vtf = filter (inRange (dX p) (dY p)) vt
|
||||||
|
|
||||||
|
|
||||||
|
convexHullLinesIntervalUpper :: DiagProp -> [PT] -> [Diagram Cairo R2]
|
||||||
|
convexHullLinesIntervalUpper p xs =
|
||||||
|
fmap mkChDiag (grahamGetUpperHullSteps xs)
|
||||||
|
where
|
||||||
|
mkChDiag vt =
|
||||||
|
(strokeTrail .
|
||||||
|
fromVertices $
|
||||||
|
vtf) #
|
||||||
|
moveTo (head vtf) #
|
||||||
|
lc purple
|
||||||
where
|
where
|
||||||
vtf = filter (inRange (dX p) (dY p)) vt
|
vtf = filter (inRange (dX p) (dY p)) vt
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user