22b7a9be84
Rasterific appears to generate some pretty surprising, if not completely wrong, circles at especially low sizes - this was resulting in unexpected behavior with vision calculation, including the character never being able to see directly to the left of them, among other things. This moves back to the old midpoint circle algorithm I pulled off of rosetta code, but only for the non-filled circle. The filled circle is still using the wonky algorithm for now, but at some point I'd love to refactor it such that empty circles are eg always a subset of non-filled circles.
58 lines
2.4 KiB
Haskell
58 lines
2.4 KiB
Haskell
module Xanthous.Util.GraphicsSpec (main, test) where
|
||
--------------------------------------------------------------------------------
|
||
import Test.Prelude hiding (head)
|
||
--------------------------------------------------------------------------------
|
||
import Xanthous.Util.Graphics
|
||
import Xanthous.Util
|
||
import Data.List (head)
|
||
--------------------------------------------------------------------------------
|
||
|
||
main :: IO ()
|
||
main = defaultMain test
|
||
|
||
test :: TestTree
|
||
test = testGroup "Xanthous.Util.Graphics"
|
||
[ testGroup "circle"
|
||
[ testCase "radius 1, origin 2,2"
|
||
{-
|
||
| | 0 | 1 | 2 | 3 |
|
||
|---+---+---+---+---|
|
||
| 0 | | | | |
|
||
| 1 | | | x | |
|
||
| 2 | | x | | x |
|
||
| 3 | | | x | |
|
||
-}
|
||
$ (sort . unique @[] @[_]) (circle @Int (2, 2) 1)
|
||
@?= [ (1, 2)
|
||
, (2, 1), (2, 3)
|
||
, (3, 2)
|
||
]
|
||
, testCase "radius 12, origin 0"
|
||
$ (sort . unique @[] @[_]) (circle @Int (0, 0) 12)
|
||
@?= [ (-12,-4),(-12,-3),(-12,-2),(-12,-1),(-12,0),(-12,1),(-12,2)
|
||
, (-12,3),(-12,4),(-11,-6),(-11,-5),(-11,5),(-11,6),(-10,-7),(-10,7)
|
||
, (-9,-9),(-9,-8),(-9,8),(-9,9),(-8,-9),(-8,9),(-7,-10),(-7,10)
|
||
, (-6,-11),(-6,11),(-5,-11),(-5 ,11),(-4,-12),(-4,12),(-3,-12),(-3,12)
|
||
, (-2,-12),(-2,12),(-1,-12),(-1,12),(0,-12),(0,12),(1,-12),(1,12)
|
||
, (2,-12),(2,12),(3,-12),(3,12),(4,-12),(4,12),(5,-11),(5 ,11),(6,-11)
|
||
, (6,11),(7,-10),(7,10),(8,-9),(8,9),(9,-9),(9,-8),(9,8),(9,9),(10,-7)
|
||
, (10,7),(11,-6),(11,-5),(11,5),(11,6),(12,-4),(12,-3),(12,-2),(12,-1)
|
||
, (12,0), (12,1),(12,2),(12,3),(12,4)
|
||
]
|
||
|
||
-- , testProperty "is a subset of filledCircle" $ \center radius ->
|
||
-- let circ = circle @Int center radius
|
||
-- filledCirc = filledCircle center radius
|
||
-- in counterexample ( "circle: " <> show circ
|
||
-- <> "\nfilledCircle: " <> show filledCirc)
|
||
-- $ setFromList circ `isSubsetOf` setFromList filledCirc
|
||
]
|
||
, testGroup "line"
|
||
[ testProperty "starts and ends at the start and end points" $ \start end ->
|
||
let ℓ = line @Int start end
|
||
in counterexample ("line: " <> show ℓ)
|
||
$ length ℓ > 2 ==> (head ℓ === start) .&&. (head (reverse ℓ) === end)
|
||
]
|
||
]
|
||
|
||
--------------------------------------------------------------------------------
|