{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Path
(
PathData (..),
pointPath,
movePath,
scalePath,
projectPath,
projectPaths,
pathBoxes,
pathBox,
ArcInfo (..),
ArcPosition (..),
ArcCentroid (..),
arcCentroid,
arcPosition,
arcBox,
arcDerivs,
ellipse,
QuadPosition (..),
QuadPolar (..),
quadPosition,
quadPolar,
quadBox,
quadBezier,
quadDerivs,
CubicPosition (..),
CubicPolar (..),
cubicPosition,
cubicPolar,
cubicBox,
cubicBezier,
cubicDerivs,
singletonCubic,
singletonQuad,
singletonArc,
singletonPie,
)
where
import Chart.Data
import GHC.Generics
import Geom2D.CubicBezier qualified as B
import NumHask.Prelude
import NumHask.Space hiding (rw, rx, ry, rz)
data PathData a
=
StartP (Point a)
|
LineP (Point a)
|
CubicP (Point a) (Point a) (Point a)
|
QuadP (Point a) (Point a)
|
ArcP (ArcInfo a) (Point a)
deriving (Int -> PathData a -> ShowS
[PathData a] -> ShowS
PathData a -> String
(Int -> PathData a -> ShowS)
-> (PathData a -> String)
-> ([PathData a] -> ShowS)
-> Show (PathData a)
forall a. (Ord a, Additive a, Show a) => Int -> PathData a -> ShowS
forall a. (Ord a, Additive a, Show a) => [PathData a] -> ShowS
forall a. (Ord a, Additive a, Show a) => PathData a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. (Ord a, Additive a, Show a) => Int -> PathData a -> ShowS
showsPrec :: Int -> PathData a -> ShowS
$cshow :: forall a. (Ord a, Additive a, Show a) => PathData a -> String
show :: PathData a -> String
$cshowList :: forall a. (Ord a, Additive a, Show a) => [PathData a] -> ShowS
showList :: [PathData a] -> ShowS
Show, PathData a -> PathData a -> Bool
(PathData a -> PathData a -> Bool)
-> (PathData a -> PathData a -> Bool) -> Eq (PathData a)
forall a. Eq a => PathData a -> PathData a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => PathData a -> PathData a -> Bool
== :: PathData a -> PathData a -> Bool
$c/= :: forall a. Eq a => PathData a -> PathData a -> Bool
/= :: PathData a -> PathData a -> Bool
Eq, (forall x. PathData a -> Rep (PathData a) x)
-> (forall x. Rep (PathData a) x -> PathData a)
-> Generic (PathData a)
forall x. Rep (PathData a) x -> PathData a
forall x. PathData a -> Rep (PathData a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (PathData a) x -> PathData a
forall a x. PathData a -> Rep (PathData a) x
$cfrom :: forall a x. PathData a -> Rep (PathData a) x
from :: forall x. PathData a -> Rep (PathData a) x
$cto :: forall a x. Rep (PathData a) x -> PathData a
to :: forall x. Rep (PathData a) x -> PathData a
Generic)
pointPath :: PathData a -> Point a
pointPath :: forall a. PathData a -> Point a
pointPath (StartP Point a
p) = Point a
p
pointPath (LineP Point a
p) = Point a
p
pointPath (CubicP Point a
_ Point a
_ Point a
p) = Point a
p
pointPath (QuadP Point a
_ Point a
p) = Point a
p
pointPath (ArcP ArcInfo a
_ Point a
p) = Point a
p
movePath :: (Additive a) => Point a -> PathData a -> PathData a
movePath :: forall a. Additive a => Point a -> PathData a -> PathData a
movePath Point a
x (StartP Point a
p) = Point a -> PathData a
forall a. Point a -> PathData a
StartP (Point a
p Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
x)
movePath Point a
x (LineP Point a
p) = Point a -> PathData a
forall a. Point a -> PathData a
LineP (Point a
p Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
x)
movePath Point a
x (CubicP Point a
c1 Point a
c2 Point a
p) = Point a -> Point a -> Point a -> PathData a
forall a. Point a -> Point a -> Point a -> PathData a
CubicP (Point a
c1 Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
x) (Point a
c2 Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
x) (Point a
p Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
x)
movePath Point a
x (QuadP Point a
c Point a
p) = Point a -> Point a -> PathData a
forall a. Point a -> Point a -> PathData a
QuadP (Point a
c Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
x) (Point a
p Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
x)
movePath Point a
x (ArcP ArcInfo a
i Point a
p) = ArcInfo a -> Point a -> PathData a
forall a. ArcInfo a -> Point a -> PathData a
ArcP ArcInfo a
i (Point a
p Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
x)
scalePath :: (Multiplicative a) => a -> PathData a -> PathData a
scalePath :: forall a. Multiplicative a => a -> PathData a -> PathData a
scalePath a
x (StartP Point a
p) = Point a -> PathData a
forall a. Point a -> PathData a
StartP ((a -> a) -> Point a -> Point a
forall a b. (a -> b) -> Point a -> Point b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a
x *) Point a
p)
scalePath a
x (LineP Point a
p) = Point a -> PathData a
forall a. Point a -> PathData a
LineP ((a -> a) -> Point a -> Point a
forall a b. (a -> b) -> Point a -> Point b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a
x *) Point a
p)
scalePath a
x (CubicP Point a
c1 Point a
c2 Point a
p) = Point a -> Point a -> Point a -> PathData a
forall a. Point a -> Point a -> Point a -> PathData a
CubicP ((a -> a) -> Point a -> Point a
forall a b. (a -> b) -> Point a -> Point b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a
x *) Point a
c1) ((a -> a) -> Point a -> Point a
forall a b. (a -> b) -> Point a -> Point b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a
x *) Point a
c2) ((a -> a) -> Point a -> Point a
forall a b. (a -> b) -> Point a -> Point b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a
x *) Point a
p)
scalePath a
x (QuadP Point a
c Point a
p) = Point a -> Point a -> PathData a
forall a. Point a -> Point a -> PathData a
QuadP ((a -> a) -> Point a -> Point a
forall a b. (a -> b) -> Point a -> Point b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a
x *) Point a
c) ((a -> a) -> Point a -> Point a
forall a b. (a -> b) -> Point a -> Point b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a
x *) Point a
p)
scalePath a
x (ArcP ArcInfo a
i Point a
p) = ArcInfo a -> Point a -> PathData a
forall a. ArcInfo a -> Point a -> PathData a
ArcP ArcInfo a
i ((a -> a) -> Point a -> Point a
forall a b. (a -> b) -> Point a -> Point b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a
x *) Point a
p)
projectPaths :: Rect Double -> Rect Double -> [PathData Double] -> [PathData Double]
projectPaths :: Rect Double
-> Rect Double -> [PathData Double] -> [PathData Double]
projectPaths Rect Double
new Rect Double
old [PathData Double]
ps = (Point Double, [PathData Double]) -> [PathData Double]
forall a b. (a, b) -> b
snd ((Point Double, [PathData Double]) -> [PathData Double])
-> (Point Double, [PathData Double]) -> [PathData Double]
forall a b. (a -> b) -> a -> b
$ (Point Double
-> PathData Double -> (Point Double, PathData Double))
-> Point Double
-> [PathData Double]
-> (Point Double, [PathData Double])
forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumL (\Point Double
s PathData Double
a -> let d :: PathData Double
d = Rect Double
-> Rect Double
-> Point Double
-> PathData Double
-> PathData Double
projectPath Rect Double
new Rect Double
old Point Double
s PathData Double
a in (PathData Double -> Point Double
forall a. PathData a -> Point a
pointPath PathData Double
d, PathData Double
d)) Point Double
forall a. Additive a => a
zero [PathData Double]
ps
projectPath ::
Rect Double ->
Rect Double ->
Point Double ->
PathData Double ->
PathData Double
projectPath :: Rect Double
-> Rect Double
-> Point Double
-> PathData Double
-> PathData Double
projectPath Rect Double
new Rect Double
old Point Double
_ (CubicP Point Double
c1 Point Double
c2 Point Double
p) =
Point Double -> Point Double -> Point Double -> PathData Double
forall a. Point a -> Point a -> Point a -> PathData a
CubicP (Rect Double -> Rect Double -> Point Double -> Point Double
projectOnP Rect Double
new Rect Double
old Point Double
c1) (Rect Double -> Rect Double -> Point Double -> Point Double
projectOnP Rect Double
new Rect Double
old Point Double
c2) (Rect Double -> Rect Double -> Point Double -> Point Double
projectOnP Rect Double
new Rect Double
old Point Double
p)
projectPath Rect Double
new Rect Double
old Point Double
_ (QuadP Point Double
c Point Double
p) =
Point Double -> Point Double -> PathData Double
forall a. Point a -> Point a -> PathData a
QuadP (Rect Double -> Rect Double -> Point Double -> Point Double
projectOnP Rect Double
new Rect Double
old Point Double
c) (Rect Double -> Rect Double -> Point Double -> Point Double
projectOnP Rect Double
new Rect Double
old Point Double
p)
projectPath Rect Double
new Rect Double
old Point Double
p1 (ArcP ArcInfo Double
ai Point Double
p2) = ArcInfo Double -> Point Double -> PathData Double
forall a. ArcInfo a -> Point a -> PathData a
ArcP (Rect Double -> Rect Double -> ArcPosition Double -> ArcInfo Double
projectArcPosition Rect Double
new Rect Double
old (Point Double
-> Point Double -> ArcInfo Double -> ArcPosition Double
forall a. Point a -> Point a -> ArcInfo a -> ArcPosition a
ArcPosition Point Double
p1 Point Double
p2 ArcInfo Double
ai)) (Rect Double -> Rect Double -> Point Double -> Point Double
projectOnP Rect Double
new Rect Double
old Point Double
p2)
projectPath Rect Double
new Rect Double
old Point Double
_ (LineP Point Double
p) = Point Double -> PathData Double
forall a. Point a -> PathData a
LineP (Rect Double -> Rect Double -> Point Double -> Point Double
projectOnP Rect Double
new Rect Double
old Point Double
p)
projectPath Rect Double
new Rect Double
old Point Double
_ (StartP Point Double
p) = Point Double -> PathData Double
forall a. Point a -> PathData a
StartP (Rect Double -> Rect Double -> Point Double -> Point Double
projectOnP Rect Double
new Rect Double
old Point Double
p)
singletonCubic :: CubicPosition Double -> [PathData Double]
singletonCubic :: CubicPosition Double -> [PathData Double]
singletonCubic (CubicPosition Point Double
s Point Double
e Point Double
c1 Point Double
c2) = [Point Double -> PathData Double
forall a. Point a -> PathData a
StartP Point Double
s, Point Double -> Point Double -> Point Double -> PathData Double
forall a. Point a -> Point a -> Point a -> PathData a
CubicP Point Double
c1 Point Double
c2 Point Double
e]
singletonQuad :: QuadPosition Double -> [PathData Double]
singletonQuad :: QuadPosition Double -> [PathData Double]
singletonQuad (QuadPosition Point Double
s Point Double
e Point Double
c) = [Point Double -> PathData Double
forall a. Point a -> PathData a
StartP Point Double
s, Point Double -> Point Double -> PathData Double
forall a. Point a -> Point a -> PathData a
QuadP Point Double
c Point Double
e]
singletonArc :: ArcPosition Double -> [PathData Double]
singletonArc :: ArcPosition Double -> [PathData Double]
singletonArc (ArcPosition Point Double
s Point Double
e ArcInfo Double
i) = [Point Double -> PathData Double
forall a. Point a -> PathData a
StartP Point Double
s, ArcInfo Double -> Point Double -> PathData Double
forall a. ArcInfo a -> Point a -> PathData a
ArcP ArcInfo Double
i Point Double
e]
singletonPie :: Point Double -> ArcPosition Double -> [PathData Double]
singletonPie :: Point Double -> ArcPosition Double -> [PathData Double]
singletonPie Point Double
c (ArcPosition Point Double
s Point Double
e ArcInfo Double
i) = [Point Double -> PathData Double
forall a. Point a -> PathData a
StartP Point Double
c, Point Double -> PathData Double
forall a. Point a -> PathData a
LineP Point Double
s, ArcInfo Double -> Point Double -> PathData Double
forall a. ArcInfo a -> Point a -> PathData a
ArcP ArcInfo Double
i Point Double
e, Point Double -> PathData Double
forall a. Point a -> PathData a
LineP Point Double
c]
data ArcInfo a = ArcInfo
{
forall a. ArcInfo a -> Point a
radii :: Point a,
forall a. ArcInfo a -> a
phi :: a,
forall a. ArcInfo a -> Bool
large :: Bool,
forall a. ArcInfo a -> Bool
clockwise :: Bool
}
deriving (ArcInfo a -> ArcInfo a -> Bool
(ArcInfo a -> ArcInfo a -> Bool)
-> (ArcInfo a -> ArcInfo a -> Bool) -> Eq (ArcInfo a)
forall a. Eq a => ArcInfo a -> ArcInfo a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => ArcInfo a -> ArcInfo a -> Bool
== :: ArcInfo a -> ArcInfo a -> Bool
$c/= :: forall a. Eq a => ArcInfo a -> ArcInfo a -> Bool
/= :: ArcInfo a -> ArcInfo a -> Bool
Eq, Int -> ArcInfo a -> ShowS
[ArcInfo a] -> ShowS
ArcInfo a -> String
(Int -> ArcInfo a -> ShowS)
-> (ArcInfo a -> String)
-> ([ArcInfo a] -> ShowS)
-> Show (ArcInfo a)
forall a. (Ord a, Additive a, Show a) => Int -> ArcInfo a -> ShowS
forall a. (Ord a, Additive a, Show a) => [ArcInfo a] -> ShowS
forall a. (Ord a, Additive a, Show a) => ArcInfo a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. (Ord a, Additive a, Show a) => Int -> ArcInfo a -> ShowS
showsPrec :: Int -> ArcInfo a -> ShowS
$cshow :: forall a. (Ord a, Additive a, Show a) => ArcInfo a -> String
show :: ArcInfo a -> String
$cshowList :: forall a. (Ord a, Additive a, Show a) => [ArcInfo a] -> ShowS
showList :: [ArcInfo a] -> ShowS
Show, (forall x. ArcInfo a -> Rep (ArcInfo a) x)
-> (forall x. Rep (ArcInfo a) x -> ArcInfo a)
-> Generic (ArcInfo a)
forall x. Rep (ArcInfo a) x -> ArcInfo a
forall x. ArcInfo a -> Rep (ArcInfo a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (ArcInfo a) x -> ArcInfo a
forall a x. ArcInfo a -> Rep (ArcInfo a) x
$cfrom :: forall a x. ArcInfo a -> Rep (ArcInfo a) x
from :: forall x. ArcInfo a -> Rep (ArcInfo a) x
$cto :: forall a x. Rep (ArcInfo a) x -> ArcInfo a
to :: forall x. Rep (ArcInfo a) x -> ArcInfo a
Generic)
data ArcPosition a = ArcPosition
{ forall a. ArcPosition a -> Point a
posStart :: Point a,
forall a. ArcPosition a -> Point a
posEnd :: Point a,
forall a. ArcPosition a -> ArcInfo a
posInfo :: ArcInfo a
}
deriving (ArcPosition a -> ArcPosition a -> Bool
(ArcPosition a -> ArcPosition a -> Bool)
-> (ArcPosition a -> ArcPosition a -> Bool) -> Eq (ArcPosition a)
forall a. Eq a => ArcPosition a -> ArcPosition a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => ArcPosition a -> ArcPosition a -> Bool
== :: ArcPosition a -> ArcPosition a -> Bool
$c/= :: forall a. Eq a => ArcPosition a -> ArcPosition a -> Bool
/= :: ArcPosition a -> ArcPosition a -> Bool
Eq, Int -> ArcPosition a -> ShowS
[ArcPosition a] -> ShowS
ArcPosition a -> String
(Int -> ArcPosition a -> ShowS)
-> (ArcPosition a -> String)
-> ([ArcPosition a] -> ShowS)
-> Show (ArcPosition a)
forall a.
(Ord a, Additive a, Show a) =>
Int -> ArcPosition a -> ShowS
forall a. (Ord a, Additive a, Show a) => [ArcPosition a] -> ShowS
forall a. (Ord a, Additive a, Show a) => ArcPosition a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a.
(Ord a, Additive a, Show a) =>
Int -> ArcPosition a -> ShowS
showsPrec :: Int -> ArcPosition a -> ShowS
$cshow :: forall a. (Ord a, Additive a, Show a) => ArcPosition a -> String
show :: ArcPosition a -> String
$cshowList :: forall a. (Ord a, Additive a, Show a) => [ArcPosition a] -> ShowS
showList :: [ArcPosition a] -> ShowS
Show, (forall x. ArcPosition a -> Rep (ArcPosition a) x)
-> (forall x. Rep (ArcPosition a) x -> ArcPosition a)
-> Generic (ArcPosition a)
forall x. Rep (ArcPosition a) x -> ArcPosition a
forall x. ArcPosition a -> Rep (ArcPosition a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (ArcPosition a) x -> ArcPosition a
forall a x. ArcPosition a -> Rep (ArcPosition a) x
$cfrom :: forall a x. ArcPosition a -> Rep (ArcPosition a) x
from :: forall x. ArcPosition a -> Rep (ArcPosition a) x
$cto :: forall a x. Rep (ArcPosition a) x -> ArcPosition a
to :: forall x. Rep (ArcPosition a) x -> ArcPosition a
Generic)
data ArcCentroid a = ArcCentroid
{
forall a. ArcCentroid a -> Point a
centroid :: Point a,
forall a. ArcCentroid a -> Point a
radius :: Point a,
forall a. ArcCentroid a -> a
cphi :: a,
forall a. ArcCentroid a -> a
ang0 :: a,
forall a. ArcCentroid a -> a
angdiff :: a
}
deriving (ArcCentroid a -> ArcCentroid a -> Bool
(ArcCentroid a -> ArcCentroid a -> Bool)
-> (ArcCentroid a -> ArcCentroid a -> Bool) -> Eq (ArcCentroid a)
forall a. Eq a => ArcCentroid a -> ArcCentroid a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => ArcCentroid a -> ArcCentroid a -> Bool
== :: ArcCentroid a -> ArcCentroid a -> Bool
$c/= :: forall a. Eq a => ArcCentroid a -> ArcCentroid a -> Bool
/= :: ArcCentroid a -> ArcCentroid a -> Bool
Eq, Int -> ArcCentroid a -> ShowS
[ArcCentroid a] -> ShowS
ArcCentroid a -> String
(Int -> ArcCentroid a -> ShowS)
-> (ArcCentroid a -> String)
-> ([ArcCentroid a] -> ShowS)
-> Show (ArcCentroid a)
forall a.
(Ord a, Additive a, Show a) =>
Int -> ArcCentroid a -> ShowS
forall a. (Ord a, Additive a, Show a) => [ArcCentroid a] -> ShowS
forall a. (Ord a, Additive a, Show a) => ArcCentroid a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a.
(Ord a, Additive a, Show a) =>
Int -> ArcCentroid a -> ShowS
showsPrec :: Int -> ArcCentroid a -> ShowS
$cshow :: forall a. (Ord a, Additive a, Show a) => ArcCentroid a -> String
show :: ArcCentroid a -> String
$cshowList :: forall a. (Ord a, Additive a, Show a) => [ArcCentroid a] -> ShowS
showList :: [ArcCentroid a] -> ShowS
Show, (forall x. ArcCentroid a -> Rep (ArcCentroid a) x)
-> (forall x. Rep (ArcCentroid a) x -> ArcCentroid a)
-> Generic (ArcCentroid a)
forall x. Rep (ArcCentroid a) x -> ArcCentroid a
forall x. ArcCentroid a -> Rep (ArcCentroid a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (ArcCentroid a) x -> ArcCentroid a
forall a x. ArcCentroid a -> Rep (ArcCentroid a) x
$cfrom :: forall a x. ArcCentroid a -> Rep (ArcCentroid a) x
from :: forall x. ArcCentroid a -> Rep (ArcCentroid a) x
$cto :: forall a x. Rep (ArcCentroid a) x -> ArcCentroid a
to :: forall x. Rep (ArcCentroid a) x -> ArcCentroid a
Generic)
arcCentroid :: (Ord a, FromInteger a, TrigField a, ExpField a) => ArcPosition a -> ArcCentroid a
arcCentroid :: forall a.
(Ord a, FromInteger a, TrigField a, ExpField a) =>
ArcPosition a -> ArcCentroid a
arcCentroid (ArcPosition p1 :: Point a
p1@(Point a
x1 a
y1) p2 :: Point a
p2@(Point a
x2 a
y2) (ArcInfo Point a
rad a
phi' Bool
large' Bool
clockwise')) = Point a -> Point a -> a -> a -> a -> ArcCentroid a
forall a. Point a -> Point a -> a -> a -> a -> ArcCentroid a
ArcCentroid Point a
c (a -> a -> Point a
forall a. a -> a -> Point a
Point a
rx a
ry) a
phi' a
Dir (Point a)
ang1 a
angd
where
(Point a
x1' a
y1') = a -> Point a -> Point a
forall a. TrigField a => a -> Point a -> Point a
rotateP (-a
phi') ((Point a
p1 Point a -> Point a -> Point a
forall a. Subtractive a => a -> a -> a
- Point a
p2) Point a -> Scalar (Point a) -> Point a
forall m. DivisiveAction m => m -> Scalar m -> m
|/ a
Scalar (Point a)
forall a. (Multiplicative a, Additive a) => a
two)
(Point a
rx' a
ry') = Point a
rad
l :: a
l = a
x1' a -> a -> a
forall a. ExpField a => a -> a -> a
** a
2 a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
rx' a -> a -> a
forall a. ExpField a => a -> a -> a
** a
2 a -> a -> a
forall a. Additive a => a -> a -> a
+ a
y1' a -> a -> a
forall a. ExpField a => a -> a -> a
** a
2 a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
ry' a -> a -> a
forall a. ExpField a => a -> a -> a
** a
2
(a
rx, a
ry) = (a, a) -> (a, a) -> Bool -> (a, a)
forall a. a -> a -> Bool -> a
bool (a
rx', a
ry') (a
rx' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a -> a
forall a. ExpField a => a -> a
sqrt a
l, a
ry' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a -> a
forall a. ExpField a => a -> a
sqrt a
l) (a
l a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
1)
snumer :: a
snumer = a -> a -> a
forall a. Ord a => a -> a -> a
max a
0 (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ (a
rx a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
rx a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
ry a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
ry) a -> a -> a
forall a. Subtractive a => a -> a -> a
- (a
rx a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
rx a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
y1' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
y1') a -> a -> a
forall a. Subtractive a => a -> a -> a
- (a
ry a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
ry a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
x1' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
x1')
s :: a
s =
a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool (-a
1) a
1 (Bool
large' Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
clockwise')
a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a -> a
forall a. ExpField a => a -> a
sqrt
(a
snumer a -> a -> a
forall a. Divisive a => a -> a -> a
/ (a
rx a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
rx a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
y1' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
y1' a -> a -> a
forall a. Additive a => a -> a -> a
+ a
ry a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
ry a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
x1' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
x1'))
cx' :: a
cx' = a
s a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
rx a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
y1' a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
ry
cy' :: a
cy' = a
s a -> a -> a
forall a. Multiplicative a => a -> a -> a
* (-a
ry) a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
x1' a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
rx
cx :: a
cx = (a
x1 a -> a -> a
forall a. Additive a => a -> a -> a
+ a
x2) a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
2 a -> a -> a
forall a. Additive a => a -> a -> a
+ a -> a
forall a. TrigField a => a -> a
cos a
phi' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
cx' a -> a -> a
forall a. Subtractive a => a -> a -> a
- a -> a
forall a. TrigField a => a -> a
sin a
phi' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
cy'
cy :: a
cy = (a
y1 a -> a -> a
forall a. Additive a => a -> a -> a
+ a
y2) a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
2 a -> a -> a
forall a. Additive a => a -> a -> a
+ a -> a
forall a. TrigField a => a -> a
sin a
phi' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
cx' a -> a -> a
forall a. Additive a => a -> a -> a
+ a -> a
forall a. TrigField a => a -> a
cos a
phi' a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
cy'
c :: Point a
c = a -> a -> Point a
forall a. a -> a -> Point a
Point a
cx a
cy
ang1 :: Dir (Point a)
ang1 = Point a -> Dir (Point a)
forall coord. Direction coord => coord -> Dir coord
angle (a -> a -> Point a
forall a. a -> a -> Point a
Point (-((a
cx' a -> a -> a
forall a. Subtractive a => a -> a -> a
- a
x1') a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
rx)) (-((a
cy' a -> a -> a
forall a. Subtractive a => a -> a -> a
- a
y1') a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
ry)))
ang2 :: Dir (Point a)
ang2 = Point a -> Dir (Point a)
forall coord. Direction coord => coord -> Dir coord
angle (a -> a -> Point a
forall a. a -> a -> Point a
Point (-((a
cx' a -> a -> a
forall a. Additive a => a -> a -> a
+ a
x1') a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
rx)) (-((a
cy' a -> a -> a
forall a. Additive a => a -> a -> a
+ a
y1') a -> a -> a
forall a. Divisive a => a -> a -> a
/ a
ry)))
angd' :: a
angd' = a
Dir (Point a)
ang2 a -> a -> a
forall a. Subtractive a => a -> a -> a
- a
Dir (Point a)
ang1
angd :: a
angd =
a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool a
0 (a
2 a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
forall a. TrigField a => a
pi) (Bool -> Bool
not Bool
clockwise' Bool -> Bool -> Bool
&& a
angd' a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
0)
a -> a -> a
forall a. Additive a => a -> a -> a
+ a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool a
0 (-(a
2 a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
forall a. TrigField a => a
pi)) (Bool
clockwise' Bool -> Bool -> Bool
&& a
angd' a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0)
a -> a -> a
forall a. Additive a => a -> a -> a
+ a
angd'
arcPosition :: (Ord a, Absolute a, TrigField a) => ArcCentroid a -> ArcPosition a
arcPosition :: forall a.
(Ord a, Absolute a, TrigField a) =>
ArcCentroid a -> ArcPosition a
arcPosition (ArcCentroid Point a
c Point a
r a
phi' a
ang1 a
angd) =
Point a -> Point a -> ArcInfo a -> ArcPosition a
forall a. Point a -> Point a -> ArcInfo a -> ArcPosition a
ArcPosition Point a
p1 Point a
p2 (Point a -> a -> Bool -> Bool -> ArcInfo a
forall a. Point a -> a -> Bool -> Bool -> ArcInfo a
ArcInfo Point a
r a
phi' Bool
large' Bool
clockwise')
where
p1 :: Point a
p1 = Point a -> Point a -> a -> a -> Point a
forall b a.
(Direction b, Dir b ~ a, Affinity b a, TrigField a) =>
b -> b -> a -> a -> b
ellipse Point a
c Point a
r a
phi' a
ang1
p2 :: Point a
p2 = Point a -> Point a -> a -> a -> Point a
forall b a.
(Direction b, Dir b ~ a, Affinity b a, TrigField a) =>
b -> b -> a -> a -> b
ellipse Point a
c Point a
r a
phi' (a
ang1 a -> a -> a
forall a. Additive a => a -> a -> a
+ a
angd)
large' :: Bool
large' = a -> a
forall a. Absolute a => a -> a
abs a
angd a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
forall a. TrigField a => a
pi
clockwise' :: Bool
clockwise' = a
angd a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
forall a. Additive a => a
zero
ellipse :: (Direction b, Dir b ~ a, Affinity b a, TrigField a) => b -> b -> a -> a -> b
ellipse :: forall b a.
(Direction b, Dir b ~ a, Affinity b a, TrigField a) =>
b -> b -> a -> a -> b
ellipse b
c b
r a
phi' a
theta = b
c b -> b -> b
forall a. Additive a => a -> a -> a
+ (a -> Transform a
forall a. TrigField a => a -> Transform a
rotate a
phi' Transform a -> b -> b
forall a b. Affinity a b => Transform b -> a -> a
|. (b
r b -> b -> b
forall a. Multiplicative a => a -> a -> a
* Dir b -> b
forall coord. Direction coord => Dir coord -> coord
ray a
Dir b
theta))
arcBox :: ArcPosition Double -> Rect Double
arcBox :: ArcPosition Double -> Rect Double
arcBox ArcPosition Double
p = [Element (Rect Double)] -> Rect Double
forall s (f :: * -> *).
(Space s, Traversable f) =>
f (Element s) -> s
unsafeSpace1 [Element (Rect Double)]
[Point Double]
pts
where
(ArcCentroid Point Double
c Point Double
r Double
phi' Double
ang0' Double
angd) = ArcPosition Double -> ArcCentroid Double
forall a.
(Ord a, FromInteger a, TrigField a, ExpField a) =>
ArcPosition a -> ArcCentroid a
arcCentroid ArcPosition Double
p
(Double
x', Double
y') = Point Double -> Double -> (Double, Double)
arcDerivs Point Double
r Double
phi'
angr :: Range Double
angr = Double
Element (Range Double)
ang0' Element (Range Double) -> Element (Range Double) -> Range Double
forall s. Space s => Element s -> Element s -> s
... (Double
ang0' Double -> Double -> Double
forall a. Additive a => a -> a -> a
+ Double
angd) :: Range Double
angs :: [Double]
angs =
(Double -> Bool) -> [Double] -> [Double]
forall a. (a -> Bool) -> [a] -> [a]
filter
(Element (Range Double) -> Range Double -> Bool
forall s. Space s => Element s -> s -> Bool
|.| Range Double
angr)
[ Double
x',
Double
x' Double -> Double -> Double
forall a. Subtractive a => a -> a -> a
- Double
2 Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* Double
forall a. TrigField a => a
pi,
Double
x' Double -> Double -> Double
forall a. Additive a => a -> a -> a
+ Double
forall a. TrigField a => a
pi,
Double
x' Double -> Double -> Double
forall a. Subtractive a => a -> a -> a
- Double
forall a. TrigField a => a
pi,
Double
y',
Double
y' Double -> Double -> Double
forall a. Subtractive a => a -> a -> a
- Double
2 Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* Double
forall a. TrigField a => a
pi,
Double
y' Double -> Double -> Double
forall a. Additive a => a -> a -> a
+ Double
forall a. TrigField a => a
pi,
Double
y' Double -> Double -> Double
forall a. Subtractive a => a -> a -> a
- Double
forall a. TrigField a => a
pi,
Double
ang0',
Double
ang0' Double -> Double -> Double
forall a. Additive a => a -> a -> a
+ Double
angd
]
pts :: [Point Double]
pts = Point Double -> Point Double -> Double -> Double -> Point Double
forall b a.
(Direction b, Dir b ~ a, Affinity b a, TrigField a) =>
b -> b -> a -> a -> b
ellipse Point Double
c Point Double
r Double
phi' (Double -> Point Double) -> [Double] -> [Point Double]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Double]
angs
arcDerivs :: Point Double -> Double -> (Double, Double)
arcDerivs :: Point Double -> Double -> (Double, Double)
arcDerivs (Point Double
rx Double
ry) Double
phi' = (Double
thetax1, Double
thetay1)
where
thetax1 :: Double
thetax1 = Double -> Double -> Double
forall a. TrigField a => a -> a -> a
atan2 (-(Double -> Double
forall a. TrigField a => a -> a
sin Double
phi' Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* Double
ry)) (Double -> Double
forall a. TrigField a => a -> a
cos Double
phi' Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* Double
rx)
thetay1 :: Double
thetay1 = Double -> Double -> Double
forall a. TrigField a => a -> a -> a
atan2 (Double -> Double
forall a. TrigField a => a -> a
cos Double
phi' Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* Double
ry) (Double -> Double
forall a. TrigField a => a -> a
sin Double
phi' Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* Double
rx)
data QuadPosition a = QuadPosition
{
forall a. QuadPosition a -> Point a
qposStart :: Point a,
forall a. QuadPosition a -> Point a
qposEnd :: Point a,
forall a. QuadPosition a -> Point a
qposControl :: Point a
}
deriving (QuadPosition a -> QuadPosition a -> Bool
(QuadPosition a -> QuadPosition a -> Bool)
-> (QuadPosition a -> QuadPosition a -> Bool)
-> Eq (QuadPosition a)
forall a. Eq a => QuadPosition a -> QuadPosition a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => QuadPosition a -> QuadPosition a -> Bool
== :: QuadPosition a -> QuadPosition a -> Bool
$c/= :: forall a. Eq a => QuadPosition a -> QuadPosition a -> Bool
/= :: QuadPosition a -> QuadPosition a -> Bool
Eq, Int -> QuadPosition a -> ShowS
[QuadPosition a] -> ShowS
QuadPosition a -> String
(Int -> QuadPosition a -> ShowS)
-> (QuadPosition a -> String)
-> ([QuadPosition a] -> ShowS)
-> Show (QuadPosition a)
forall a.
(Ord a, Additive a, Show a) =>
Int -> QuadPosition a -> ShowS
forall a. (Ord a, Additive a, Show a) => [QuadPosition a] -> ShowS
forall a. (Ord a, Additive a, Show a) => QuadPosition a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a.
(Ord a, Additive a, Show a) =>
Int -> QuadPosition a -> ShowS
showsPrec :: Int -> QuadPosition a -> ShowS
$cshow :: forall a. (Ord a, Additive a, Show a) => QuadPosition a -> String
show :: QuadPosition a -> String
$cshowList :: forall a. (Ord a, Additive a, Show a) => [QuadPosition a] -> ShowS
showList :: [QuadPosition a] -> ShowS
Show, (forall x. QuadPosition a -> Rep (QuadPosition a) x)
-> (forall x. Rep (QuadPosition a) x -> QuadPosition a)
-> Generic (QuadPosition a)
forall x. Rep (QuadPosition a) x -> QuadPosition a
forall x. QuadPosition a -> Rep (QuadPosition a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (QuadPosition a) x -> QuadPosition a
forall a x. QuadPosition a -> Rep (QuadPosition a) x
$cfrom :: forall a x. QuadPosition a -> Rep (QuadPosition a) x
from :: forall x. QuadPosition a -> Rep (QuadPosition a) x
$cto :: forall a x. Rep (QuadPosition a) x -> QuadPosition a
to :: forall x. Rep (QuadPosition a) x -> QuadPosition a
Generic)
data QuadPolar a = QuadPolar
{
forall a. QuadPolar a -> Point a
qpolStart :: Point a,
forall a. QuadPolar a -> Point a
qpolEnd :: Point a,
forall a. QuadPolar a -> Polar a
qpolControl :: Polar a
}
deriving (QuadPolar a -> QuadPolar a -> Bool
(QuadPolar a -> QuadPolar a -> Bool)
-> (QuadPolar a -> QuadPolar a -> Bool) -> Eq (QuadPolar a)
forall a. Eq a => QuadPolar a -> QuadPolar a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => QuadPolar a -> QuadPolar a -> Bool
== :: QuadPolar a -> QuadPolar a -> Bool
$c/= :: forall a. Eq a => QuadPolar a -> QuadPolar a -> Bool
/= :: QuadPolar a -> QuadPolar a -> Bool
Eq, Int -> QuadPolar a -> ShowS
[QuadPolar a] -> ShowS
QuadPolar a -> String
(Int -> QuadPolar a -> ShowS)
-> (QuadPolar a -> String)
-> ([QuadPolar a] -> ShowS)
-> Show (QuadPolar a)
forall a.
(Ord a, Additive a, Show a) =>
Int -> QuadPolar a -> ShowS
forall a. (Ord a, Additive a, Show a) => [QuadPolar a] -> ShowS
forall a. (Ord a, Additive a, Show a) => QuadPolar a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a.
(Ord a, Additive a, Show a) =>
Int -> QuadPolar a -> ShowS
showsPrec :: Int -> QuadPolar a -> ShowS
$cshow :: forall a. (Ord a, Additive a, Show a) => QuadPolar a -> String
show :: QuadPolar a -> String
$cshowList :: forall a. (Ord a, Additive a, Show a) => [QuadPolar a] -> ShowS
showList :: [QuadPolar a] -> ShowS
Show, (forall x. QuadPolar a -> Rep (QuadPolar a) x)
-> (forall x. Rep (QuadPolar a) x -> QuadPolar a)
-> Generic (QuadPolar a)
forall x. Rep (QuadPolar a) x -> QuadPolar a
forall x. QuadPolar a -> Rep (QuadPolar a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (QuadPolar a) x -> QuadPolar a
forall a x. QuadPolar a -> Rep (QuadPolar a) x
$cfrom :: forall a x. QuadPolar a -> Rep (QuadPolar a) x
from :: forall x. QuadPolar a -> Rep (QuadPolar a) x
$cto :: forall a x. Rep (QuadPolar a) x -> QuadPolar a
to :: forall x. Rep (QuadPolar a) x -> QuadPolar a
Generic)
quadPolar :: (Eq a, TrigField a, ExpField a) => QuadPosition a -> QuadPolar a
quadPolar :: forall a.
(Eq a, TrigField a, ExpField a) =>
QuadPosition a -> QuadPolar a
quadPolar (QuadPosition Point a
start' Point a
end Point a
control) = Point a -> Point a -> Polar a -> QuadPolar a
forall a. Point a -> Point a -> Polar a -> QuadPolar a
QuadPolar Point a
start' Point a
end Polar a
Polar (Mag (Point a))
control'
where
mp :: Point a
mp = (Point a
start' Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
end) Point a -> Scalar (Point a) -> Point a
forall m. DivisiveAction m => m -> Scalar m -> m
|/ a
Scalar (Point a)
forall a. (Multiplicative a, Additive a) => a
two
control' :: Polar (Mag (Point a))
control' = Point a -> Polar (Mag (Point a))
forall a.
(Dir (Base a) ~ Mag a, Basis a, Direction (Base a)) =>
a -> Polar (Mag a)
polar (Point a
control Point a -> Point a -> Point a
forall a. Subtractive a => a -> a -> a
- Point a
mp)
quadPosition :: (TrigField a) => QuadPolar a -> QuadPosition a
quadPosition :: forall a. TrigField a => QuadPolar a -> QuadPosition a
quadPosition (QuadPolar Point a
start' Point a
end Polar a
control) = Point a -> Point a -> Point a -> QuadPosition a
forall a. Point a -> Point a -> Point a -> QuadPosition a
QuadPosition Point a
start' Point a
end Point a
control'
where
control' :: Point a
control' = Polar (Scalar (Point a)) -> Point a
forall m.
(Scalar m ~ Dir m, MultiplicativeAction m, Direction m) =>
Polar (Scalar m) -> m
coord Polar a
Polar (Scalar (Point a))
control Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ (Point a
start' Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
end) Point a -> Scalar (Point a) -> Point a
forall m. DivisiveAction m => m -> Scalar m -> m
|/ a
Scalar (Point a)
forall a. (Multiplicative a, Additive a) => a
two
quadBezier :: (FromInteger a, ExpField a) => QuadPosition a -> a -> Point a
quadBezier :: forall a.
(FromInteger a, ExpField a) =>
QuadPosition a -> a -> Point a
quadBezier (QuadPosition Point a
start' Point a
end Point a
control) a
theta =
(a
1 a -> a -> a
forall a. Subtractive a => a -> a -> a
- a
theta)
a -> Int -> a
forall a. Divisive a => a -> Int -> a
^ Int
2
Scalar (Point a) -> Point a -> Point a
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Point a
start'
Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ a
2
a -> a -> a
forall a. Multiplicative a => a -> a -> a
* (a
1 a -> a -> a
forall a. Subtractive a => a -> a -> a
- a
theta)
a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
theta
Scalar (Point a) -> Point a -> Point a
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Point a
control
Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ a
theta
a -> Int -> a
forall a. Divisive a => a -> Int -> a
^ Int
2
Scalar (Point a) -> Point a -> Point a
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Point a
end
quadDerivs :: QuadPosition Double -> [Double]
quadDerivs :: QuadPosition Double -> [Double]
quadDerivs (QuadPosition Point Double
start' Point Double
end Point Double
control) = [Double
x', Double
y']
where
(Point Double
detx Double
dety) = Point Double
start' Point Double -> Point Double -> Point Double
forall a. Subtractive a => a -> a -> a
- Double
Scalar (Point Double)
2 Scalar (Point Double) -> Point Double -> Point Double
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Point Double
control Point Double -> Point Double -> Point Double
forall a. Additive a => a -> a -> a
+ Point Double
end
x' :: Double
x' = Double -> Double -> Bool -> Double
forall a. a -> a -> Bool -> a
bool ((Point Double -> Double
forall a. Point a -> a
_x Point Double
start' Double -> Double -> Double
forall a. Subtractive a => a -> a -> a
- Point Double -> Double
forall a. Point a -> a
_x Point Double
control) Double -> Double -> Double
forall a. Divisive a => a -> a -> a
/ Double
detx) (Double
2 Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* (Point Double -> Double
forall a. Point a -> a
_x Point Double
control Double -> Double -> Double
forall a. Subtractive a => a -> a -> a
- Point Double -> Double
forall a. Point a -> a
_x Point Double
start')) (Double
detx Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
== Double
0)
y' :: Double
y' = Double -> Double -> Bool -> Double
forall a. a -> a -> Bool -> a
bool ((Point Double -> Double
forall a. Point a -> a
_y Point Double
start' Double -> Double -> Double
forall a. Subtractive a => a -> a -> a
- Point Double -> Double
forall a. Point a -> a
_y Point Double
control) Double -> Double -> Double
forall a. Divisive a => a -> a -> a
/ Double
dety) (Double
2 Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* (Point Double -> Double
forall a. Point a -> a
_y Point Double
control Double -> Double -> Double
forall a. Subtractive a => a -> a -> a
- Point Double -> Double
forall a. Point a -> a
_y Point Double
start')) (Double
dety Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
== Double
0)
quadBox :: QuadPosition Double -> Rect Double
quadBox :: QuadPosition Double -> Rect Double
quadBox QuadPosition Double
p = [Element (Rect Double)] -> Rect Double
forall s (f :: * -> *).
(Space s, Traversable f) =>
f (Element s) -> s
unsafeSpace1 [Element (Rect Double)]
[Point Double]
pts
where
ts :: [Double]
ts = QuadPosition Double -> [Double]
quadDerivs QuadPosition Double
p
pts :: [Point Double]
pts = QuadPosition Double -> Double -> Point Double
forall a.
(FromInteger a, ExpField a) =>
QuadPosition a -> a -> Point a
quadBezier QuadPosition Double
p (Double -> Point Double) -> [Double] -> [Point Double]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([Double
0, Double
1] [Double] -> [Double] -> [Double]
forall a. Semigroup a => a -> a -> a
<> [Double]
ts)
data CubicPosition a = CubicPosition
{
forall a. CubicPosition a -> Point a
cposStart :: Point a,
forall a. CubicPosition a -> Point a
cposEnd :: Point a,
forall a. CubicPosition a -> Point a
cposControl1 :: Point a,
forall a. CubicPosition a -> Point a
cposControl2 :: Point a
}
deriving (CubicPosition a -> CubicPosition a -> Bool
(CubicPosition a -> CubicPosition a -> Bool)
-> (CubicPosition a -> CubicPosition a -> Bool)
-> Eq (CubicPosition a)
forall a. Eq a => CubicPosition a -> CubicPosition a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => CubicPosition a -> CubicPosition a -> Bool
== :: CubicPosition a -> CubicPosition a -> Bool
$c/= :: forall a. Eq a => CubicPosition a -> CubicPosition a -> Bool
/= :: CubicPosition a -> CubicPosition a -> Bool
Eq, Int -> CubicPosition a -> ShowS
[CubicPosition a] -> ShowS
CubicPosition a -> String
(Int -> CubicPosition a -> ShowS)
-> (CubicPosition a -> String)
-> ([CubicPosition a] -> ShowS)
-> Show (CubicPosition a)
forall a.
(Ord a, Additive a, Show a) =>
Int -> CubicPosition a -> ShowS
forall a. (Ord a, Additive a, Show a) => [CubicPosition a] -> ShowS
forall a. (Ord a, Additive a, Show a) => CubicPosition a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a.
(Ord a, Additive a, Show a) =>
Int -> CubicPosition a -> ShowS
showsPrec :: Int -> CubicPosition a -> ShowS
$cshow :: forall a. (Ord a, Additive a, Show a) => CubicPosition a -> String
show :: CubicPosition a -> String
$cshowList :: forall a. (Ord a, Additive a, Show a) => [CubicPosition a] -> ShowS
showList :: [CubicPosition a] -> ShowS
Show, (forall x. CubicPosition a -> Rep (CubicPosition a) x)
-> (forall x. Rep (CubicPosition a) x -> CubicPosition a)
-> Generic (CubicPosition a)
forall x. Rep (CubicPosition a) x -> CubicPosition a
forall x. CubicPosition a -> Rep (CubicPosition a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (CubicPosition a) x -> CubicPosition a
forall a x. CubicPosition a -> Rep (CubicPosition a) x
$cfrom :: forall a x. CubicPosition a -> Rep (CubicPosition a) x
from :: forall x. CubicPosition a -> Rep (CubicPosition a) x
$cto :: forall a x. Rep (CubicPosition a) x -> CubicPosition a
to :: forall x. Rep (CubicPosition a) x -> CubicPosition a
Generic)
data CubicPolar a = CubicPolar
{
forall a. CubicPolar a -> Point a
cpolStart :: Point a,
forall a. CubicPolar a -> Point a
cpolEnd :: Point a,
forall a. CubicPolar a -> Polar a
cpolControl1 :: Polar a,
forall a. CubicPolar a -> Polar a
cpolControl2 :: Polar a
}
deriving (CubicPolar a -> CubicPolar a -> Bool
(CubicPolar a -> CubicPolar a -> Bool)
-> (CubicPolar a -> CubicPolar a -> Bool) -> Eq (CubicPolar a)
forall a. Eq a => CubicPolar a -> CubicPolar a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => CubicPolar a -> CubicPolar a -> Bool
== :: CubicPolar a -> CubicPolar a -> Bool
$c/= :: forall a. Eq a => CubicPolar a -> CubicPolar a -> Bool
/= :: CubicPolar a -> CubicPolar a -> Bool
Eq, Int -> CubicPolar a -> ShowS
[CubicPolar a] -> ShowS
CubicPolar a -> String
(Int -> CubicPolar a -> ShowS)
-> (CubicPolar a -> String)
-> ([CubicPolar a] -> ShowS)
-> Show (CubicPolar a)
forall a.
(Ord a, Additive a, Show a) =>
Int -> CubicPolar a -> ShowS
forall a. (Ord a, Additive a, Show a) => [CubicPolar a] -> ShowS
forall a. (Ord a, Additive a, Show a) => CubicPolar a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a.
(Ord a, Additive a, Show a) =>
Int -> CubicPolar a -> ShowS
showsPrec :: Int -> CubicPolar a -> ShowS
$cshow :: forall a. (Ord a, Additive a, Show a) => CubicPolar a -> String
show :: CubicPolar a -> String
$cshowList :: forall a. (Ord a, Additive a, Show a) => [CubicPolar a] -> ShowS
showList :: [CubicPolar a] -> ShowS
Show, (forall x. CubicPolar a -> Rep (CubicPolar a) x)
-> (forall x. Rep (CubicPolar a) x -> CubicPolar a)
-> Generic (CubicPolar a)
forall x. Rep (CubicPolar a) x -> CubicPolar a
forall x. CubicPolar a -> Rep (CubicPolar a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (CubicPolar a) x -> CubicPolar a
forall a x. CubicPolar a -> Rep (CubicPolar a) x
$cfrom :: forall a x. CubicPolar a -> Rep (CubicPolar a) x
from :: forall x. CubicPolar a -> Rep (CubicPolar a) x
$cto :: forall a x. Rep (CubicPolar a) x -> CubicPolar a
to :: forall x. Rep (CubicPolar a) x -> CubicPolar a
Generic)
cubicPolar :: (Eq a, ExpField a, TrigField a) => CubicPosition a -> CubicPolar a
cubicPolar :: forall a.
(Eq a, ExpField a, TrigField a) =>
CubicPosition a -> CubicPolar a
cubicPolar (CubicPosition Point a
start' Point a
end Point a
control1 Point a
control2) = Point a -> Point a -> Polar a -> Polar a -> CubicPolar a
forall a. Point a -> Point a -> Polar a -> Polar a -> CubicPolar a
CubicPolar Point a
start' Point a
end Polar a
Polar (Mag (Point a))
control1' Polar a
Polar (Mag (Point a))
control2'
where
mp :: Point a
mp = (Point a
start' Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
end) Point a -> Scalar (Point a) -> Point a
forall m. DivisiveAction m => m -> Scalar m -> m
|/ a
Scalar (Point a)
forall a. (Multiplicative a, Additive a) => a
two
control1' :: Polar (Mag (Point a))
control1' = Point a -> Polar (Mag (Point a))
forall a.
(Dir (Base a) ~ Mag a, Basis a, Direction (Base a)) =>
a -> Polar (Mag a)
polar (Point a -> Polar (Mag (Point a)))
-> Point a -> Polar (Mag (Point a))
forall a b. (a -> b) -> a -> b
$ (Point a
control1 Point a -> Point a -> Point a
forall a. Subtractive a => a -> a -> a
- Point a
mp) Point a -> Scalar (Point a) -> Point a
forall m. DivisiveAction m => m -> Scalar m -> m
|/ Point a -> Mag (Point a)
forall a. Basis a => a -> Mag a
magnitude (Point a
end Point a -> Point a -> Point a
forall a. Subtractive a => a -> a -> a
- Point a
start')
control2' :: Polar (Mag (Point a))
control2' = Point a -> Polar (Mag (Point a))
forall a.
(Dir (Base a) ~ Mag a, Basis a, Direction (Base a)) =>
a -> Polar (Mag a)
polar (Point a -> Polar (Mag (Point a)))
-> Point a -> Polar (Mag (Point a))
forall a b. (a -> b) -> a -> b
$ (Point a
control2 Point a -> Point a -> Point a
forall a. Subtractive a => a -> a -> a
- Point a
mp) Point a -> Scalar (Point a) -> Point a
forall m. DivisiveAction m => m -> Scalar m -> m
|/ Point a -> Mag (Point a)
forall a. Basis a => a -> Mag a
magnitude (Point a
end Point a -> Point a -> Point a
forall a. Subtractive a => a -> a -> a
- Point a
start')
cubicPosition :: (Eq a, TrigField a, ExpField a) => CubicPolar a -> CubicPosition a
cubicPosition :: forall a.
(Eq a, TrigField a, ExpField a) =>
CubicPolar a -> CubicPosition a
cubicPosition (CubicPolar Point a
start' Point a
end Polar a
control1 Polar a
control2) = Point a -> Point a -> Point a -> Point a -> CubicPosition a
forall a.
Point a -> Point a -> Point a -> Point a -> CubicPosition a
CubicPosition Point a
start' Point a
end Point a
control1' Point a
control2'
where
control1' :: Point a
control1' = Point a -> Mag (Point a)
forall a. Basis a => a -> Mag a
magnitude (Point a
end Point a -> Point a -> Point a
forall a. Subtractive a => a -> a -> a
- Point a
start') Scalar (Point a) -> Point a -> Point a
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Polar (Scalar (Point a)) -> Point a
forall m.
(Scalar m ~ Dir m, MultiplicativeAction m, Direction m) =>
Polar (Scalar m) -> m
coord Polar a
Polar (Scalar (Point a))
control1 Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ (Point a
start' Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
end) Point a -> Scalar (Point a) -> Point a
forall m. DivisiveAction m => m -> Scalar m -> m
|/ a
Scalar (Point a)
forall a. (Multiplicative a, Additive a) => a
two
control2' :: Point a
control2' = Point a -> Mag (Point a)
forall a. Basis a => a -> Mag a
magnitude (Point a
end Point a -> Point a -> Point a
forall a. Subtractive a => a -> a -> a
- Point a
start') Scalar (Point a) -> Point a -> Point a
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Polar (Scalar (Point a)) -> Point a
forall m.
(Scalar m ~ Dir m, MultiplicativeAction m, Direction m) =>
Polar (Scalar m) -> m
coord Polar a
Polar (Scalar (Point a))
control2 Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ (Point a
start' Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ Point a
end) Point a -> Scalar (Point a) -> Point a
forall m. DivisiveAction m => m -> Scalar m -> m
|/ a
Scalar (Point a)
forall a. (Multiplicative a, Additive a) => a
two
cubicBezier :: (FromInteger a, TrigField a) => CubicPosition a -> a -> Point a
cubicBezier :: forall a.
(FromInteger a, TrigField a) =>
CubicPosition a -> a -> Point a
cubicBezier (CubicPosition Point a
start' Point a
end Point a
control1 Point a
control2) a
theta =
(a
1 a -> a -> a
forall a. Subtractive a => a -> a -> a
- a
theta)
a -> Int -> a
forall a. Divisive a => a -> Int -> a
^ Int
3
Scalar (Point a) -> Point a -> Point a
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Point a
start'
Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ a
3
a -> a -> a
forall a. Multiplicative a => a -> a -> a
* (a
1 a -> a -> a
forall a. Subtractive a => a -> a -> a
- a
theta)
a -> Int -> a
forall a. Divisive a => a -> Int -> a
^ Int
2
a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
theta
Scalar (Point a) -> Point a -> Point a
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Point a
control1
Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ a
3
a -> a -> a
forall a. Multiplicative a => a -> a -> a
* (a
1 a -> a -> a
forall a. Subtractive a => a -> a -> a
- a
theta)
a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
theta
a -> Int -> a
forall a. Divisive a => a -> Int -> a
^ Int
2
Scalar (Point a) -> Point a -> Point a
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Point a
control2
Point a -> Point a -> Point a
forall a. Additive a => a -> a -> a
+ a
theta
a -> Int -> a
forall a. Divisive a => a -> Int -> a
^ Int
3
Scalar (Point a) -> Point a -> Point a
forall m. MultiplicativeAction m => Scalar m -> m -> m
*| Point a
end
cubicDerivs :: CubicPosition Double -> [Double]
cubicDerivs :: CubicPosition Double -> [Double]
cubicDerivs
( CubicPosition
(Point Double
c0x Double
c0y)
(Point Double
c3x Double
c3y)
(Point Double
c1x Double
c1y)
(Point Double
c2x Double
c2y)
) =
CubicBezier Double -> [Double]
B.bezierHoriz CubicBezier Double
b [Double] -> [Double] -> [Double]
forall a. Semigroup a => a -> a -> a
<> CubicBezier Double -> [Double]
B.bezierVert CubicBezier Double
b
where
b :: CubicBezier Double
b =
Point Double
-> Point Double
-> Point Double
-> Point Double
-> CubicBezier Double
forall a. Point a -> Point a -> Point a -> Point a -> CubicBezier a
B.CubicBezier
(Double -> Double -> Point Double
forall a. a -> a -> Point a
B.Point Double
c0x Double
c0y)
(Double -> Double -> Point Double
forall a. a -> a -> Point a
B.Point Double
c1x Double
c1y)
(Double -> Double -> Point Double
forall a. a -> a -> Point a
B.Point Double
c2x Double
c2y)
(Double -> Double -> Point Double
forall a. a -> a -> Point a
B.Point Double
c3x Double
c3y)
cubicBox :: CubicPosition Double -> Rect Double
cubicBox :: CubicPosition Double -> Rect Double
cubicBox CubicPosition Double
p = [Element (Rect Double)] -> Rect Double
forall s (f :: * -> *).
(Space s, Traversable f) =>
f (Element s) -> s
unsafeSpace1 [Element (Rect Double)]
[Point Double]
pts
where
ts :: [Double]
ts = CubicPosition Double -> [Double]
cubicDerivs CubicPosition Double
p
pts :: [Point Double]
pts =
CubicPosition Double -> Double -> Point Double
forall a.
(FromInteger a, TrigField a) =>
CubicPosition a -> a -> Point a
cubicBezier CubicPosition Double
p
(Double -> Point Double) -> [Double] -> [Point Double]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Double -> Bool) -> [Double] -> [Double]
forall a. (a -> Bool) -> [a] -> [a]
filter
(Element (Range Double) -> Range Double -> Bool
forall s. Space s => Element s -> s -> Bool
|.| Double -> Double -> Range Double
forall a. a -> a -> Range a
Range Double
0 Double
1)
([Double
0, Double
1] [Double] -> [Double] -> [Double]
forall a. Semigroup a => a -> a -> a
<> [Double]
ts)
pathBoxes :: [PathData Double] -> Maybe (Rect Double)
pathBoxes :: [PathData Double] -> Maybe (Rect Double)
pathBoxes [] = Maybe (Rect Double)
forall a. Maybe a
Nothing
pathBoxes (PathData Double
x : [PathData Double]
xs) =
Rect Double -> Maybe (Rect Double)
forall a. a -> Maybe a
Just (Rect Double -> Maybe (Rect Double))
-> Rect Double -> Maybe (Rect Double)
forall a b. (a -> b) -> a -> b
$
(Point Double, Rect Double) -> Rect Double
forall a b. (a, b) -> b
snd ((Point Double, Rect Double) -> Rect Double)
-> (Point Double, Rect Double) -> Rect Double
forall a b. (a -> b) -> a -> b
$
((Point Double, Rect Double)
-> PathData Double -> (Point Double, Rect Double))
-> (Point Double, Rect Double)
-> [PathData Double]
-> (Point Double, Rect Double)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (Point Double, Rect Double)
-> PathData Double -> (Point Double, Rect Double)
step (Point Double, Rect Double)
begin [PathData Double]
xs
where
begin :: (Point Double, Rect Double)
begin :: (Point Double, Rect Double)
begin = (PathData Double -> Point Double
forall a. PathData a -> Point a
pointPath PathData Double
x, Element (Rect Double) -> Rect Double
forall s. Space s => Element s -> s
singleton (PathData Double -> Point Double
forall a. PathData a -> Point a
pointPath PathData Double
x))
step :: (Point Double, Rect Double)
-> PathData Double -> (Point Double, Rect Double)
step (Point Double
start', Rect Double
r) PathData Double
a = (PathData Double -> Point Double
forall a. PathData a -> Point a
pointPath PathData Double
a, Point Double -> PathData Double -> Rect Double
pathBox Point Double
start' PathData Double
a Rect Double -> Rect Double -> Rect Double
forall a. Semigroup a => a -> a -> a
<> Rect Double
r)
pathBox :: Point Double -> PathData Double -> Rect Double
pathBox :: Point Double -> PathData Double -> Rect Double
pathBox Point Double
start' PathData Double
info =
case PathData Double
info of
StartP Point Double
p -> Element (Rect Double) -> Rect Double
forall s. Space s => Element s -> s
singleton Element (Rect Double)
Point Double
p
LineP Point Double
p -> [Element (Rect Double)] -> Rect Double
forall s (f :: * -> *).
(Space s, Traversable f) =>
f (Element s) -> s
unsafeSpace1 [Point Double
start', Point Double
p]
CubicP Point Double
c1 Point Double
c2 Point Double
p -> CubicPosition Double -> Rect Double
cubicBox (Point Double
-> Point Double
-> Point Double
-> Point Double
-> CubicPosition Double
forall a.
Point a -> Point a -> Point a -> Point a -> CubicPosition a
CubicPosition Point Double
start' Point Double
p Point Double
c1 Point Double
c2)
QuadP Point Double
c Point Double
p -> QuadPosition Double -> Rect Double
quadBox (Point Double -> Point Double -> Point Double -> QuadPosition Double
forall a. Point a -> Point a -> Point a -> QuadPosition a
QuadPosition Point Double
start' Point Double
p Point Double
c)
ArcP ArcInfo Double
i Point Double
p -> ArcPosition Double -> Rect Double
arcBox (Point Double
-> Point Double -> ArcInfo Double -> ArcPosition Double
forall a. Point a -> Point a -> ArcInfo a -> ArcPosition a
ArcPosition Point Double
start' Point Double
p ArcInfo Double
i)
projectArcPosition :: Rect Double -> Rect Double -> ArcPosition Double -> ArcInfo Double
projectArcPosition :: Rect Double -> Rect Double -> ArcPosition Double -> ArcInfo Double
projectArcPosition Rect Double
new Rect Double
old (ArcPosition Point Double
_ Point Double
_ (ArcInfo (Point Double
rx Double
ry) Double
phi' Bool
l Bool
cl)) = Point Double -> Double -> Bool -> Bool -> ArcInfo Double
forall a. Point a -> a -> Bool -> Bool -> ArcInfo a
ArcInfo (Double -> Double -> Point Double
forall a. a -> a -> Point a
Point Double
Mag (Point Double)
rx'' Double
Mag (Point Double)
ry'') Double
phi' Bool
l Bool
cl
where
rx' :: Point Double
rx' = Double -> Point Double -> Point Double
forall a. TrigField a => a -> Point a -> Point a
rotateP Double
phi' (Double -> Double -> Point Double
forall a. a -> a -> Point a
Point Double
rx Double
forall a. Additive a => a
zero)
rx'' :: Mag (Point Double)
rx'' = Point Double -> Mag (Point Double)
forall a. Basis a => a -> Mag a
magnitude (Point Double -> Mag (Point Double))
-> Point Double -> Mag (Point Double)
forall a b. (a -> b) -> a -> b
$ Point Double
rx' Point Double -> Point Double -> Point Double
forall a. Multiplicative a => a -> a -> a
* Rect Double -> Element (Rect Double)
forall s. (Space s, Subtractive (Element s)) => s -> Element s
width Rect Double
new Point Double -> Point Double -> Point Double
forall a. Divisive a => a -> a -> a
/ Rect Double -> Element (Rect Double)
forall s. (Space s, Subtractive (Element s)) => s -> Element s
width Rect Double
old
ry' :: Point Double
ry' = Double -> Point Double -> Point Double
forall a. TrigField a => a -> Point a -> Point a
rotateP Double
phi' (Double -> Double -> Point Double
forall a. a -> a -> Point a
Point Double
forall a. Additive a => a
zero Double
ry)
ry'' :: Mag (Point Double)
ry'' = Point Double -> Mag (Point Double)
forall a. Basis a => a -> Mag a
magnitude (Point Double -> Mag (Point Double))
-> Point Double -> Mag (Point Double)
forall a b. (a -> b) -> a -> b
$ Point Double
ry' Point Double -> Point Double -> Point Double
forall a. Multiplicative a => a -> a -> a
* Rect Double -> Element (Rect Double)
forall s. (Space s, Subtractive (Element s)) => s -> Element s
width Rect Double
new Point Double -> Point Double -> Point Double
forall a. Divisive a => a -> a -> a
/ Rect Double -> Element (Rect Double)
forall s. (Space s, Subtractive (Element s)) => s -> Element s
width Rect Double
old