module Graphics.Implicit.Export.Render.GetSegs (getSegs) where
import Prelude((-), Bool(True, False), sqrt, (+), (*), (/=), map, (.), filter, ($), (<=))
import Graphics.Implicit.Definitions (ℝ, ℝ2, Obj2, Polyline(Polyline))
import Graphics.Implicit.Export.Render.RefineSegs (refine)
import Graphics.Implicit.Export.Util (centroid)
import Linear (V2(V2))
getSegs :: ℝ2 -> ℝ2 -> Obj2 -> (ℝ,ℝ,ℝ,ℝ) -> (ℝ,ℝ,ℝ,ℝ) -> [Polyline]
getSegs :: ℝ2 -> ℝ2 -> Obj2 -> (ℝ, ℝ, ℝ, ℝ) -> (ℝ, ℝ, ℝ, ℝ) -> [Polyline]
getSegs p1 :: ℝ2
p1@(V2 ℝ
x ℝ
y) ℝ2
p2 Obj2
obj (ℝ
x1y1, ℝ
x2y1, ℝ
x1y2, ℝ
x2y2) (ℝ
midx1V,ℝ
midx2V,ℝ
midy1V,ℝ
midy2V) =
let
c :: ℝ
c = Obj2
obj (forall a (t :: * -> *) (f :: * -> *).
(Fractional a, Foldable t, Applicative f, Num (f a)) =>
t (f a) -> f a
centroid [ℝ2
p1,ℝ2
p2])
(V2 ℝ
dx ℝ
dy) = ℝ2
p2 forall a. Num a => a -> a -> a
- ℝ2
p1
res :: ℝ
res = forall a. Floating a => a -> a
sqrt (ℝ
dxforall a. Num a => a -> a -> a
*ℝ
dy)
midx1 :: ℝ2
midx1 = forall a. a -> a -> V2 a
V2 ℝ
x ℝ
midx1V
midx2 :: ℝ2
midx2 = forall a. a -> a -> V2 a
V2 (ℝ
x forall a. Num a => a -> a -> a
+ ℝ
dx) ℝ
midx2V
midy1 :: ℝ2
midy1 = forall a. a -> a -> V2 a
V2 ℝ
midy1V ℝ
y
midy2 :: ℝ2
midy2 = forall a. a -> a -> V2 a
V2 ℝ
midy2V (ℝ
y forall a. Num a => a -> a -> a
+ ℝ
dy)
notPointLine :: Polyline -> Bool
notPointLine :: Polyline -> Bool
notPointLine (Polyline [ℝ2
np1,ℝ2
np2]) = ℝ2
np1 forall a. Eq a => a -> a -> Bool
/= ℝ2
np2
notPointLine Polyline
_ = Bool
False
in forall a b. (a -> b) -> [a] -> [b]
map (ℝ -> Obj2 -> Polyline -> Polyline
refine ℝ
res Obj2
obj) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter Polyline -> Bool
notPointLine forall a b. (a -> b) -> a -> b
$ case (ℝ
x1y2 forall a. Ord a => a -> a -> Bool
<= ℝ
0, ℝ
x2y2 forall a. Ord a => a -> a -> Bool
<= ℝ
0,
ℝ
x1y1 forall a. Ord a => a -> a -> Bool
<= ℝ
0, ℝ
x2y1 forall a. Ord a => a -> a -> Bool
<= ℝ
0) of
(Bool
True, Bool
True, Bool
True, Bool
True) -> []
(Bool
False, Bool
False, Bool
False, Bool
False) -> []
( Bool
True, Bool
True, Bool
False, Bool
False) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midx1, ℝ2
midx2]]
(Bool
False, Bool
False, Bool
True, Bool
True) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midx2, ℝ2
midx1]]
(Bool
False, Bool
True, Bool
False, Bool
True) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midy2, ℝ2
midy1]]
( Bool
True, Bool
False, Bool
True, Bool
False) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midy1, ℝ2
midy2]]
( Bool
True, Bool
False, Bool
False, Bool
False) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midx1, ℝ2
midy2]]
(Bool
False, Bool
True, Bool
True, Bool
True) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midy2, ℝ2
midx1]]
( Bool
True, Bool
True, Bool
False, Bool
True) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midx1, ℝ2
midy1]]
(Bool
False, Bool
False, Bool
True, Bool
False) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midy1, ℝ2
midx1]]
( Bool
True, Bool
True, Bool
True, Bool
False) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midy1, ℝ2
midx2]]
(Bool
False, Bool
False, Bool
False, Bool
True) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midx2, ℝ2
midy1]]
( Bool
True, Bool
False, Bool
True, Bool
True) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midx2, ℝ2
midy2]]
(Bool
False, Bool
True, Bool
False, Bool
False) -> [[ℝ2] -> Polyline
Polyline [ℝ2
midy2, ℝ2
midx2]]
(Bool
True, Bool
False, Bool
False, Bool
True) -> if ℝ
c forall a. Ord a => a -> a -> Bool
<= ℝ
0
then [[ℝ2] -> Polyline
Polyline [ℝ2
midx1, ℝ2
midy1], [ℝ2] -> Polyline
Polyline [ℝ2
midx2, ℝ2
midy2]]
else [[ℝ2] -> Polyline
Polyline [ℝ2
midx1, ℝ2
midy2], [ℝ2] -> Polyline
Polyline [ℝ2
midx2, ℝ2
midy1]]
(Bool
False, Bool
True, Bool
True, Bool
False) -> if ℝ
c forall a. Ord a => a -> a -> Bool
<= ℝ
0
then [[ℝ2] -> Polyline
Polyline [ℝ2
midy2, ℝ2
midx1], [ℝ2] -> Polyline
Polyline [ℝ2
midy1, ℝ2
midx2]]
else [[ℝ2] -> Polyline
Polyline [ℝ2
midy1, ℝ2
midx1], [ℝ2] -> Polyline
Polyline [ℝ2
midy2, ℝ2
midx2]]