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 Data.VectorSpace ((^-^))
getSegs :: ℝ2 -> ℝ2 -> Obj2 -> (ℝ,ℝ,ℝ,ℝ) -> (ℝ,ℝ,ℝ,ℝ) -> [Polyline]
getSegs p1@(x,y) p2 obj (x1y1, x2y1, x1y2, x2y2) (midx1V,midx2V,midy1V,midy2V) =
let
c = obj (centroid [p1,p2])
(dx,dy) = p2 ^-^ p1
res = sqrt (dx*dy)
midx1 = (x, midx1V)
midx2 = (x + dx, midx2V)
midy1 = (midy1V, y )
midy2 = (midy2V, y + dy)
notPointLine :: Polyline -> Bool
notPointLine (Polyline [np1,np2]) = np1 /= np2
notPointLine _ = False
in map (refine res obj) . filter notPointLine $ case (x1y2 <= 0, x2y2 <= 0,
x1y1 <= 0, x2y1 <= 0) of
(True, True, True, True) -> []
(False, False, False, False) -> []
( True, True, False, False) -> [Polyline [midx1, midx2]]
(False, False, True, True) -> [Polyline [midx2, midx1]]
(False, True, False, True) -> [Polyline [midy2, midy1]]
( True, False, True, False) -> [Polyline [midy1, midy2]]
( True, False, False, False) -> [Polyline [midx1, midy2]]
(False, True, True, True) -> [Polyline [midy2, midx1]]
( True, True, False, True) -> [Polyline [midx1, midy1]]
(False, False, True, False) -> [Polyline [midy1, midx1]]
( True, True, True, False) -> [Polyline [midy1, midx2]]
(False, False, False, True) -> [Polyline [midx2, midy1]]
( True, False, True, True) -> [Polyline [midx2, midy2]]
(False, True, False, False) -> [Polyline [midy2, midx2]]
(True, False, False, True) -> if c <= 0
then [Polyline [midx1, midy1], Polyline [midx2, midy2]]
else [Polyline [midx1, midy2], Polyline [midx2, midy1]]
(False, True, True, False) -> if c <= 0
then [Polyline [midy2, midx1], Polyline [midy1, midx2]]
else [Polyline [midy1, midx1], Polyline [midy2, midx2]]