--------------------------------------------------------------------------------
-- |
-- Module      :  HGeometry.Line.General
-- Copyright   :  (C) Frank Staals
-- License     :  see the LICENSE file
-- Maintainer  :  Frank Staals
--
-- An algebraic data type representing a line; we explicitly model vertical lines.
--
--------------------------------------------------------------------------------
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
--------------------------------------------------------------------------------

-- | A line type that explicitly represents vertical lines.
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)

-- fromGeneralLine :: (Line2_ line r, Num r) => line -> VerticalOrLineEQ r
-- fromGeneralLine

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)
    -- in principle we get py = a*px + b, with a = (vy/vx), and thus b=py - px*(vy/vx)

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

  -- FIXME: remove this implementation; just use the default
  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)
    -- rotate the normal vector 90 degrees clockwise

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 -- if it is a line, just replace it by m