{-# LANGUAGE UndecidableInstances #-}
module HGeometry.LineSegment.Class
( LineSegment_
, pattern LineSegment_
, ConstructableLineSegment_(..)
, ClosedLineSegment_
, OpenLineSegment_
, interpolate
, HasOnSegment(..)
, HasStart(..), HasEnd(..)
, HasStartPoint(..), HasEndPoint(..)
, StartPointOf, EndPointOf
, ordAtY, ordAtX
, xCoordAt, yCoordAt
, orientLR, orientBT
) where
import Control.Lens
import Data.Default
import Data.Type.Ord
import HGeometry.Ext
import HGeometry.ByIndex
import HGeometry.Interval.Class
import HGeometry.Point.Class
import HGeometry.Properties
import HGeometry.Vector
class HasOnSegment lineSegment d | lineSegment -> d where
onSegment :: ( Ord r, Point_ point d r
, r ~ NumType lineSegment, d ~ Dimension lineSegment
) => point -> lineSegment -> Bool
class ( IntervalLike_ lineSegment point
, Point_ point (Dimension lineSegment) (NumType lineSegment)
) => LineSegment_ lineSegment point | lineSegment -> point where
{-# MINIMAL #-}
class ( LineSegment_ lineSegment point
) => ConstructableLineSegment_ lineSegment point where
{-# MINIMAL uncheckedLineSegment #-}
uncheckedLineSegment :: point -> point -> lineSegment
mkLineSegment :: Eq (Vector (Dimension point) (NumType point))
=> point -> point -> Maybe lineSegment
mkLineSegment point
s point
t
| point
spoint
-> Getting
(Vector (Dimension point) (NumType point))
point
(Vector (Dimension point) (NumType point))
-> Vector (Dimension point) (NumType point)
forall s a. s -> Getting a s a -> a
^.Getting
(Vector (Dimension point) (NumType point))
point
(Vector (Dimension point) (NumType point))
forall (d :: Nat) r s.
(Dimension point ~ d, NumType point ~ r, Dimension point ~ d,
NumType point ~ s) =>
Lens point point (Vector d r) (Vector d s)
forall point point' (d :: Nat) r s.
(HasVector point point', Dimension point ~ d, NumType point ~ r,
Dimension point' ~ d, NumType point' ~ s) =>
Lens point point' (Vector d r) (Vector d s)
Lens
point
point
(Vector (Dimension point) (NumType point))
(Vector (Dimension point) (NumType point))
vector Vector (Dimension point) (NumType point)
-> Vector (Dimension point) (NumType point) -> Bool
forall a. Eq a => a -> a -> Bool
/= point
tpoint
-> Getting
(Vector (Dimension point) (NumType point))
point
(Vector (Dimension point) (NumType point))
-> Vector (Dimension point) (NumType point)
forall s a. s -> Getting a s a -> a
^.Getting
(Vector (Dimension point) (NumType point))
point
(Vector (Dimension point) (NumType point))
forall (d :: Nat) r s.
(Dimension point ~ d, NumType point ~ r, Dimension point ~ d,
NumType point ~ s) =>
Lens point point (Vector d r) (Vector d s)
forall point point' (d :: Nat) r s.
(HasVector point point', Dimension point ~ d, NumType point ~ r,
Dimension point' ~ d, NumType point' ~ s) =>
Lens point point' (Vector d r) (Vector d s)
Lens
point
point
(Vector (Dimension point) (NumType point))
(Vector (Dimension point) (NumType point))
vector = lineSegment -> Maybe lineSegment
forall a. a -> Maybe a
Just (lineSegment -> Maybe lineSegment)
-> lineSegment -> Maybe lineSegment
forall a b. (a -> b) -> a -> b
$ point -> point -> lineSegment
forall lineSegment point.
ConstructableLineSegment_ lineSegment point =>
point -> point -> lineSegment
uncheckedLineSegment point
s point
t
| Bool
otherwise = Maybe lineSegment
forall a. Maybe a
Nothing
class ( LineSegment_ lineSegment point
, StartPointOf lineSegment ~ EndPoint Closed point
, EndPointOf lineSegment ~ EndPoint Closed point
) => ClosedLineSegment_ lineSegment point where
class ( LineSegment_ lineSegment point
, StartPointOf lineSegment ~ EndPoint Open point
, EndPointOf lineSegment ~ EndPoint Open point
) => OpenLineSegment_ lineSegment point where
pattern LineSegment_ :: forall lineSegment point. LineSegment_ lineSegment point
=> point -> point -> lineSegment
pattern $mLineSegment_ :: forall {r} {lineSegment} {point}.
LineSegment_ lineSegment point =>
lineSegment -> (point -> point -> r) -> ((# #) -> r) -> r
LineSegment_ s t <- (startAndEnd -> (s,t))
{-# COMPLETE LineSegment_ #-}
interpolate :: forall lineSegment d point r
. ( Fractional r, LineSegment_ lineSegment point
, ConstructablePoint_ point d r
)
=> r -> lineSegment -> point
interpolate :: forall lineSegment (d :: Nat) point r.
(Fractional r, LineSegment_ lineSegment point,
ConstructablePoint_ point d r) =>
r -> lineSegment -> point
interpolate r
lam (LineSegment_ point
s point
t) =
Vector (Dimension point) (NumType point) -> point
forall point (d :: Nat) r.
ConstructablePoint_ point d r =>
Vector d r -> point
fromVector (Vector (Dimension point) (NumType point) -> point)
-> Vector (Dimension point) (NumType point) -> point
forall a b. (a -> b) -> a -> b
$ (point
spoint
-> Getting
(Vector (Dimension point) (NumType point))
point
(Vector (Dimension point) (NumType point))
-> Vector (Dimension point) (NumType point)
forall s a. s -> Getting a s a -> a
^.Getting
(Vector (Dimension point) (NumType point))
point
(Vector (Dimension point) (NumType point))
forall (d :: Nat) r s.
(Dimension point ~ d, NumType point ~ r, Dimension point ~ d,
NumType point ~ s) =>
Lens point point (Vector d r) (Vector d s)
forall point point' (d :: Nat) r s.
(HasVector point point', Dimension point ~ d, NumType point ~ r,
Dimension point' ~ d, NumType point' ~ s) =>
Lens point point' (Vector d r) (Vector d s)
Lens
point
point
(Vector (Dimension point) (NumType point))
(Vector (Dimension point) (NumType point))
vector Vector (Dimension point) (NumType point)
-> r -> Vector (Dimension point) (NumType point)
forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
vector -> r -> vector
^* (r
1r -> r -> r
forall a. Num a => a -> a -> a
-r
lam)) Vector (Dimension point) (NumType point)
-> Vector (Dimension point) (NumType point)
-> Vector (Dimension point) (NumType point)
forall r vector (d :: Nat).
(Num r, Additive_ vector d r) =>
vector -> vector -> vector
^+^ (point
tpoint
-> Getting
(Vector (Dimension point) (NumType point))
point
(Vector (Dimension point) (NumType point))
-> Vector (Dimension point) (NumType point)
forall s a. s -> Getting a s a -> a
^.Getting
(Vector (Dimension point) (NumType point))
point
(Vector (Dimension point) (NumType point))
forall (d :: Nat) r s.
(Dimension point ~ d, NumType point ~ r, Dimension point ~ d,
NumType point ~ s) =>
Lens point point (Vector d r) (Vector d s)
forall point point' (d :: Nat) r s.
(HasVector point point', Dimension point ~ d, NumType point ~ r,
Dimension point' ~ d, NumType point' ~ s) =>
Lens point point' (Vector d r) (Vector d s)
Lens
point
point
(Vector (Dimension point) (NumType point))
(Vector (Dimension point) (NumType point))
vector Vector (Dimension point) (NumType point)
-> r -> Vector (Dimension point) (NumType point)
forall r vector (d :: Nat).
(Num r, Vector_ vector d r) =>
vector -> r -> vector
^* r
lam)
ordAtY :: (Num r, Ord r, LineSegment_ lineSegment point, Point_ point 2 r)
=> r
-> lineSegment -> lineSegment -> Ordering
ordAtY :: forall r lineSegment point.
(Num r, Ord r, LineSegment_ lineSegment point, Point_ point 2 r) =>
r -> lineSegment -> lineSegment -> Ordering
ordAtY r
y lineSegment
seg1 lineSegment
seg2 = r -> lineSegment -> lineSegment -> Ordering
forall r lineSegment point.
(Num r, Ord r, LineSegment_ lineSegment point, Point_ point 2 r) =>
r -> lineSegment -> lineSegment -> Ordering
ordAtX (-r
y) (lineSegment -> lineSegment
forall {p} {p} {b}.
(Dimension p ~ 2, Dimension p ~ 2, HasStart b p, HasEnd b p,
HasVector p p, HasVector p p, Num (NumType p), Num (NumType p)) =>
b -> b
flipPlane lineSegment
seg1) (lineSegment -> lineSegment
forall {p} {p} {b}.
(Dimension p ~ 2, Dimension p ~ 2, HasStart b p, HasEnd b p,
HasVector p p, HasVector p p, Num (NumType p), Num (NumType p)) =>
b -> b
flipPlane lineSegment
seg2)
where
rot90 :: Vector 2 r -> Vector 2 r
rot90 (Vector2 r
x' r
y') = r -> r -> Vector 2 r
forall r. r -> r -> Vector 2 r
Vector2 (-r
y') r
x'
flipPlane :: b -> b
flipPlane b
seg = b
segb -> (b -> b) -> b
forall a b. a -> (a -> b) -> b
&(p -> Identity p) -> b -> Identity b
forall seg p. HasStart seg p => Lens' seg p
Lens' b p
start((p -> Identity p) -> b -> Identity b)
-> ((Vector 2 (NumType p) -> Identity (Vector 2 (NumType p)))
-> p -> Identity p)
-> (Vector 2 (NumType p) -> Identity (Vector 2 (NumType p)))
-> b
-> Identity b
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Vector 2 (NumType p) -> Identity (Vector 2 (NumType p)))
-> p -> Identity p
forall (d :: Nat) r s.
(Dimension p ~ d, NumType p ~ r, Dimension p ~ d, NumType p ~ s) =>
Lens p p (Vector d r) (Vector d s)
forall point point' (d :: Nat) r s.
(HasVector point point', Dimension point ~ d, NumType point ~ r,
Dimension point' ~ d, NumType point' ~ s) =>
Lens point point' (Vector d r) (Vector d s)
Lens p p (Vector 2 (NumType p)) (Vector 2 (NumType p))
vector ((Vector 2 (NumType p) -> Identity (Vector 2 (NumType p)))
-> b -> Identity b)
-> (Vector 2 (NumType p) -> Vector 2 (NumType p)) -> b -> b
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Vector 2 (NumType p) -> Vector 2 (NumType p)
forall {r}. Num r => Vector 2 r -> Vector 2 r
rot90
b -> (b -> b) -> b
forall a b. a -> (a -> b) -> b
&(p -> Identity p) -> b -> Identity b
forall seg p. HasEnd seg p => Lens' seg p
Lens' b p
end((p -> Identity p) -> b -> Identity b)
-> ((Vector 2 (NumType p) -> Identity (Vector 2 (NumType p)))
-> p -> Identity p)
-> (Vector 2 (NumType p) -> Identity (Vector 2 (NumType p)))
-> b
-> Identity b
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Vector 2 (NumType p) -> Identity (Vector 2 (NumType p)))
-> p -> Identity p
forall (d :: Nat) r s.
(Dimension p ~ d, NumType p ~ r, Dimension p ~ d, NumType p ~ s) =>
Lens p p (Vector d r) (Vector d s)
forall point point' (d :: Nat) r s.
(HasVector point point', Dimension point ~ d, NumType point ~ r,
Dimension point' ~ d, NumType point' ~ s) =>
Lens point point' (Vector d r) (Vector d s)
Lens p p (Vector 2 (NumType p)) (Vector 2 (NumType p))
vector ((Vector 2 (NumType p) -> Identity (Vector 2 (NumType p)))
-> b -> Identity b)
-> (Vector 2 (NumType p) -> Vector 2 (NumType p)) -> b -> b
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Vector 2 (NumType p) -> Vector 2 (NumType p)
forall {r}. Num r => Vector 2 r -> Vector 2 r
rot90
xCoordAt :: (Fractional r, Ord r, LineSegment_ lineSegment point, Point_ point 2 r)
=> r -> lineSegment -> r
xCoordAt :: forall r lineSegment point.
(Fractional r, Ord r, LineSegment_ lineSegment point,
Point_ point 2 r) =>
r -> lineSegment -> r
xCoordAt r
y (LineSegment_ (Point2_ r
px r
py) (Point2_ r
qx r
qy))
| r
py r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
qy = r
px r -> r -> r
forall a. Ord a => a -> a -> a
`max` r
qx
| Bool
otherwise = r
px r -> r -> r
forall a. Num a => a -> a -> a
+ r
alpha r -> r -> r
forall a. Num a => a -> a -> a
* (r
qx r -> r -> r
forall a. Num a => a -> a -> a
- r
px)
where
alpha :: r
alpha = (r
y r -> r -> r
forall a. Num a => a -> a -> a
- r
py) r -> r -> r
forall a. Fractional a => a -> a -> a
/ (r
qy r -> r -> r
forall a. Num a => a -> a -> a
- r
py)
ordAtX :: ( Num r, Ord r, LineSegment_ lineSegment point, Point_ point 2 r)
=> r
-> lineSegment -> lineSegment -> Ordering
ordAtX :: forall r lineSegment point.
(Num r, Ord r, LineSegment_ lineSegment point, Point_ point 2 r) =>
r -> lineSegment -> lineSegment -> Ordering
ordAtX r
x (lineSegment -> lineSegment
forall lineSegment point (d :: Nat) r.
(LineSegment_ lineSegment point, Point_ point d r, 1 <= d,
Ord r) =>
lineSegment -> lineSegment
orientLR -> LineSegment_ (Point2_ r
px r
py) (Point2_ r
qx r
qy))
(lineSegment -> lineSegment
forall lineSegment point (d :: Nat) r.
(LineSegment_ lineSegment point, Point_ point d r, 1 <= d,
Ord r) =>
lineSegment -> lineSegment
orientLR -> LineSegment_ (Point2_ r
ax r
ay) (Point2_ r
bx r
by)) =
case (Bool
pqVertical,Bool
abVertical) of
(Bool
True,Bool
True) -> r
pqTop r -> r -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` r
abTop
(Bool
True,Bool
False) -> (r
pqTopr -> r -> r
forall a. Num a => a -> a -> a
*(r
bxr -> r -> r
forall a. Num a => a -> a -> a
-r
ax)) r -> r -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` r
abTerm
(Bool
False,Bool
True) -> r
pqTerm r -> r -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` (r
abTopr -> r -> r
forall a. Num a => a -> a -> a
*(r
qxr -> r -> r
forall a. Num a => a -> a -> a
-r
px))
(Bool
False,Bool
False) -> r
term1 r -> r -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` r
term2
where
pqVertical :: Bool
pqVertical = r
px r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
qx
abVertical :: Bool
abVertical = r
ax r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
bx
pqTop :: r
pqTop = r
py r -> r -> r
forall a. Ord a => a -> a -> a
`max` r
qy
abTop :: r
abTop = r
ay r -> r -> r
forall a. Ord a => a -> a -> a
`max` r
by
pqTerm :: r
pqTerm = r
pyr -> r -> r
forall a. Num a => a -> a -> a
*(r
qxr -> r -> r
forall a. Num a => a -> a -> a
-r
px) r -> r -> r
forall a. Num a => a -> a -> a
+ (r
xr -> r -> r
forall a. Num a => a -> a -> a
-r
px)r -> r -> r
forall a. Num a => a -> a -> a
*(r
qyr -> r -> r
forall a. Num a => a -> a -> a
-r
py)
abTerm :: r
abTerm = r
ayr -> r -> r
forall a. Num a => a -> a -> a
*(r
bxr -> r -> r
forall a. Num a => a -> a -> a
-r
ax) r -> r -> r
forall a. Num a => a -> a -> a
+ (r
xr -> r -> r
forall a. Num a => a -> a -> a
-r
ax)r -> r -> r
forall a. Num a => a -> a -> a
*(r
byr -> r -> r
forall a. Num a => a -> a -> a
-r
ay)
term1 :: r
term1 = (r
bxr -> r -> r
forall a. Num a => a -> a -> a
-r
ax) r -> r -> r
forall a. Num a => a -> a -> a
* r
pqTerm
term2 :: r
term2 = (r
qxr -> r -> r
forall a. Num a => a -> a -> a
-r
px) r -> r -> r
forall a. Num a => a -> a -> a
* r
abTerm
orientLR :: (LineSegment_ lineSegment point, Point_ point d r, 1 <= d, Ord r)
=> lineSegment -> lineSegment
orientLR :: forall lineSegment point (d :: Nat) r.
(LineSegment_ lineSegment point, Point_ point d r, 1 <= d,
Ord r) =>
lineSegment -> lineSegment
orientLR lineSegment
seg
| lineSegment
seglineSegment -> Getting r lineSegment r -> r
forall s a. s -> Getting a s a -> a
^.(point -> Const r point) -> lineSegment -> Const r lineSegment
forall seg p. HasStart seg p => Lens' seg p
Lens' lineSegment point
start((point -> Const r point) -> lineSegment -> Const r lineSegment)
-> ((r -> Const r r) -> point -> Const r point)
-> Getting r lineSegment r
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(r -> Const r r) -> point -> Const r point
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. Ord a => a -> a -> Bool
<= lineSegment
seglineSegment -> Getting r lineSegment r -> r
forall s a. s -> Getting a s a -> a
^.(point -> Const r point) -> lineSegment -> Const r lineSegment
forall seg p. HasEnd seg p => Lens' seg p
Lens' lineSegment point
end((point -> Const r point) -> lineSegment -> Const r lineSegment)
-> ((r -> Const r r) -> point -> Const r point)
-> Getting r lineSegment r
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(r -> Const r r) -> point -> Const r point
forall (d :: Nat) point r.
(1 <= d, Point_ point d r) =>
IndexedLens' Int point r
IndexedLens' Int point r
xCoord = lineSegment
seg
| Bool
otherwise = lineSegment
seglineSegment -> (lineSegment -> lineSegment) -> lineSegment
forall a b. a -> (a -> b) -> b
&(point -> Identity point) -> lineSegment -> Identity lineSegment
forall seg p. HasStart seg p => Lens' seg p
Lens' lineSegment point
start ((point -> Identity point) -> lineSegment -> Identity lineSegment)
-> point -> lineSegment -> lineSegment
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (lineSegment
seglineSegment -> Getting point lineSegment point -> point
forall s a. s -> Getting a s a -> a
^.Getting point lineSegment point
forall seg p. HasEnd seg p => Lens' seg p
Lens' lineSegment point
end)
lineSegment -> (lineSegment -> lineSegment) -> lineSegment
forall a b. a -> (a -> b) -> b
&(point -> Identity point) -> lineSegment -> Identity lineSegment
forall seg p. HasEnd seg p => Lens' seg p
Lens' lineSegment point
end ((point -> Identity point) -> lineSegment -> Identity lineSegment)
-> point -> lineSegment -> lineSegment
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (lineSegment
seglineSegment -> Getting point lineSegment point -> point
forall s a. s -> Getting a s a -> a
^.Getting point lineSegment point
forall seg p. HasStart seg p => Lens' seg p
Lens' lineSegment point
start)
orientBT :: (LineSegment_ lineSegment point, Point_ point d r, 2 <= d, Ord r)
=> lineSegment -> lineSegment
orientBT :: forall lineSegment point (d :: Nat) r.
(LineSegment_ lineSegment point, Point_ point d r, 2 <= d,
Ord r) =>
lineSegment -> lineSegment
orientBT lineSegment
seg
| lineSegment
seglineSegment -> Getting r lineSegment r -> r
forall s a. s -> Getting a s a -> a
^.(point -> Const r point) -> lineSegment -> Const r lineSegment
forall seg p. HasStart seg p => Lens' seg p
Lens' lineSegment point
start((point -> Const r point) -> lineSegment -> Const r lineSegment)
-> ((r -> Const r r) -> point -> Const r point)
-> Getting r lineSegment r
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(r -> Const r r) -> point -> Const r point
forall (d :: Nat) point r.
(2 <= d, Point_ point d r) =>
IndexedLens' Int point r
IndexedLens' Int point r
yCoord r -> r -> Bool
forall a. Ord a => a -> a -> Bool
<= lineSegment
seglineSegment -> Getting r lineSegment r -> r
forall s a. s -> Getting a s a -> a
^.(point -> Const r point) -> lineSegment -> Const r lineSegment
forall seg p. HasEnd seg p => Lens' seg p
Lens' lineSegment point
end((point -> Const r point) -> lineSegment -> Const r lineSegment)
-> ((r -> Const r r) -> point -> Const r point)
-> Getting r lineSegment r
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(r -> Const r r) -> point -> Const r point
forall (d :: Nat) point r.
(2 <= d, Point_ point d r) =>
IndexedLens' Int point r
IndexedLens' Int point r
yCoord = lineSegment
seg
| Bool
otherwise = lineSegment
seglineSegment -> (lineSegment -> lineSegment) -> lineSegment
forall a b. a -> (a -> b) -> b
&(point -> Identity point) -> lineSegment -> Identity lineSegment
forall seg p. HasStart seg p => Lens' seg p
Lens' lineSegment point
start ((point -> Identity point) -> lineSegment -> Identity lineSegment)
-> point -> lineSegment -> lineSegment
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (lineSegment
seglineSegment -> Getting point lineSegment point -> point
forall s a. s -> Getting a s a -> a
^.Getting point lineSegment point
forall seg p. HasEnd seg p => Lens' seg p
Lens' lineSegment point
end)
lineSegment -> (lineSegment -> lineSegment) -> lineSegment
forall a b. a -> (a -> b) -> b
&(point -> Identity point) -> lineSegment -> Identity lineSegment
forall seg p. HasEnd seg p => Lens' seg p
Lens' lineSegment point
end ((point -> Identity point) -> lineSegment -> Identity lineSegment)
-> point -> lineSegment -> lineSegment
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (lineSegment
seglineSegment -> Getting point lineSegment point -> point
forall s a. s -> Getting a s a -> a
^.Getting point lineSegment point
forall seg p. HasStart seg p => Lens' seg p
Lens' lineSegment point
start)
yCoordAt :: ( Fractional r, Ord r, LineSegment_ lineSegment point, Point_ point 2 r)
=> r -> lineSegment -> r
yCoordAt :: forall r lineSegment point.
(Fractional r, Ord r, LineSegment_ lineSegment point,
Point_ point 2 r) =>
r -> lineSegment -> r
yCoordAt r
x (LineSegment_ (Point2_ r
px r
py) (Point2_ r
qx r
qy))
| r
px r -> r -> Bool
forall a. Eq a => a -> a -> Bool
== r
qx = r
py r -> r -> r
forall a. Ord a => a -> a -> a
`max` r
qy
| Bool
otherwise = r
py r -> r -> r
forall a. Num a => a -> a -> a
+ r
alpha r -> r -> r
forall a. Num a => a -> a -> a
* (r
qy r -> r -> r
forall a. Num a => a -> a -> a
- r
py)
where
alpha :: r
alpha = (r
x r -> r -> r
forall a. Num a => a -> a -> a
- r
px) r -> r -> r
forall a. Fractional a => a -> a -> a
/ (r
qx r -> r -> r
forall a. Num a => a -> a -> a
- r
px)
instance ( LineSegment_ segment point
) => LineSegment_ (segment :+ extra) point where
instance ( ConstructableLineSegment_ segment point
, Default extra
) => ConstructableLineSegment_ (segment :+ extra) point where
uncheckedLineSegment :: point -> point -> segment :+ extra
uncheckedLineSegment point
p point
q = point -> point -> segment
forall lineSegment point.
ConstructableLineSegment_ lineSegment point =>
point -> point -> lineSegment
uncheckedLineSegment point
p point
q segment -> extra -> segment :+ extra
forall core extra. core -> extra -> core :+ extra
:+ extra
forall a. Default a => a
def
instance ( ClosedLineSegment_ segment point
) => ClosedLineSegment_ (segment :+ extra) point where
instance ( OpenLineSegment_ segment point
) => OpenLineSegment_ (segment :+ extra) point where
instance HasOnSegment lineSegment d => HasOnSegment (lineSegment :+ extra) d where
onSegment :: forall r point.
(Ord r, Point_ point d r, r ~ NumType (lineSegment :+ extra),
d ~ Dimension (lineSegment :+ extra)) =>
point -> (lineSegment :+ extra) -> Bool
onSegment point
q (lineSegment
s :+ extra
_) = point
q point -> lineSegment -> Bool
forall lineSegment (d :: Nat) r point.
(HasOnSegment lineSegment d, Ord r, Point_ point d r,
r ~ NumType lineSegment, d ~ Dimension lineSegment) =>
point -> lineSegment -> Bool
forall r point.
(Ord r, Point_ point d r, r ~ NumType lineSegment,
d ~ Dimension lineSegment) =>
point -> lineSegment -> Bool
`onSegment` lineSegment
s
instance LineSegment_ lineSegment point => LineSegment_ (ByIndex ix lineSegment) point
instance HasOnSegment lineSegment d => HasOnSegment (ByIndex ix lineSegment) d where
onSegment :: forall r point.
(Ord r, Point_ point d r, r ~ NumType (ByIndex ix lineSegment),
d ~ Dimension (ByIndex ix lineSegment)) =>
point -> ByIndex ix lineSegment -> Bool
onSegment point
q = point -> lineSegment -> Bool
forall lineSegment (d :: Nat) r point.
(HasOnSegment lineSegment d, Ord r, Point_ point d r,
r ~ NumType lineSegment, d ~ Dimension lineSegment) =>
point -> lineSegment -> Bool
forall r point.
(Ord r, Point_ point (Dimension lineSegment) r,
r ~ NumType lineSegment,
Dimension lineSegment ~ Dimension lineSegment) =>
point -> lineSegment -> Bool
onSegment point
q (lineSegment -> Bool)
-> (ByIndex ix lineSegment -> lineSegment)
-> ByIndex ix lineSegment
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting lineSegment (ByIndex ix lineSegment) lineSegment
-> ByIndex ix lineSegment -> lineSegment
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting lineSegment (ByIndex ix lineSegment) lineSegment
forall ix a1 a2 (f :: * -> *).
Functor f =>
(a1 -> f a2) -> ByIndex ix a1 -> f (ByIndex ix a2)
theValue