{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Diagrams.TwoD.Path.Follow
( Following, follow, unfollow
) where
import Diagrams.Prelude
import Data.Monoid.SemiDirectProduct.Strict
newtype Following n
= Following { forall n. Following n -> Semi (Trail' Line V2 n) (Angle n)
unFollowing :: Semi (Trail' Line V2 n) (Angle n) }
deriving (Following n
[Following n] -> Following n
Following n -> Following n -> Following n
forall {n}. (Floating n, Ord n) => Semigroup (Following n)
forall n. (Floating n, Ord n) => Following n
forall n. (Floating n, Ord n) => [Following n] -> Following n
forall n.
(Floating n, Ord n) =>
Following n -> Following n -> Following n
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
mconcat :: [Following n] -> Following n
$cmconcat :: forall n. (Floating n, Ord n) => [Following n] -> Following n
mappend :: Following n -> Following n -> Following n
$cmappend :: forall n.
(Floating n, Ord n) =>
Following n -> Following n -> Following n
mempty :: Following n
$cmempty :: forall n. (Floating n, Ord n) => Following n
Monoid, NonEmpty (Following n) -> Following n
Following n -> Following n -> Following n
forall n.
(Floating n, Ord n) =>
NonEmpty (Following n) -> Following n
forall n.
(Floating n, Ord n) =>
Following n -> Following n -> Following n
forall n b.
(Floating n, Ord n, Integral b) =>
b -> Following n -> Following n
forall b. Integral b => b -> Following n -> Following n
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: forall b. Integral b => b -> Following n -> Following n
$cstimes :: forall n b.
(Floating n, Ord n, Integral b) =>
b -> Following n -> Following n
sconcat :: NonEmpty (Following n) -> Following n
$csconcat :: forall n.
(Floating n, Ord n) =>
NonEmpty (Following n) -> Following n
<> :: Following n -> Following n -> Following n
$c<> :: forall n.
(Floating n, Ord n) =>
Following n -> Following n -> Following n
Semigroup)
instance RealFloat n => Wrapped (Following n) where
type Unwrapped (Following n) = Trail' Line V2 n
_Wrapped' :: Iso' (Following n) (Unwrapped (Following n))
_Wrapped' = forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso forall n. Following n -> Trail' Line V2 n
unfollow forall n. RealFloat n => Trail' Line V2 n -> Following n
follow
instance RealFloat n => Rewrapped (Following n) (Following n')
follow :: RealFloat n => Trail' Line V2 n -> Following n
follow :: forall n. RealFloat n => Trail' Line V2 n -> Following n
follow Trail' Line V2 n
t = forall n. Semi (Trail' Line V2 n) (Angle n) -> Following n
Following forall a b. (a -> b) -> a -> b
$ (Trail' Line V2 n
t forall a b. a -> (a -> b) -> b
# forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
Angle n -> t -> t
rotate (forall n. RealFloat n => V2 n -> V2 n -> Angle n
signedAngleBetween forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX Vn (Trail' Line V2 n)
s)) forall s m. s -> m -> Semi s m
`tag` Angle n
theta
where
s :: Vn (Trail' Line V2 n)
s = forall t. EndValues (Tangent t) => t -> Vn t
tangentAtStart Trail' Line V2 n
t
e :: Vn (Trail' Line V2 n)
e = forall t. EndValues (Tangent t) => t -> Vn t
tangentAtEnd Trail' Line V2 n
t
theta :: Angle n
theta = forall n. RealFloat n => V2 n -> V2 n -> Angle n
signedAngleBetween Vn (Trail' Line V2 n)
e Vn (Trail' Line V2 n)
s
unfollow :: Following n -> Trail' Line V2 n
unfollow :: forall n. Following n -> Trail' Line V2 n
unfollow = forall s m. Semi s m -> s
untag forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. Following n -> Semi (Trail' Line V2 n) (Angle n)
unFollowing