module HGeometry.Line.General
( VerticalOrLineEQ(..)
) where
import Control.DeepSeq
import Control.Lens ((^.))
import GHC.Generics
import HGeometry.Ext
import HGeometry.HyperPlane.Class
import HGeometry.Intersection
import HGeometry.Line.Class
import HGeometry.Line.Intersection
import HGeometry.Line.LineEQ
import HGeometry.Point
import HGeometry.Properties (NumType, Dimension)
import HGeometry.Vector
data VerticalOrLineEQ r = VerticalLineThrough !r
| NonVertical !(LineEQ r)
deriving (Int -> VerticalOrLineEQ r -> ShowS
[VerticalOrLineEQ r] -> ShowS
VerticalOrLineEQ r -> String
(Int -> VerticalOrLineEQ r -> ShowS)
-> (VerticalOrLineEQ r -> String)
-> ([VerticalOrLineEQ r] -> ShowS)
-> Show (VerticalOrLineEQ r)
forall r. Show r => Int -> VerticalOrLineEQ r -> ShowS
forall r. Show r => [VerticalOrLineEQ r] -> ShowS
forall r. Show r => VerticalOrLineEQ r -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall r. Show r => Int -> VerticalOrLineEQ r -> ShowS
showsPrec :: Int -> VerticalOrLineEQ r -> ShowS
$cshow :: forall r. Show r => VerticalOrLineEQ r -> String
show :: VerticalOrLineEQ r -> String
$cshowList :: forall r. Show r => [VerticalOrLineEQ r] -> ShowS
showList :: [VerticalOrLineEQ r] -> ShowS
Show,VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
(VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool)
-> (VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool)
-> Eq (VerticalOrLineEQ r)
forall r. Eq r => VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall r. Eq r => VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
== :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
$c/= :: forall r. Eq r => VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
/= :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
Eq,Eq (VerticalOrLineEQ r)
Eq (VerticalOrLineEQ r) =>
(VerticalOrLineEQ r -> VerticalOrLineEQ r -> Ordering)
-> (VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool)
-> (VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool)
-> (VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool)
-> (VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool)
-> (VerticalOrLineEQ r -> VerticalOrLineEQ r -> VerticalOrLineEQ r)
-> (VerticalOrLineEQ r -> VerticalOrLineEQ r -> VerticalOrLineEQ r)
-> Ord (VerticalOrLineEQ r)
VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
VerticalOrLineEQ r -> VerticalOrLineEQ r -> Ordering
VerticalOrLineEQ r -> VerticalOrLineEQ r -> VerticalOrLineEQ r
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall r. Ord r => Eq (VerticalOrLineEQ r)
forall r. Ord r => VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
forall r.
Ord r =>
VerticalOrLineEQ r -> VerticalOrLineEQ r -> Ordering
forall r.
Ord r =>
VerticalOrLineEQ r -> VerticalOrLineEQ r -> VerticalOrLineEQ r
$ccompare :: forall r.
Ord r =>
VerticalOrLineEQ r -> VerticalOrLineEQ r -> Ordering
compare :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> Ordering
$c< :: forall r. Ord r => VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
< :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
$c<= :: forall r. Ord r => VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
<= :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
$c> :: forall r. Ord r => VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
> :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
$c>= :: forall r. Ord r => VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
>= :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
$cmax :: forall r.
Ord r =>
VerticalOrLineEQ r -> VerticalOrLineEQ r -> VerticalOrLineEQ r
max :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> VerticalOrLineEQ r
$cmin :: forall r.
Ord r =>
VerticalOrLineEQ r -> VerticalOrLineEQ r -> VerticalOrLineEQ r
min :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> VerticalOrLineEQ r
Ord,(forall x. VerticalOrLineEQ r -> Rep (VerticalOrLineEQ r) x)
-> (forall x. Rep (VerticalOrLineEQ r) x -> VerticalOrLineEQ r)
-> Generic (VerticalOrLineEQ r)
forall x. Rep (VerticalOrLineEQ r) x -> VerticalOrLineEQ r
forall x. VerticalOrLineEQ r -> Rep (VerticalOrLineEQ r) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall r x. Rep (VerticalOrLineEQ r) x -> VerticalOrLineEQ r
forall r x. VerticalOrLineEQ r -> Rep (VerticalOrLineEQ r) x
$cfrom :: forall r x. VerticalOrLineEQ r -> Rep (VerticalOrLineEQ r) x
from :: forall x. VerticalOrLineEQ r -> Rep (VerticalOrLineEQ r) x
$cto :: forall r x. Rep (VerticalOrLineEQ r) x -> VerticalOrLineEQ r
to :: forall x. Rep (VerticalOrLineEQ r) x -> VerticalOrLineEQ r
Generic)
type instance NumType (VerticalOrLineEQ r) = r
type instance Dimension (VerticalOrLineEQ r) = 2
instance NFData r => NFData (VerticalOrLineEQ r)
instance (Fractional r, Eq r) => Line_ (VerticalOrLineEQ r) 2 r where
fromPointAndVec :: forall point.
(Point_ point 2 r, Line_ (VerticalOrLineEQ r) 2 r, Num r) =>
point -> Vector 2 r -> VerticalOrLineEQ r
fromPointAndVec (Point2_ r
px r
py) (Vector2 r
vx r
vy)
| r
vx r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
0 = r -> VerticalOrLineEQ r
forall r. r -> VerticalOrLineEQ r
VerticalLineThrough r
px
| Bool
otherwise = let a :: r
a = r
vyr -> r -> r
forall a. Fractional a => a -> a -> a
/r
vx
in LineEQ r -> VerticalOrLineEQ r
forall r. LineEQ r -> VerticalOrLineEQ r
NonVertical (LineEQ r -> VerticalOrLineEQ r) -> LineEQ r -> VerticalOrLineEQ r
forall a b. (a -> b) -> a -> b
$ r -> r -> LineEQ r
forall r. r -> r -> LineEQ r
LineEQ r
a (r
pyr -> r -> r
forall a. Num a => a -> a -> a
-r
pxr -> r -> r
forall a. Num a => a -> a -> a
*r
a)
instance HasOnLine (VerticalOrLineEQ r) 2 where
onLine :: forall point r.
(Point_ point 2 r, Num r, Eq r, r ~ NumType (VerticalOrLineEQ r),
2 ~ Dimension (VerticalOrLineEQ r)) =>
point -> VerticalOrLineEQ r -> Bool
onLine point
q = \case
VerticalLineThrough r
x -> point
qpoint -> Getting r point r -> r
forall s a. s -> Getting a s a -> a
^.Getting r point r
forall (d :: Nat) point r.
(1 <= d, Point_ point d r) =>
IndexedLens' Int point r
IndexedLens' Int point r
xCoord r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
x
NonVertical LineEQ r
l -> point -> LineEQ r -> Bool
forall line (d :: Nat) point r.
(HasOnLine line d, Point_ point d r, Num r, Eq r, r ~ NumType line,
d ~ Dimension line) =>
point -> line -> Bool
forall point r.
(Point_ point 2 r, Num r, Eq r, r ~ NumType (LineEQ r),
2 ~ Dimension (LineEQ r)) =>
point -> LineEQ r -> Bool
onLine point
q LineEQ r
l
instance HyperPlane_ (VerticalOrLineEQ r) 2 r where
hyperPlaneEquation :: Num r => VerticalOrLineEQ r -> Vector (2 + 1) r
hyperPlaneEquation = \case
VerticalLineThrough r
x -> r -> r -> r -> Vector 3 r
forall r. r -> r -> r -> Vector 3 r
Vector3 r
1 r
0 (-r
x)
NonVertical LineEQ r
l -> LineEQ r -> Vector (2 + 1) r
forall hyperPlane (d :: Nat) r.
(HyperPlane_ hyperPlane d r, Num r) =>
hyperPlane -> Vector (d + 1) r
hyperPlaneEquation LineEQ r
l
onHyperPlane :: forall point.
(Point_ point 2 r, Eq r, Num r) =>
point -> VerticalOrLineEQ r -> Bool
onHyperPlane = point -> VerticalOrLineEQ r -> Bool
forall line (d :: Nat) point r.
(HasOnLine line d, Point_ point d r, Num r, Eq r, r ~ NumType line,
d ~ Dimension line) =>
point -> line -> Bool
forall point r.
(Point_ point 2 r, Num r, Eq r, r ~ NumType (VerticalOrLineEQ r),
2 ~ Dimension (VerticalOrLineEQ r)) =>
point -> VerticalOrLineEQ r -> Bool
onLine
onSideTest :: forall point.
(Point_ point 2 r, Ord r, Num r) =>
point -> VerticalOrLineEQ r -> Ordering
onSideTest point
q = \case
VerticalLineThrough r
x -> (point
qpoint -> Getting r point r -> r
forall s a. s -> Getting a s a -> a
^.Getting r point r
forall (d :: Nat) point r.
(1 <= d, Point_ point d r) =>
IndexedLens' Int point r
IndexedLens' Int point r
xCoord) r -> r -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` r
x
NonVertical LineEQ r
l -> point -> LineEQ r -> Ordering
forall point.
(Point_ point 2 r, Ord r, Num r) =>
point -> LineEQ r -> Ordering
forall hyperPlane (d :: Nat) r point.
(HyperPlane_ hyperPlane d r, Point_ point d r, Ord r, Num r) =>
point -> hyperPlane -> Ordering
onSideTest point
q LineEQ r
l
instance (Fractional r, Eq r) => ConstructableHyperPlane_ (VerticalOrLineEQ r) 2 r where
type HyperPlaneFromEquationConstraint (VerticalOrLineEQ r) 2 r = ()
hyperPlaneFromEquation :: HyperPlaneFromEquationConstraint (VerticalOrLineEQ r) 2 r =>
Vector (2 + 1) r -> VerticalOrLineEQ r
hyperPlaneFromEquation v :: Vector (2 + 1) r
v@(Vector3 r
a r
b r
c)
| r
b r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
0 = r -> VerticalOrLineEQ r
forall r. r -> VerticalOrLineEQ r
VerticalLineThrough ((-r
c)r -> r -> r
forall a. Fractional a => a -> a -> a
/r
a)
| Bool
otherwise = LineEQ r -> VerticalOrLineEQ r
forall r. LineEQ r -> VerticalOrLineEQ r
NonVertical (LineEQ r -> VerticalOrLineEQ r) -> LineEQ r -> VerticalOrLineEQ r
forall a b. (a -> b) -> a -> b
$ Vector (2 + 1) r -> LineEQ r
forall hyperPlane (d :: Nat) r.
(ConstructableHyperPlane_ hyperPlane d r,
HyperPlaneFromEquationConstraint hyperPlane d r) =>
Vector (d + 1) r -> hyperPlane
hyperPlaneFromEquation Vector (2 + 1) r
v
fromPointAndNormal :: forall point.
(Point_ point 2 r, Num r) =>
point -> Vector 2 r -> VerticalOrLineEQ r
fromPointAndNormal point
p (Vector2 r
vx r
vy) = point -> Vector 2 r -> VerticalOrLineEQ r
forall point.
(Point_ point 2 r, Line_ (VerticalOrLineEQ r) 2 r, Num r) =>
point -> Vector 2 r -> VerticalOrLineEQ r
forall line (d :: Nat) r point.
(Line_ line d r, Point_ point d r, Line_ line d r, Num r) =>
point -> Vector d r -> line
fromPointAndVec point
p (Vector 2 r -> VerticalOrLineEQ r)
-> Vector 2 r -> VerticalOrLineEQ r
forall a b. (a -> b) -> a -> b
$ r -> r -> Vector 2 r
forall r. r -> r -> Vector 2 r
Vector2 r
vy (-r
vx)
type instance Intersection (LineEQ r) (VerticalOrLineEQ r) =
Maybe (LineLineIntersection (LineEQ r))
instance Eq r => HasIntersectionWith (LineEQ r) (VerticalOrLineEQ r) where
LineEQ r
m intersects :: LineEQ r -> VerticalOrLineEQ r -> Bool
`intersects` VerticalOrLineEQ r
l = case VerticalOrLineEQ r
l of
VerticalLineThrough r
_ -> Bool
True
NonVertical LineEQ r
l' -> LineEQ r
m LineEQ r -> LineEQ r -> Bool
forall g h. HasIntersectionWith g h => g -> h -> Bool
`intersects` LineEQ r
l'
instance (Eq r, Fractional r)
=> IsIntersectableWith (LineEQ r) (VerticalOrLineEQ r) where
LineEQ r
m intersect :: LineEQ r
-> VerticalOrLineEQ r
-> Intersection (LineEQ r) (VerticalOrLineEQ r)
`intersect` VerticalOrLineEQ r
l = case VerticalOrLineEQ r
l of
VerticalLineThrough r
x -> LineLineIntersectionG r (LineEQ r)
-> Maybe (LineLineIntersectionG r (LineEQ r))
LineLineIntersectionG r (LineEQ r)
-> Intersection (LineEQ r) (VerticalOrLineEQ r)
forall a. a -> Maybe a
Just (LineLineIntersectionG r (LineEQ r)
-> Intersection (LineEQ r) (VerticalOrLineEQ r))
-> (Point 2 r -> LineLineIntersectionG r (LineEQ r))
-> Point 2 r
-> Intersection (LineEQ r) (VerticalOrLineEQ r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Point 2 r -> LineLineIntersectionG r (LineEQ r)
forall r line. Point 2 r -> LineLineIntersectionG r line
Line_x_Line_Point (Point 2 r -> Intersection (LineEQ r) (VerticalOrLineEQ r))
-> Point 2 r -> Intersection (LineEQ r) (VerticalOrLineEQ r)
forall a b. (a -> b) -> a -> b
$ r -> r -> Point 2 r
forall r. r -> r -> Point 2 r
Point2 r
x (r -> LineEQ r -> r
forall r. Num r => r -> LineEQ r -> r
evalAt' r
x LineEQ r
m)
NonVertical LineEQ r
l' -> LineEQ r
m LineEQ r -> LineEQ r -> Intersection (LineEQ r) (LineEQ r)
forall g h. IsIntersectableWith g h => g -> h -> Intersection g h
`intersect` LineEQ r
l'
type instance Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r) =
Maybe (LineLineIntersection (VerticalOrLineEQ r))
instance Eq r => HasIntersectionWith (VerticalOrLineEQ r) (VerticalOrLineEQ r) where
VerticalOrLineEQ r
m intersects :: VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
`intersects` VerticalOrLineEQ r
l = case VerticalOrLineEQ r
m of
VerticalLineThrough r
x -> case VerticalOrLineEQ r
l of
VerticalLineThrough r
x' -> r
x r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
x'
NonVertical LineEQ r
_ -> Bool
True
NonVertical LineEQ r
m' -> case VerticalOrLineEQ r
l of
VerticalLineThrough r
_ -> Bool
True
NonVertical LineEQ r
l' -> LineEQ r
m' LineEQ r -> LineEQ r -> Bool
forall g h. HasIntersectionWith g h => g -> h -> Bool
`intersects` LineEQ r
l'
instance (Eq r, Fractional r)
=> IsIntersectableWith (VerticalOrLineEQ r) (VerticalOrLineEQ r) where
VerticalOrLineEQ r
m intersect :: VerticalOrLineEQ r
-> VerticalOrLineEQ r
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
`intersect` VerticalOrLineEQ r
l = case VerticalOrLineEQ r
m of
VerticalLineThrough r
x -> case VerticalOrLineEQ r
l of
VerticalLineThrough r
x'
| r
x r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
x' -> LineLineIntersectionG r (VerticalOrLineEQ r)
-> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r))
forall a. a -> Maybe a
Just (LineLineIntersectionG r (VerticalOrLineEQ r)
-> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r)))
-> LineLineIntersectionG r (VerticalOrLineEQ r)
-> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r))
forall a b. (a -> b) -> a -> b
$ VerticalOrLineEQ r -> LineLineIntersectionG r (VerticalOrLineEQ r)
forall r line. line -> LineLineIntersectionG r line
Line_x_Line_Line VerticalOrLineEQ r
m
| Bool
otherwise -> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r))
Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
forall a. Maybe a
Nothing
NonVertical LineEQ r
l' -> LineLineIntersectionG r (VerticalOrLineEQ r)
-> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r))
LineLineIntersectionG r (VerticalOrLineEQ r)
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
forall a. a -> Maybe a
Just (LineLineIntersectionG r (VerticalOrLineEQ r)
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r))
-> (Point 2 r -> LineLineIntersectionG r (VerticalOrLineEQ r))
-> Point 2 r
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Point 2 r -> LineLineIntersectionG r (VerticalOrLineEQ r)
forall r line. Point 2 r -> LineLineIntersectionG r line
Line_x_Line_Point (Point 2 r
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r))
-> Point 2 r
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
forall a b. (a -> b) -> a -> b
$ r -> r -> Point 2 r
forall r. r -> r -> Point 2 r
Point2 r
x (r -> LineEQ r -> r
forall r. Num r => r -> LineEQ r -> r
evalAt' r
x LineEQ r
l')
NonVertical LineEQ r
m' -> case VerticalOrLineEQ r
l of
VerticalLineThrough r
x' -> LineLineIntersectionG r (VerticalOrLineEQ r)
-> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r))
LineLineIntersectionG r (VerticalOrLineEQ r)
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
forall a. a -> Maybe a
Just (LineLineIntersectionG r (VerticalOrLineEQ r)
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r))
-> (Point 2 r -> LineLineIntersectionG r (VerticalOrLineEQ r))
-> Point 2 r
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Point 2 r -> LineLineIntersectionG r (VerticalOrLineEQ r)
forall r line. Point 2 r -> LineLineIntersectionG r line
Line_x_Line_Point (Point 2 r
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r))
-> Point 2 r
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
forall a b. (a -> b) -> a -> b
$ r -> r -> Point 2 r
forall r. r -> r -> Point 2 r
Point2 r
x' (r -> LineEQ r -> r
forall r. Num r => r -> LineEQ r -> r
evalAt' r
x' LineEQ r
m')
NonVertical LineEQ r
l' -> (LineEQ r -> VerticalOrLineEQ r)
-> LineLineIntersectionG r (LineEQ r)
-> LineLineIntersectionG r (VerticalOrLineEQ r)
forall a b.
(a -> b) -> LineLineIntersectionG r a -> LineLineIntersectionG r b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LineEQ r -> VerticalOrLineEQ r
forall r. LineEQ r -> VerticalOrLineEQ r
NonVertical (LineLineIntersectionG r (LineEQ r)
-> LineLineIntersectionG r (VerticalOrLineEQ r))
-> Maybe (LineLineIntersectionG r (LineEQ r))
-> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> LineEQ r
m' LineEQ r -> LineEQ r -> Intersection (LineEQ r) (LineEQ r)
forall g h. IsIntersectableWith g h => g -> h -> Intersection g h
`intersect` LineEQ r
l'
type instance Intersection (VerticalOrLineEQ r :+ extra) (VerticalOrLineEQ r :+ extra') =
Maybe (LineLineIntersection (VerticalOrLineEQ r :+ extra))
instance Eq r => HasIntersectionWith (VerticalOrLineEQ r :+ extra)
(VerticalOrLineEQ r :+ extra') where
VerticalOrLineEQ r :+ extra
m intersects :: (VerticalOrLineEQ r :+ extra)
-> (VerticalOrLineEQ r :+ extra') -> Bool
`intersects` VerticalOrLineEQ r :+ extra'
l = (VerticalOrLineEQ r :+ extra
m(VerticalOrLineEQ r :+ extra)
-> Getting
(VerticalOrLineEQ r)
(VerticalOrLineEQ r :+ extra)
(VerticalOrLineEQ r)
-> VerticalOrLineEQ r
forall s a. s -> Getting a s a -> a
^.Getting
(VerticalOrLineEQ r)
(VerticalOrLineEQ r :+ extra)
(VerticalOrLineEQ r)
forall core extra core' (f :: * -> *).
Functor f =>
(core -> f core') -> (core :+ extra) -> f (core' :+ extra)
core) VerticalOrLineEQ r -> VerticalOrLineEQ r -> Bool
forall g h. HasIntersectionWith g h => g -> h -> Bool
`intersects` (VerticalOrLineEQ r :+ extra'
l(VerticalOrLineEQ r :+ extra')
-> Getting
(VerticalOrLineEQ r)
(VerticalOrLineEQ r :+ extra')
(VerticalOrLineEQ r)
-> VerticalOrLineEQ r
forall s a. s -> Getting a s a -> a
^.Getting
(VerticalOrLineEQ r)
(VerticalOrLineEQ r :+ extra')
(VerticalOrLineEQ r)
forall core extra core' (f :: * -> *).
Functor f =>
(core -> f core') -> (core :+ extra) -> f (core' :+ extra)
core)
instance (Eq r, Fractional r)
=> IsIntersectableWith (VerticalOrLineEQ r :+ extra) (VerticalOrLineEQ r :+ extra') where
VerticalOrLineEQ r :+ extra
m intersect :: (VerticalOrLineEQ r :+ extra)
-> (VerticalOrLineEQ r :+ extra')
-> Intersection
(VerticalOrLineEQ r :+ extra) (VerticalOrLineEQ r :+ extra')
`intersect` VerticalOrLineEQ r :+ extra'
l = let ix :: Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
ix = (VerticalOrLineEQ r :+ extra
m(VerticalOrLineEQ r :+ extra)
-> Getting
(VerticalOrLineEQ r)
(VerticalOrLineEQ r :+ extra)
(VerticalOrLineEQ r)
-> VerticalOrLineEQ r
forall s a. s -> Getting a s a -> a
^.Getting
(VerticalOrLineEQ r)
(VerticalOrLineEQ r :+ extra)
(VerticalOrLineEQ r)
forall core extra core' (f :: * -> *).
Functor f =>
(core -> f core') -> (core :+ extra) -> f (core' :+ extra)
core) VerticalOrLineEQ r
-> VerticalOrLineEQ r
-> Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
forall g h. IsIntersectableWith g h => g -> h -> Intersection g h
`intersect` (VerticalOrLineEQ r :+ extra'
l(VerticalOrLineEQ r :+ extra')
-> Getting
(VerticalOrLineEQ r)
(VerticalOrLineEQ r :+ extra')
(VerticalOrLineEQ r)
-> VerticalOrLineEQ r
forall s a. s -> Getting a s a -> a
^.Getting
(VerticalOrLineEQ r)
(VerticalOrLineEQ r :+ extra')
(VerticalOrLineEQ r)
forall core extra core' (f :: * -> *).
Functor f =>
(core -> f core') -> (core :+ extra) -> f (core' :+ extra)
core)
in (VerticalOrLineEQ r -> VerticalOrLineEQ r :+ extra)
-> LineLineIntersectionG r (VerticalOrLineEQ r)
-> LineLineIntersectionG r (VerticalOrLineEQ r :+ extra)
forall a b.
(a -> b) -> LineLineIntersectionG r a -> LineLineIntersectionG r b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((VerticalOrLineEQ r :+ extra)
-> VerticalOrLineEQ r -> VerticalOrLineEQ r :+ extra
forall a b. a -> b -> a
const VerticalOrLineEQ r :+ extra
m) (LineLineIntersectionG r (VerticalOrLineEQ r)
-> LineLineIntersectionG r (VerticalOrLineEQ r :+ extra))
-> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r))
-> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r :+ extra))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (LineLineIntersectionG r (VerticalOrLineEQ r))
Intersection (VerticalOrLineEQ r) (VerticalOrLineEQ r)
ix