{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE UndecidableInstances #-}
module HGeometry.HyperPlane.Intersection
( PlanePlaneIntersection(..)
, planePlaneIntersection
) where
import Data.Bifoldable
import Data.Bifunctor
import Data.Bitraversable
import Data.Type.Ord
import GHC.TypeNats
import HGeometry.HyperPlane.Class
import HGeometry.HyperPlane.Internal
import HGeometry.HyperPlane.NonVertical
import HGeometry.Intersection
import HGeometry.Line.General
import HGeometry.Line.LineEQ
import HGeometry.Vector
type instance Intersection (HyperPlane 3 r) (HyperPlane 3 r) =
Maybe (PlanePlaneIntersection (Plane r) (VerticalOrLineEQ r))
type instance Intersection (Plane r) (Plane r) =
Maybe (PlanePlaneIntersection (Plane r) (VerticalOrLineEQ r))
data PlanePlaneIntersection plane line = Plane_x_Plane_Line line
| Plane_x_Plane_Plane plane
deriving (Int -> PlanePlaneIntersection plane line -> ShowS
[PlanePlaneIntersection plane line] -> ShowS
PlanePlaneIntersection plane line -> String
(Int -> PlanePlaneIntersection plane line -> ShowS)
-> (PlanePlaneIntersection plane line -> String)
-> ([PlanePlaneIntersection plane line] -> ShowS)
-> Show (PlanePlaneIntersection plane line)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall plane line.
(Show line, Show plane) =>
Int -> PlanePlaneIntersection plane line -> ShowS
forall plane line.
(Show line, Show plane) =>
[PlanePlaneIntersection plane line] -> ShowS
forall plane line.
(Show line, Show plane) =>
PlanePlaneIntersection plane line -> String
$cshowsPrec :: forall plane line.
(Show line, Show plane) =>
Int -> PlanePlaneIntersection plane line -> ShowS
showsPrec :: Int -> PlanePlaneIntersection plane line -> ShowS
$cshow :: forall plane line.
(Show line, Show plane) =>
PlanePlaneIntersection plane line -> String
show :: PlanePlaneIntersection plane line -> String
$cshowList :: forall plane line.
(Show line, Show plane) =>
[PlanePlaneIntersection plane line] -> ShowS
showList :: [PlanePlaneIntersection plane line] -> ShowS
Show,ReadPrec [PlanePlaneIntersection plane line]
ReadPrec (PlanePlaneIntersection plane line)
Int -> ReadS (PlanePlaneIntersection plane line)
ReadS [PlanePlaneIntersection plane line]
(Int -> ReadS (PlanePlaneIntersection plane line))
-> ReadS [PlanePlaneIntersection plane line]
-> ReadPrec (PlanePlaneIntersection plane line)
-> ReadPrec [PlanePlaneIntersection plane line]
-> Read (PlanePlaneIntersection plane line)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall plane line.
(Read line, Read plane) =>
ReadPrec [PlanePlaneIntersection plane line]
forall plane line.
(Read line, Read plane) =>
ReadPrec (PlanePlaneIntersection plane line)
forall plane line.
(Read line, Read plane) =>
Int -> ReadS (PlanePlaneIntersection plane line)
forall plane line.
(Read line, Read plane) =>
ReadS [PlanePlaneIntersection plane line]
$creadsPrec :: forall plane line.
(Read line, Read plane) =>
Int -> ReadS (PlanePlaneIntersection plane line)
readsPrec :: Int -> ReadS (PlanePlaneIntersection plane line)
$creadList :: forall plane line.
(Read line, Read plane) =>
ReadS [PlanePlaneIntersection plane line]
readList :: ReadS [PlanePlaneIntersection plane line]
$creadPrec :: forall plane line.
(Read line, Read plane) =>
ReadPrec (PlanePlaneIntersection plane line)
readPrec :: ReadPrec (PlanePlaneIntersection plane line)
$creadListPrec :: forall plane line.
(Read line, Read plane) =>
ReadPrec [PlanePlaneIntersection plane line]
readListPrec :: ReadPrec [PlanePlaneIntersection plane line]
Read,PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
(PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool)
-> (PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool)
-> Eq (PlanePlaneIntersection plane line)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall plane line.
(Eq line, Eq plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
$c== :: forall plane line.
(Eq line, Eq plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
== :: PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
$c/= :: forall plane line.
(Eq line, Eq plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
/= :: PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
Eq,Eq (PlanePlaneIntersection plane line)
Eq (PlanePlaneIntersection plane line) =>
(PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Ordering)
-> (PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool)
-> (PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool)
-> (PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool)
-> (PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool)
-> (PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line)
-> (PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line)
-> Ord (PlanePlaneIntersection plane line)
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Ordering
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
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 plane line.
(Ord line, Ord plane) =>
Eq (PlanePlaneIntersection plane line)
forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Ordering
forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
$ccompare :: forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Ordering
compare :: PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Ordering
$c< :: forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
< :: PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
$c<= :: forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
<= :: PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
$c> :: forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
> :: PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
$c>= :: forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
>= :: PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line -> Bool
$cmax :: forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
max :: PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
$cmin :: forall plane line.
(Ord line, Ord plane) =>
PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
min :: PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
-> PlanePlaneIntersection plane line
Ord,(forall a b.
(a -> b)
-> PlanePlaneIntersection plane a
-> PlanePlaneIntersection plane b)
-> (forall a b.
a
-> PlanePlaneIntersection plane b
-> PlanePlaneIntersection plane a)
-> Functor (PlanePlaneIntersection plane)
forall a b.
a
-> PlanePlaneIntersection plane b -> PlanePlaneIntersection plane a
forall a b.
(a -> b)
-> PlanePlaneIntersection plane a -> PlanePlaneIntersection plane b
forall plane a b.
a
-> PlanePlaneIntersection plane b -> PlanePlaneIntersection plane a
forall plane a b.
(a -> b)
-> PlanePlaneIntersection plane a -> PlanePlaneIntersection plane b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall plane a b.
(a -> b)
-> PlanePlaneIntersection plane a -> PlanePlaneIntersection plane b
fmap :: forall a b.
(a -> b)
-> PlanePlaneIntersection plane a -> PlanePlaneIntersection plane b
$c<$ :: forall plane a b.
a
-> PlanePlaneIntersection plane b -> PlanePlaneIntersection plane a
<$ :: forall a b.
a
-> PlanePlaneIntersection plane b -> PlanePlaneIntersection plane a
Functor,(forall m. Monoid m => PlanePlaneIntersection plane m -> m)
-> (forall m a.
Monoid m =>
(a -> m) -> PlanePlaneIntersection plane a -> m)
-> (forall m a.
Monoid m =>
(a -> m) -> PlanePlaneIntersection plane a -> m)
-> (forall a b.
(a -> b -> b) -> b -> PlanePlaneIntersection plane a -> b)
-> (forall a b.
(a -> b -> b) -> b -> PlanePlaneIntersection plane a -> b)
-> (forall b a.
(b -> a -> b) -> b -> PlanePlaneIntersection plane a -> b)
-> (forall b a.
(b -> a -> b) -> b -> PlanePlaneIntersection plane a -> b)
-> (forall a. (a -> a -> a) -> PlanePlaneIntersection plane a -> a)
-> (forall a. (a -> a -> a) -> PlanePlaneIntersection plane a -> a)
-> (forall a. PlanePlaneIntersection plane a -> [a])
-> (forall a. PlanePlaneIntersection plane a -> Bool)
-> (forall a. PlanePlaneIntersection plane a -> Int)
-> (forall a. Eq a => a -> PlanePlaneIntersection plane a -> Bool)
-> (forall a. Ord a => PlanePlaneIntersection plane a -> a)
-> (forall a. Ord a => PlanePlaneIntersection plane a -> a)
-> (forall a. Num a => PlanePlaneIntersection plane a -> a)
-> (forall a. Num a => PlanePlaneIntersection plane a -> a)
-> Foldable (PlanePlaneIntersection plane)
forall a. Eq a => a -> PlanePlaneIntersection plane a -> Bool
forall a. Num a => PlanePlaneIntersection plane a -> a
forall a. Ord a => PlanePlaneIntersection plane a -> a
forall m. Monoid m => PlanePlaneIntersection plane m -> m
forall a. PlanePlaneIntersection plane a -> Bool
forall a. PlanePlaneIntersection plane a -> Int
forall a. PlanePlaneIntersection plane a -> [a]
forall a. (a -> a -> a) -> PlanePlaneIntersection plane a -> a
forall plane a. Eq a => a -> PlanePlaneIntersection plane a -> Bool
forall plane a. Num a => PlanePlaneIntersection plane a -> a
forall plane a. Ord a => PlanePlaneIntersection plane a -> a
forall plane m. Monoid m => PlanePlaneIntersection plane m -> m
forall m a.
Monoid m =>
(a -> m) -> PlanePlaneIntersection plane a -> m
forall plane a. PlanePlaneIntersection plane a -> Bool
forall plane a. PlanePlaneIntersection plane a -> Int
forall plane a. PlanePlaneIntersection plane a -> [a]
forall b a.
(b -> a -> b) -> b -> PlanePlaneIntersection plane a -> b
forall a b.
(a -> b -> b) -> b -> PlanePlaneIntersection plane a -> b
forall plane a.
(a -> a -> a) -> PlanePlaneIntersection plane a -> a
forall plane m a.
Monoid m =>
(a -> m) -> PlanePlaneIntersection plane a -> m
forall plane b a.
(b -> a -> b) -> b -> PlanePlaneIntersection plane a -> b
forall plane a b.
(a -> b -> b) -> b -> PlanePlaneIntersection plane a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall plane m. Monoid m => PlanePlaneIntersection plane m -> m
fold :: forall m. Monoid m => PlanePlaneIntersection plane m -> m
$cfoldMap :: forall plane m a.
Monoid m =>
(a -> m) -> PlanePlaneIntersection plane a -> m
foldMap :: forall m a.
Monoid m =>
(a -> m) -> PlanePlaneIntersection plane a -> m
$cfoldMap' :: forall plane m a.
Monoid m =>
(a -> m) -> PlanePlaneIntersection plane a -> m
foldMap' :: forall m a.
Monoid m =>
(a -> m) -> PlanePlaneIntersection plane a -> m
$cfoldr :: forall plane a b.
(a -> b -> b) -> b -> PlanePlaneIntersection plane a -> b
foldr :: forall a b.
(a -> b -> b) -> b -> PlanePlaneIntersection plane a -> b
$cfoldr' :: forall plane a b.
(a -> b -> b) -> b -> PlanePlaneIntersection plane a -> b
foldr' :: forall a b.
(a -> b -> b) -> b -> PlanePlaneIntersection plane a -> b
$cfoldl :: forall plane b a.
(b -> a -> b) -> b -> PlanePlaneIntersection plane a -> b
foldl :: forall b a.
(b -> a -> b) -> b -> PlanePlaneIntersection plane a -> b
$cfoldl' :: forall plane b a.
(b -> a -> b) -> b -> PlanePlaneIntersection plane a -> b
foldl' :: forall b a.
(b -> a -> b) -> b -> PlanePlaneIntersection plane a -> b
$cfoldr1 :: forall plane a.
(a -> a -> a) -> PlanePlaneIntersection plane a -> a
foldr1 :: forall a. (a -> a -> a) -> PlanePlaneIntersection plane a -> a
$cfoldl1 :: forall plane a.
(a -> a -> a) -> PlanePlaneIntersection plane a -> a
foldl1 :: forall a. (a -> a -> a) -> PlanePlaneIntersection plane a -> a
$ctoList :: forall plane a. PlanePlaneIntersection plane a -> [a]
toList :: forall a. PlanePlaneIntersection plane a -> [a]
$cnull :: forall plane a. PlanePlaneIntersection plane a -> Bool
null :: forall a. PlanePlaneIntersection plane a -> Bool
$clength :: forall plane a. PlanePlaneIntersection plane a -> Int
length :: forall a. PlanePlaneIntersection plane a -> Int
$celem :: forall plane a. Eq a => a -> PlanePlaneIntersection plane a -> Bool
elem :: forall a. Eq a => a -> PlanePlaneIntersection plane a -> Bool
$cmaximum :: forall plane a. Ord a => PlanePlaneIntersection plane a -> a
maximum :: forall a. Ord a => PlanePlaneIntersection plane a -> a
$cminimum :: forall plane a. Ord a => PlanePlaneIntersection plane a -> a
minimum :: forall a. Ord a => PlanePlaneIntersection plane a -> a
$csum :: forall plane a. Num a => PlanePlaneIntersection plane a -> a
sum :: forall a. Num a => PlanePlaneIntersection plane a -> a
$cproduct :: forall plane a. Num a => PlanePlaneIntersection plane a -> a
product :: forall a. Num a => PlanePlaneIntersection plane a -> a
Foldable,Functor (PlanePlaneIntersection plane)
Foldable (PlanePlaneIntersection plane)
(Functor (PlanePlaneIntersection plane),
Foldable (PlanePlaneIntersection plane)) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> PlanePlaneIntersection plane a
-> f (PlanePlaneIntersection plane b))
-> (forall (f :: * -> *) a.
Applicative f =>
PlanePlaneIntersection plane (f a)
-> f (PlanePlaneIntersection plane a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b)
-> PlanePlaneIntersection plane a
-> m (PlanePlaneIntersection plane b))
-> (forall (m :: * -> *) a.
Monad m =>
PlanePlaneIntersection plane (m a)
-> m (PlanePlaneIntersection plane a))
-> Traversable (PlanePlaneIntersection plane)
forall plane. Functor (PlanePlaneIntersection plane)
forall plane. Foldable (PlanePlaneIntersection plane)
forall plane (m :: * -> *) a.
Monad m =>
PlanePlaneIntersection plane (m a)
-> m (PlanePlaneIntersection plane a)
forall plane (f :: * -> *) a.
Applicative f =>
PlanePlaneIntersection plane (f a)
-> f (PlanePlaneIntersection plane a)
forall plane (m :: * -> *) a b.
Monad m =>
(a -> m b)
-> PlanePlaneIntersection plane a
-> m (PlanePlaneIntersection plane b)
forall plane (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> PlanePlaneIntersection plane a
-> f (PlanePlaneIntersection plane b)
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
PlanePlaneIntersection plane (m a)
-> m (PlanePlaneIntersection plane a)
forall (f :: * -> *) a.
Applicative f =>
PlanePlaneIntersection plane (f a)
-> f (PlanePlaneIntersection plane a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b)
-> PlanePlaneIntersection plane a
-> m (PlanePlaneIntersection plane b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> PlanePlaneIntersection plane a
-> f (PlanePlaneIntersection plane b)
$ctraverse :: forall plane (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> PlanePlaneIntersection plane a
-> f (PlanePlaneIntersection plane b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> PlanePlaneIntersection plane a
-> f (PlanePlaneIntersection plane b)
$csequenceA :: forall plane (f :: * -> *) a.
Applicative f =>
PlanePlaneIntersection plane (f a)
-> f (PlanePlaneIntersection plane a)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
PlanePlaneIntersection plane (f a)
-> f (PlanePlaneIntersection plane a)
$cmapM :: forall plane (m :: * -> *) a b.
Monad m =>
(a -> m b)
-> PlanePlaneIntersection plane a
-> m (PlanePlaneIntersection plane b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b)
-> PlanePlaneIntersection plane a
-> m (PlanePlaneIntersection plane b)
$csequence :: forall plane (m :: * -> *) a.
Monad m =>
PlanePlaneIntersection plane (m a)
-> m (PlanePlaneIntersection plane a)
sequence :: forall (m :: * -> *) a.
Monad m =>
PlanePlaneIntersection plane (m a)
-> m (PlanePlaneIntersection plane a)
Traversable)
instance Bifunctor PlanePlaneIntersection where
bimap :: forall a b c d.
(a -> b)
-> (c -> d)
-> PlanePlaneIntersection a c
-> PlanePlaneIntersection b d
bimap a -> b
f c -> d
g = \case
Plane_x_Plane_Line c
l -> d -> PlanePlaneIntersection b d
forall plane line. line -> PlanePlaneIntersection plane line
Plane_x_Plane_Line (d -> PlanePlaneIntersection b d)
-> d -> PlanePlaneIntersection b d
forall a b. (a -> b) -> a -> b
$ c -> d
g c
l
Plane_x_Plane_Plane a
h -> b -> PlanePlaneIntersection b d
forall plane line. plane -> PlanePlaneIntersection plane line
Plane_x_Plane_Plane (b -> PlanePlaneIntersection b d)
-> b -> PlanePlaneIntersection b d
forall a b. (a -> b) -> a -> b
$ a -> b
f a
h
instance Bifoldable PlanePlaneIntersection where
bifoldMap :: forall m a b.
Monoid m =>
(a -> m) -> (b -> m) -> PlanePlaneIntersection a b -> m
bifoldMap a -> m
f b -> m
g = \case
Plane_x_Plane_Line b
l -> b -> m
g b
l
Plane_x_Plane_Plane a
h -> a -> m
f a
h
instance Bitraversable PlanePlaneIntersection where
bitraverse :: forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c)
-> (b -> f d)
-> PlanePlaneIntersection a b
-> f (PlanePlaneIntersection c d)
bitraverse a -> f c
f b -> f d
g = \case
Plane_x_Plane_Line b
l -> d -> PlanePlaneIntersection c d
forall plane line. line -> PlanePlaneIntersection plane line
Plane_x_Plane_Line (d -> PlanePlaneIntersection c d)
-> f d -> f (PlanePlaneIntersection c d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> f d
g b
l
Plane_x_Plane_Plane a
h -> c -> PlanePlaneIntersection c d
forall plane line. plane -> PlanePlaneIntersection plane line
Plane_x_Plane_Plane (c -> PlanePlaneIntersection c d)
-> f c -> f (PlanePlaneIntersection c d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f c
f a
h
instance ( Has_ Metric_ d r, Num r, Eq r, 2 <= d, d < d + 1
, Has_ Metric_ (1+d) r
, 1 <= d, Has_ Metric_ (d + 1) r, Eq (Vector (d + 1) r), d <= d + 1
) => HasIntersectionWith (HyperPlane d r) (HyperPlane d r) where
HyperPlane d r
h intersects :: HyperPlane d r -> HyperPlane d r -> Bool
`intersects` HyperPlane d r
h' = HyperPlane d r
h HyperPlane d r -> HyperPlane d r -> Bool
forall a. Eq a => a -> a -> Bool
== HyperPlane d r
h' Bool -> Bool -> Bool
|| Bool -> Bool
not (HyperPlane d r
h HyperPlane d r -> HyperPlane d r -> Bool
forall hyperPlane (d :: Nat) r hyperPlane'.
(HyperPlane_ hyperPlane d r, HyperPlane_ hyperPlane' d r,
Has_ Metric_ d r, Num r, Eq r, 1 <= d) =>
hyperPlane -> hyperPlane' -> Bool
`isParallelTo` HyperPlane d r
h')
instance ( Has_ Metric_ d r, Num r, Eq r, 2 <= d, d < d + 1
, Has_ Metric_ (1+d) r, Has_ Additive_ (d-1) r, Eq (Vector d r)
, 1 <= d, Has_ Metric_ (d + 1) r, (1 + (d - 1) ~ d), d <= d + 1
, d -1 <= d, ((d - 1) + 1) ~ d
) => HasIntersectionWith (NonVerticalHyperPlane d r) (NonVerticalHyperPlane d r) where
NonVerticalHyperPlane d r
h intersects :: NonVerticalHyperPlane d r -> NonVerticalHyperPlane d r -> Bool
`intersects` NonVerticalHyperPlane d r
h' = NonVerticalHyperPlane d r
h NonVerticalHyperPlane d r -> NonVerticalHyperPlane d r -> Bool
forall a. Eq a => a -> a -> Bool
== NonVerticalHyperPlane d r
h' Bool -> Bool -> Bool
|| Bool -> Bool
not (NonVerticalHyperPlane d r
h NonVerticalHyperPlane d r -> NonVerticalHyperPlane d r -> Bool
forall hyperPlane (d :: Nat) r hyperPlane'.
(HyperPlane_ hyperPlane d r, HyperPlane_ hyperPlane' d r,
Has_ Metric_ d r, Num r, Eq r, 1 <= d) =>
hyperPlane -> hyperPlane' -> Bool
`isParallelTo` NonVerticalHyperPlane d r
h')
instance (Eq r, Fractional r)
=> IsIntersectableWith (Plane r) (Plane r) where
intersect :: Plane r -> Plane r -> Intersection (Plane r) (Plane r)
intersect = Plane r
-> Plane r
-> Maybe (PlanePlaneIntersection (Plane r) (VerticalOrLineEQ r))
Plane r -> Plane r -> Intersection (Plane r) (Plane r)
forall plane r.
(Plane_ plane r, Fractional r, Eq r) =>
plane
-> plane
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
planePlaneIntersection
planePlaneIntersection :: (Plane_ plane r, Fractional r, Eq r)
=> plane -> plane
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
planePlaneIntersection :: forall plane r.
(Plane_ plane r, Fractional r, Eq r) =>
plane
-> plane
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
planePlaneIntersection h :: plane
h@(Plane_ r
a1 r
b1 r
c1) (Plane_ r
a2 r
b2 r
c2)
| r
b1 r -> r -> Bool
forall a. Eq a => a -> a -> Bool
/= r
b2 = PlanePlaneIntersection plane (VerticalOrLineEQ r)
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
forall a. a -> Maybe a
Just (PlanePlaneIntersection plane (VerticalOrLineEQ r)
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r)))
-> (LineEQ r -> PlanePlaneIntersection plane (VerticalOrLineEQ r))
-> LineEQ r
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VerticalOrLineEQ r
-> PlanePlaneIntersection plane (VerticalOrLineEQ r)
forall plane line. line -> PlanePlaneIntersection plane line
Plane_x_Plane_Line (VerticalOrLineEQ r
-> PlanePlaneIntersection plane (VerticalOrLineEQ r))
-> (LineEQ r -> VerticalOrLineEQ r)
-> LineEQ r
-> PlanePlaneIntersection plane (VerticalOrLineEQ r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LineEQ r -> VerticalOrLineEQ r
forall r. LineEQ r -> VerticalOrLineEQ r
NonVertical
(LineEQ r
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r)))
-> LineEQ r
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
forall a b. (a -> b) -> a -> b
$ r -> r -> LineEQ r
forall r. r -> r -> LineEQ r
LineEQ ((r
a2 r -> r -> r
forall a. Num a => a -> a -> a
- r
a1) r -> r -> r
forall a. Fractional a => a -> a -> a
/ r
diffB) ((r
c2 r -> r -> r
forall a. Num a => a -> a -> a
- r
c1) r -> r -> r
forall a. Fractional a => a -> a -> a
/ r
diffB)
| r
a1 r -> r -> Bool
forall a. Eq a => a -> a -> Bool
/= r
a2 = PlanePlaneIntersection plane (VerticalOrLineEQ r)
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
forall a. a -> Maybe a
Just (PlanePlaneIntersection plane (VerticalOrLineEQ r)
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r)))
-> (VerticalOrLineEQ r
-> PlanePlaneIntersection plane (VerticalOrLineEQ r))
-> VerticalOrLineEQ r
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VerticalOrLineEQ r
-> PlanePlaneIntersection plane (VerticalOrLineEQ r)
forall plane line. line -> PlanePlaneIntersection plane line
Plane_x_Plane_Line
(VerticalOrLineEQ r
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r)))
-> VerticalOrLineEQ r
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
forall a b. (a -> b) -> a -> b
$ r -> VerticalOrLineEQ r
forall r. r -> VerticalOrLineEQ r
VerticalLineThrough ((r
c2 r -> r -> r
forall a. Num a => a -> a -> a
-r
c1) r -> r -> r
forall a. Fractional a => a -> a -> a
/ (r
a1 r -> r -> r
forall a. Num a => a -> a -> a
- r
a2))
| r
c1 r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
c2 = PlanePlaneIntersection plane (VerticalOrLineEQ r)
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
forall a. a -> Maybe a
Just (PlanePlaneIntersection plane (VerticalOrLineEQ r)
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r)))
-> PlanePlaneIntersection plane (VerticalOrLineEQ r)
-> Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
forall a b. (a -> b) -> a -> b
$ plane -> PlanePlaneIntersection plane (VerticalOrLineEQ r)
forall plane line. plane -> PlanePlaneIntersection plane line
Plane_x_Plane_Plane plane
h
| Bool
otherwise = Maybe (PlanePlaneIntersection plane (VerticalOrLineEQ r))
forall a. Maybe a
Nothing
where
diffB :: r
diffB = r
b1 r -> r -> r
forall a. Num a => a -> a -> a
- r
b2