module Graphics.Implicit.ObjectUtil.GetBox2 (getBox2, getBox2R) where
import Prelude(pure, fmap, Eq, (==), (.), (<$>), (||), unzip, minimum, maximum, ($), (/), (-), (+), (*), cos, sin, sqrt, min, max, (<), (<>), pi, atan2, (==), (>), show, (&&), otherwise, error)
import Graphics.Implicit.Definitions
( SymbolicObj2(Square, Circle, Polygon, Rotate2, Transform2, Shared2),
SharedObj(IntersectR, Complement, UnionR, DifferenceR),
Box2,
ℝ2,
ℝ,
minℝ )
import Data.Fixed (mod')
import Graphics.Implicit.ObjectUtil.GetBoxShared (emptyBox, corners, outsetBox, intersectBoxes, pointsBox, getBoxShared, unionBoxes)
import Linear (V2(V2), V3(V3))
import qualified Linear
getBox2 :: SymbolicObj2 -> Box2
getBox2 :: SymbolicObj2 -> Box2
getBox2 (Square ℝ2
size) = (ℝ -> ℝ2
forall (f :: * -> *) a. Applicative f => a -> f a
pure ℝ
0, ℝ2
size)
getBox2 (Circle ℝ
r) = (ℝ -> ℝ2
forall (f :: * -> *) a. Applicative f => a -> f a
pure (-ℝ
r), ℝ -> ℝ2
forall (f :: * -> *) a. Applicative f => a -> f a
pure ℝ
r)
getBox2 (Polygon [ℝ2]
points) = [ℝ2] -> Box2
forall (f :: * -> *) a.
(Applicative f, Num a, VectorStuff (f a)) =>
[f a] -> (f a, f a)
pointsBox [ℝ2]
points
getBox2 (Rotate2 ℝ
θ SymbolicObj2
symbObj) =
let rotate :: ℝ2 -> ℝ2
rotate (V2 ℝ
x ℝ
y) = ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 (ℝ
xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
cos ℝ
θ ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
- ℝ
yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
sin ℝ
θ) (ℝ
xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
sin ℝ
θ ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ ℝ
yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
cos ℝ
θ)
in [ℝ2] -> Box2
forall (f :: * -> *) a.
(Applicative f, Num a, VectorStuff (f a)) =>
[f a] -> (f a, f a)
pointsBox ([ℝ2] -> Box2) -> [ℝ2] -> Box2
forall a b. (a -> b) -> a -> b
$ (ℝ2 -> ℝ2) -> [ℝ2] -> [ℝ2]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ℝ2 -> ℝ2
rotate ([ℝ2] -> [ℝ2]) -> [ℝ2] -> [ℝ2]
forall a b. (a -> b) -> a -> b
$ Box2 -> [ℝ2]
forall vec. VectorStuff vec => (vec, vec) -> [vec]
corners (Box2 -> [ℝ2]) -> Box2 -> [ℝ2]
forall a b. (a -> b) -> a -> b
$ SymbolicObj2 -> Box2
getBox2 SymbolicObj2
symbObj
getBox2 (Transform2 M33 ℝ
m SymbolicObj2
symbObj) =
let box :: Box2
box = SymbolicObj2 -> Box2
getBox2 SymbolicObj2
symbObj
augment :: V2 a -> V3 a
augment (V2 a
x a
y) = (a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 a
x a
y a
1)
normalize :: V3 a -> V2 a
normalize (V3 a
x a
y a
w) = (a -> a -> V2 a
forall a. a -> a -> V2 a
V2 (a
xa -> a -> a
forall a. Fractional a => a -> a -> a
/a
w) (a
ya -> a -> a
forall a. Fractional a => a -> a -> a
/a
w))
in [ℝ2] -> Box2
forall (f :: * -> *) a.
(Applicative f, Num a, VectorStuff (f a)) =>
[f a] -> (f a, f a)
pointsBox ([ℝ2] -> Box2) -> [ℝ2] -> Box2
forall a b. (a -> b) -> a -> b
$ V3 ℝ -> ℝ2
forall a. Fractional a => V3 a -> V2 a
normalize (V3 ℝ -> ℝ2) -> (ℝ2 -> V3 ℝ) -> ℝ2 -> ℝ2
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (M33 ℝ
m M33 ℝ -> V3 ℝ -> V3 ℝ
forall (m :: * -> *) (r :: * -> *) a.
(Functor m, Foldable r, Additive r, Num a) =>
m (r a) -> r a -> m a
Linear.!*) (V3 ℝ -> V3 ℝ) -> (ℝ2 -> V3 ℝ) -> ℝ2 -> V3 ℝ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ℝ2 -> V3 ℝ
forall a. Num a => V2 a -> V3 a
augment (ℝ2 -> ℝ2) -> [ℝ2] -> [ℝ2]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Box2 -> [ℝ2]
forall vec. VectorStuff vec => (vec, vec) -> [vec]
corners Box2
box
getBox2 (Shared2 SharedObj SymbolicObj2 V2 ℝ
obj) = SharedObj SymbolicObj2 V2 ℝ -> Box2
forall obj (f :: * -> *) a.
(Object obj f a, VectorStuff (f a), ComponentWiseMultable (f a),
Fractional a, Metric f) =>
SharedObj obj f a -> (f a, f a)
getBoxShared SharedObj SymbolicObj2 V2 ℝ
obj
getBox2R :: SymbolicObj2 -> ℝ -> Box2
getBox2R :: SymbolicObj2 -> ℝ -> Box2
getBox2R (Circle ℝ
r) ℝ
_ = SymbolicObj2 -> Box2
getBox2 (SymbolicObj2 -> Box2) -> SymbolicObj2 -> Box2
forall a b. (a -> b) -> a -> b
$ ℝ -> SymbolicObj2
Circle ℝ
r
getBox2R (Polygon [ℝ2]
points) ℝ
deg =
let
pointRBoxes :: [Box2]
pointRBoxes = [ ℝ2 -> ℝ -> Box2
pointRBox ℝ2
point ℝ
deg | ℝ2
point <- [ℝ2]
points ]
([ℝ2]
pointValsMin, [ℝ2]
pointValsMax) = [Box2] -> ([ℝ2], [ℝ2])
forall a b. [(a, b)] -> ([a], [b])
unzip [Box2]
pointRBoxes
unbox :: ℝ2 -> (ℝ, ℝ)
unbox :: ℝ2 -> (ℝ, ℝ)
unbox (V2 ℝ
x ℝ
y) = (ℝ
x, ℝ
y)
([ℝ]
pointValsX, [ℝ]
pointValsY) = [(ℝ, ℝ)] -> ([ℝ], [ℝ])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(ℝ, ℝ)] -> ([ℝ], [ℝ])) -> [(ℝ, ℝ)] -> ([ℝ], [ℝ])
forall a b. (a -> b) -> a -> b
$ (ℝ2 -> (ℝ, ℝ)) -> [ℝ2] -> [(ℝ, ℝ)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ℝ2 -> (ℝ, ℝ)
unbox ([ℝ2] -> [(ℝ, ℝ)]) -> [ℝ2] -> [(ℝ, ℝ)]
forall a b. (a -> b) -> a -> b
$ [ℝ2]
pointValsMin [ℝ2] -> [ℝ2] -> [ℝ2]
forall a. Semigroup a => a -> a -> a
<> [ℝ2]
pointValsMax
in
(ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ([ℝ] -> ℝ
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [ℝ]
pointValsX)( [ℝ] -> ℝ
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [ℝ]
pointValsY), ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ([ℝ] -> ℝ
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [ℝ]
pointValsX) ([ℝ] -> ℝ
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [ℝ]
pointValsY))
getBox2R (Shared2 (Complement SymbolicObj2
symObj)) ℝ
_ = SymbolicObj2 -> Box2
getBox2 (SymbolicObj2 -> Box2) -> SymbolicObj2 -> Box2
forall a b. (a -> b) -> a -> b
$ SharedObj SymbolicObj2 V2 ℝ -> SymbolicObj2
Shared2 (SymbolicObj2 -> SharedObj SymbolicObj2 V2 ℝ
forall obj (f :: * -> *) a. obj -> SharedObj obj f a
Complement SymbolicObj2
symObj)
getBox2R (Shared2 (UnionR ℝ
r [SymbolicObj2]
symObjs)) ℝ
deg =
ℝ -> [Box2] -> Box2
forall (f :: * -> *) a.
(VectorStuff (f a), Applicative f, Eq (f a), Num a, Num (f a)) =>
ℝ -> [(f a, f a)] -> (f a, f a)
unionBoxes ℝ
r ([Box2] -> Box2) -> [Box2] -> Box2
forall a b. (a -> b) -> a -> b
$ (SymbolicObj2 -> Box2) -> [SymbolicObj2] -> [Box2]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (SymbolicObj2 -> ℝ -> Box2
`getBox2R` ℝ
deg) [SymbolicObj2]
symObjs
getBox2R (Shared2 (DifferenceR ℝ
_ SymbolicObj2
symObj [SymbolicObj2]
_)) ℝ
deg = SymbolicObj2 -> ℝ -> Box2
getBox2R SymbolicObj2
symObj ℝ
deg
getBox2R (Shared2 (IntersectR ℝ
r [SymbolicObj2]
symObjs)) ℝ
deg =
let
boxes :: [Box2]
boxes = [ SymbolicObj2 -> ℝ -> Box2
getBox2R SymbolicObj2
obj ℝ
deg| SymbolicObj2
obj <- [SymbolicObj2]
symObjs ]
in
ℝ -> Box2 -> Box2
forall a. (VectorStuff a, Num a) => ℝ -> (a, a) -> (a, a)
outsetBox ℝ
r (Box2 -> Box2) -> Box2 -> Box2
forall a b. (a -> b) -> a -> b
$ [Box2] -> Box2
forall a. VectorStuff a => [(a, a)] -> (a, a)
intersectBoxes [Box2]
boxes
getBox2R SymbolicObj2
symObj ℝ
deg =
let
origBox :: Box2
origBox = SymbolicObj2 -> Box2
getBox2 SymbolicObj2
symObj
points :: [ℝ2]
points = Box2 -> [ℝ2]
forall vec. VectorStuff vec => (vec, vec) -> [vec]
corners Box2
origBox
in
SymbolicObj2 -> ℝ -> Box2
getBox2R ([ℝ2] -> SymbolicObj2
Polygon [ℝ2]
points) ℝ
deg
data Quadrant = UpperRight | UpperLeft | LowerRight | LowerLeft
deriving Quadrant -> Quadrant -> Bool
(Quadrant -> Quadrant -> Bool)
-> (Quadrant -> Quadrant -> Bool) -> Eq Quadrant
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Quadrant -> Quadrant -> Bool
$c/= :: Quadrant -> Quadrant -> Bool
== :: Quadrant -> Quadrant -> Bool
$c== :: Quadrant -> Quadrant -> Bool
Eq
data Axis = PosX | PosY | NegX | NegY
deriving Axis -> Axis -> Bool
(Axis -> Axis -> Bool) -> (Axis -> Axis -> Bool) -> Eq Axis
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Axis -> Axis -> Bool
$c/= :: Axis -> Axis -> Bool
== :: Axis -> Axis -> Bool
$c== :: Axis -> Axis -> Bool
Eq
data Position = OnAxis Axis | InQuadrant Quadrant | CenterPoint
data HasRotation = Rotation Direction | None
deriving HasRotation -> HasRotation -> Bool
(HasRotation -> HasRotation -> Bool)
-> (HasRotation -> HasRotation -> Bool) -> Eq HasRotation
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HasRotation -> HasRotation -> Bool
$c/= :: HasRotation -> HasRotation -> Bool
== :: HasRotation -> HasRotation -> Bool
$c== :: HasRotation -> HasRotation -> Bool
Eq
data Direction = Clockwise | CounterClockwise
deriving Direction -> Direction -> Bool
(Direction -> Direction -> Bool)
-> (Direction -> Direction -> Bool) -> Eq Direction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Direction -> Direction -> Bool
$c/= :: Direction -> Direction -> Bool
== :: Direction -> Direction -> Bool
$c== :: Direction -> Direction -> Bool
Eq
pointRBox :: ℝ2 -> ℝ -> Box2
pointRBox :: ℝ2 -> ℝ -> Box2
pointRBox (V2 ℝ
xStart ℝ
yStart) ℝ
travel =
let
k :: ℝ
k :: ℝ
k = ℝ
forall a. Floating a => a
piℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ℝ
180
distance :: ℝ
distance = ℝ -> ℝ
forall a. Floating a => a -> a
sqrt (ℝ -> ℝ) -> ℝ -> ℝ
forall a b. (a -> b) -> a -> b
$ ℝ
xStartℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
xStart ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ ℝ
yStartℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
yStart
θstart :: ℝ
θstart = ℝ -> ℝ -> ℝ
forall a. RealFloat a => a -> a -> a
atan2 ℝ
yStart ℝ
xStart
startPosition :: Position
startPosition = ℝ -> ℝ -> Position
positionOf ℝ
distance (ℝ -> Position) -> ℝ -> Position
forall a b. (a -> b) -> a -> b
$ ℝ -> ℝ
absrad ℝ
θstart
rotationAmount :: ℝ
rotationAmount = ℝ
travel ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
* ℝ
k
rotationDirection :: HasRotation
rotationDirection = case ℝ
travel of
ℝ
polarity | ℝ
polarity ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> ℝ
0 -> Direction -> HasRotation
Rotation Direction
CounterClockwise
| ℝ
polarity ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
== ℝ
0 -> HasRotation
None
ℝ
_ -> Direction -> HasRotation
Rotation Direction
Clockwise
θstop :: ℝ
θstop = ℝ -> ℝ
absrad (ℝ -> ℝ) -> ℝ -> ℝ
forall a b. (a -> b) -> a -> b
$ ℝ
θstart ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ ℝ
rotationAmount
stopPosition :: Position
stopPosition = ℝ -> ℝ -> Position
positionOf ℝ
distance ℝ
θstop
(ℝ
xStop, ℝ
yStop) =
case ℝ -> ℝ -> Position
positionOf ℝ
distance ℝ
θstop of
Position
CenterPoint -> (ℝ
0,ℝ
0)
OnAxis Axis
PosX -> (ℝ
distance,ℝ
0)
OnAxis Axis
PosY -> (ℝ
0,ℝ
distance)
OnAxis Axis
NegX -> (-ℝ
distance,ℝ
0)
OnAxis Axis
NegY -> (ℝ
0,-ℝ
distance)
InQuadrant Quadrant
_ -> ( ℝ
distanceℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
cos ℝ
θstop, ℝ
distanceℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ -> ℝ
forall a. Floating a => a -> a
sin ℝ
θstop)
(ℝ
minX, ℝ
minY, ℝ
maxX, ℝ
maxY) = (ℝ -> ℝ -> ℝ
forall a. Ord a => a -> a -> a
min ℝ
xStart ℝ
xStop, ℝ -> ℝ -> ℝ
forall a. Ord a => a -> a -> a
min ℝ
yStart ℝ
yStop, ℝ -> ℝ -> ℝ
forall a. Ord a => a -> a -> a
max ℝ
xStart ℝ
xStop, ℝ -> ℝ -> ℝ
forall a. Ord a => a -> a -> a
max ℝ
yStart ℝ
yStop)
positionOf :: ℝ -> ℝ -> Position
positionOf :: ℝ -> ℝ -> Position
positionOf ℝ
d ℝ
θpos
| ℝ
d ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
minℝ = Position
CenterPoint
| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
== ℝ
0 Bool -> Bool -> Bool
|| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
== ℝ
360ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k = Axis -> Position
OnAxis Axis
PosX
| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
== ℝ
90ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k = Axis -> Position
OnAxis Axis
PosY
| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
== ℝ
180ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
|| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
== -ℝ
0 = Axis -> Position
OnAxis Axis
NegX
| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Eq a => a -> a -> Bool
== ℝ
270ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k = Axis -> Position
OnAxis Axis
NegY
| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> ℝ
0 Bool -> Bool -> Bool
&& ℝ
θpos ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
90ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k = Quadrant -> Position
InQuadrant Quadrant
UpperRight
| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> ℝ
90ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
&& ℝ
θpos ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
180ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k = Quadrant -> Position
InQuadrant Quadrant
UpperLeft
| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> ℝ
180ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
&& ℝ
θpos ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
270ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k = Quadrant -> Position
InQuadrant Quadrant
LowerLeft
| ℝ
θpos ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> ℝ
270ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
&& ℝ
θpos ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
360ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k = Quadrant -> Position
InQuadrant Quadrant
LowerRight
| Bool
otherwise = [Char] -> Position
forall a. HasCallStack => [Char] -> a
error ([Char] -> Position) -> [Char] -> Position
forall a b. (a -> b) -> a -> b
$ [Char]
"illegal position in positionOf: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> ℝ -> [Char]
forall a. Show a => a -> [Char]
show (ℝ
θposℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k) [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
" pos: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> ℝ -> [Char]
forall a. Show a => a -> [Char]
show ℝ
θpos [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
" d: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> ℝ -> [Char]
forall a. Show a => a -> [Char]
show ℝ
d
absrad :: ℝ -> ℝ
absrad :: ℝ -> ℝ
absrad ℝ
rad
| ℝ
rad ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> (ℝ
360ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k) = ℝ
rad ℝ -> ℝ -> ℝ
forall a. Real a => a -> a -> a
`mod'` (ℝ
360ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k)
| ℝ
rad ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
0 = ℝ -> ℝ
absrad (ℝ
360ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k)ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
+ℝ
rad
| Bool
otherwise = ℝ
rad
distanceBox :: Box2
distanceBox :: Box2
distanceBox = (ℝ -> ℝ2
forall (f :: * -> *) a. Applicative f => a -> f a
pure (-ℝ
distance), ℝ -> ℝ2
forall (f :: * -> *) a. Applicative f => a -> f a
pure ℝ
distance)
noAxis :: Quadrant -> Quadrant -> Direction -> ℝ -> Box2
noAxis :: Quadrant -> Quadrant -> Direction -> ℝ -> Box2
noAxis Quadrant
q1 Quadrant
q2 Direction
dir ℝ
amount
| Quadrant
q1 Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
q2 Bool -> Bool -> Bool
&& ℝ
amount ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
90ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
&& ℝ
amount ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> -ℝ
90ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k = (ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
minX ℝ
minY, ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
maxX ℝ
maxY)
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise Bool -> Bool -> Bool
&& Quadrant
q1 Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft = Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
PosY Quadrant
q2 Direction
dir ℝ
amount
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise Bool -> Bool -> Bool
&& Quadrant
q1 Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight = Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
PosX Quadrant
q2 Direction
dir ℝ
amount
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise Bool -> Bool -> Bool
&& Quadrant
q1 Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft = Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
NegY Quadrant
q2 Direction
dir ℝ
amount
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise Bool -> Bool -> Bool
&& Quadrant
q1 Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight = Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
NegX Quadrant
q2 Direction
dir ℝ
amount
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise Bool -> Bool -> Bool
&& Quadrant
q1 Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight = Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
PosX Quadrant
q2 Direction
dir ℝ
amount
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise Bool -> Bool -> Bool
&& Quadrant
q1 Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft = Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
PosY Quadrant
q2 Direction
dir ℝ
amount
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise Bool -> Bool -> Bool
&& Quadrant
q1 Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft = Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
NegX Quadrant
q2 Direction
dir ℝ
amount
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise Bool -> Bool -> Bool
&& Quadrant
q1 Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight = Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
NegY Quadrant
q2 Direction
dir ℝ
amount
noAxis Quadrant
_ Quadrant
_ Direction
_ ℝ
_ = Box2
distanceBox
oneAxis :: Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis :: Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
axis Quadrant
quadrant Direction
dir ℝ
amount
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise Bool -> Bool -> Bool
&&
ℝ
amount ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
90ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
&& ℝ
amount ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> -ℝ
90ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
&&
((Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight)) = (ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
minX ℝ
minY, ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
maxX ℝ
maxY)
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise Bool -> Bool -> Bool
&&
ℝ
amount ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
90ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
&& ℝ
amount ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> -ℝ
90ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
&&
((Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight)) = (ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
minX ℝ
minY, ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
maxX ℝ
maxY)
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise Bool -> Bool -> Bool
&&
((Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight)) = Axis -> Direction -> Box2
crossOne Axis
axis Direction
dir
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise Bool -> Bool -> Bool
&&
((Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight)) = Axis -> Direction -> Box2
crossOne Axis
axis Direction
dir
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise Bool -> Bool -> Bool
&&
((Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight)) = Axis -> Direction -> Box2
crossTwo Axis
axis Direction
dir
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise Bool -> Bool -> Bool
&&
((Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight)) = Axis -> Direction -> Box2
crossTwo Axis
axis Direction
dir
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise Bool -> Bool -> Bool
&&
((Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight)) = Axis -> Box2
crossThree Axis
axis
| Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise Bool -> Bool -> Bool
&&
((Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerRight) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
LowerLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperLeft) Bool -> Bool -> Bool
||
(Axis
axis Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Quadrant
quadrant Quadrant -> Quadrant -> Bool
forall a. Eq a => a -> a -> Bool
== Quadrant
UpperRight)) = Axis -> Box2
crossThree Axis
axis
| Bool
otherwise = Box2
distanceBox
twoAxis :: Axis -> Axis -> Direction -> Box2
twoAxis :: Axis -> Axis -> Direction -> Box2
twoAxis Axis
start Axis
stop Direction
dir
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY) = Axis -> Direction -> Box2
crossOne Axis
start Direction
dir
twoAxis Axis
start Axis
stop Direction
dir
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX) = if Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise
then (ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
minX ℝ
minY, ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
maxX ℝ
maxY)
else Axis -> Direction -> Box2
crossTwo Axis
start Direction
dir
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Axis
stop Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX) = if Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise
then (ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
minX ℝ
minY, ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
maxX ℝ
maxY)
else Axis -> Direction -> Box2
crossTwo Axis
start Direction
dir
twoAxis Axis
_ Axis
_ Direction
_ = Box2
distanceBox
crossOne :: Axis -> Direction -> Box2
crossOne :: Axis -> Direction -> Box2
crossOne Axis
start Direction
dir
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise) = [(ℝ, ℝ)] -> Box2
mixWith [(ℝ
0,-ℝ
distance)]
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise) = [(ℝ, ℝ)] -> Box2
mixWith [(-ℝ
distance, ℝ
0)]
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise) = [(ℝ, ℝ)] -> Box2
mixWith [(ℝ
0, ℝ
distance)]
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise) = [(ℝ, ℝ)] -> Box2
mixWith [( ℝ
distance, ℝ
0)]
| Bool
otherwise = Box2
distanceBox
crossTwo :: Axis -> Direction -> Box2
crossTwo :: Axis -> Direction -> Box2
crossTwo Axis
start Direction
dir
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise) = [(ℝ, ℝ)] -> Box2
mixWith [(-ℝ
distance, ℝ
0), ( ℝ
0,-ℝ
distance)]
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosY Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise) = [(ℝ, ℝ)] -> Box2
mixWith [( ℝ
distance, ℝ
0), ( ℝ
0,-ℝ
distance)]
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegX Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise) = [(ℝ, ℝ)] -> Box2
mixWith [( ℝ
distance, ℝ
0), ( ℝ
0, ℝ
distance)]
| (Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
NegY Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
Clockwise) Bool -> Bool -> Bool
||
(Axis
start Axis -> Axis -> Bool
forall a. Eq a => a -> a -> Bool
== Axis
PosX Bool -> Bool -> Bool
&& Direction
dir Direction -> Direction -> Bool
forall a. Eq a => a -> a -> Bool
== Direction
CounterClockwise) = [(ℝ, ℝ)] -> Box2
mixWith [(-ℝ
distance, ℝ
0), ( ℝ
0, ℝ
distance)]
| Bool
otherwise = Box2
distanceBox
crossThree :: Axis -> Box2
crossThree :: Axis -> Box2
crossThree Axis
PosX = [(ℝ, ℝ)] -> Box2
mixWith [( ℝ
0, ℝ
distance), (-ℝ
distance, ℝ
0), ( ℝ
0,-ℝ
distance)]
crossThree Axis
PosY = [(ℝ, ℝ)] -> Box2
mixWith [(-ℝ
distance, ℝ
0), ( ℝ
0,-ℝ
distance), ( ℝ
distance, ℝ
0)]
crossThree Axis
NegX = [(ℝ, ℝ)] -> Box2
mixWith [( ℝ
0,-ℝ
distance), ( ℝ
distance, ℝ
0), ( ℝ
0, ℝ
distance)]
crossThree Axis
NegY = [(ℝ, ℝ)] -> Box2
mixWith [( ℝ
distance, ℝ
0), ( ℝ
0, ℝ
distance), (-ℝ
distance, ℝ
0)]
mixWith :: [(ℝ,ℝ)] -> Box2
mixWith :: [(ℝ, ℝ)] -> Box2
mixWith [(ℝ, ℝ)]
points = (ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ([ℝ] -> ℝ
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [ℝ]
xPoints) ([ℝ] -> ℝ
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [ℝ]
yPoints), ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ([ℝ] -> ℝ
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [ℝ]
xPoints) ([ℝ] -> ℝ
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [ℝ]
yPoints))
where
([ℝ]
xPoints, [ℝ]
yPoints) = [(ℝ, ℝ)] -> ([ℝ], [ℝ])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(ℝ, ℝ)] -> ([ℝ], [ℝ])) -> [(ℝ, ℝ)] -> ([ℝ], [ℝ])
forall a b. (a -> b) -> a -> b
$ [(ℝ, ℝ)]
points [(ℝ, ℝ)] -> [(ℝ, ℝ)] -> [(ℝ, ℝ)]
forall a. Semigroup a => a -> a -> a
<> [(ℝ
xStart, ℝ
yStart), (ℝ
xStop, ℝ
yStop)]
invertRotation :: Direction -> Direction
invertRotation :: Direction -> Direction
invertRotation Direction
Clockwise = Direction
CounterClockwise
invertRotation Direction
CounterClockwise = Direction
Clockwise
in
case HasRotation
rotationDirection of
HasRotation
None -> (ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
xStart ℝ
yStart, ℝ -> ℝ -> ℝ2
forall a. a -> a -> V2 a
V2 ℝ
xStart ℝ
yStart)
Rotation Direction
dir -> case ℝ
rotationAmount of
ℝ
amount | ℝ
amount ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
< ℝ
360ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k Bool -> Bool -> Bool
&& ℝ
amount ℝ -> ℝ -> Bool
forall a. Ord a => a -> a -> Bool
> -ℝ
360ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
k ->
case Position
startPosition of
Position
CenterPoint -> Box2
forall (f :: * -> *) a. (Applicative f, Num a) => (f a, f a)
emptyBox
OnAxis Axis
axis -> case Position
stopPosition of
OnAxis Axis
stopaxis -> Axis -> Axis -> Direction -> Box2
twoAxis Axis
axis Axis
stopaxis Direction
dir
InQuadrant Quadrant
stopquadrant -> Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
axis Quadrant
stopquadrant Direction
dir ℝ
amount
Position
CenterPoint -> Box2
forall (f :: * -> *) a. (Applicative f, Num a) => (f a, f a)
emptyBox
InQuadrant Quadrant
quadrant -> case Position
stopPosition of
OnAxis Axis
stopaxis -> Axis -> Quadrant -> Direction -> ℝ -> Box2
oneAxis Axis
stopaxis Quadrant
quadrant (Direction -> Direction
invertRotation Direction
dir) (-ℝ
amount)
InQuadrant Quadrant
stopquadrant -> Quadrant -> Quadrant -> Direction -> ℝ -> Box2
noAxis Quadrant
quadrant Quadrant
stopquadrant Direction
dir ℝ
travel
Position
CenterPoint -> Box2
forall (f :: * -> *) a. (Applicative f, Num a) => (f a, f a)
emptyBox
ℝ
_ ->
(ℝ -> ℝ2
forall (f :: * -> *) a. Applicative f => a -> f a
pure (-ℝ
distance), ℝ -> ℝ2
forall (f :: * -> *) a. Applicative f => a -> f a
pure ℝ
distance)