module Graphics.Implicit.Export.Render.Interpolate (interpolate) where
import Prelude((*), (>), (<), (/=), (+), (-), (/), (==), (&&), abs)
import Graphics.Implicit.Definitions (ℝ, Fastℕ, ℝ2)
import Linear (V2(V2))
default (Fastℕ, ℝ)
interpolate :: ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ -> ℝ
interpolate :: ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ -> ℝ
interpolate (V2 ℝ
a ℝ
aval) (V2 ℝ
_ ℝ
bval) ℝ -> ℝ
_ ℝ
_ | ℝ
avalforall a. Num a => a -> a -> a
*ℝ
bval forall a. Ord a => a -> a -> Bool
> ℝ
0 = ℝ
a
interpolate (V2 ℝ
a ℝ
0) ℝ2
_ ℝ -> ℝ
_ ℝ
_ = ℝ
a
interpolate ℝ2
_ (V2 ℝ
b ℝ
0) ℝ -> ℝ
_ ℝ
_ = ℝ
b
interpolate (V2 ℝ
a ℝ
aval) (V2 ℝ
b ℝ
bval) ℝ -> ℝ
f ℝ
_ =
if ℝ
aval forall a. Ord a => a -> a -> Bool
> ℝ
bval
then Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateLin Fastℕ
0 (forall a. a -> a -> V2 a
V2 ℝ
a ℝ
aval) (forall a. a -> a -> V2 a
V2 ℝ
b ℝ
bval) ℝ -> ℝ
f
else Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateLin Fastℕ
0 (forall a. a -> a -> V2 a
V2 ℝ
b ℝ
bval) (forall a. a -> a -> V2 a
V2 ℝ
a ℝ
aval) ℝ -> ℝ
f
interpolateLin :: Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateLin :: Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateLin Fastℕ
n (V2 ℝ
a ℝ
aval) (V2 ℝ
b ℝ
bval) ℝ -> ℝ
obj | ℝ
aval forall a. Eq a => a -> a -> Bool
/= ℝ
bval=
let
mid :: ℝ
mid :: ℝ
mid = ℝ
a forall a. Num a => a -> a -> a
+ (ℝ
bforall a. Num a => a -> a -> a
-ℝ
a)forall a. Num a => a -> a -> a
*ℝ
avalforall a. Fractional a => a -> a -> a
/(ℝ
avalforall a. Num a => a -> a -> a
-ℝ
bval)
midval :: ℝ
midval = ℝ -> ℝ
obj ℝ
mid
in if ℝ
midval forall a. Eq a => a -> a -> Bool
== ℝ
0
then ℝ
mid
else let
(ℝ
a', ℝ
a'val, ℝ
b', ℝ
b'val, ℝ
improveRatio) =
if ℝ
midval forall a. Ord a => a -> a -> Bool
> ℝ
0
then (ℝ
mid, ℝ
midval, ℝ
b, ℝ
bval, ℝ
midvalforall a. Fractional a => a -> a -> a
/ℝ
aval)
else (ℝ
a, ℝ
aval, ℝ
mid, ℝ
midval, ℝ
midvalforall a. Fractional a => a -> a -> a
/ℝ
bval)
in if ℝ
improveRatio forall a. Ord a => a -> a -> Bool
< ℝ
0.3 Bool -> Bool -> Bool
&& Fastℕ
n forall a. Ord a => a -> a -> Bool
< Fastℕ
4
then Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateLin (Fastℕ
nforall a. Num a => a -> a -> a
+Fastℕ
1) (forall a. a -> a -> V2 a
V2 ℝ
a' ℝ
a'val) (forall a. a -> a -> V2 a
V2 ℝ
b' ℝ
b'val) ℝ -> ℝ
obj
else Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateBin (Fastℕ
nforall a. Num a => a -> a -> a
+Fastℕ
1) (forall a. a -> a -> V2 a
V2 ℝ
a' ℝ
a'val) (forall a. a -> a -> V2 a
V2 ℝ
b' ℝ
b'val) ℝ -> ℝ
obj
interpolateLin Fastℕ
_ (V2 ℝ
a ℝ
_) ℝ2
_ ℝ -> ℝ
_ = ℝ
a
interpolateBin :: Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateBin :: Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateBin Fastℕ
5 (V2 ℝ
a ℝ
aval) (V2 ℝ
b ℝ
bval) ℝ -> ℝ
_ =
if forall a. Num a => a -> a
abs ℝ
aval forall a. Ord a => a -> a -> Bool
< forall a. Num a => a -> a
abs ℝ
bval
then ℝ
a
else ℝ
b
interpolateBin Fastℕ
n (V2 ℝ
a ℝ
aval) (V2 ℝ
b ℝ
bval) ℝ -> ℝ
f =
let
mid :: ℝ
mid :: ℝ
mid = (ℝ
aforall a. Num a => a -> a -> a
+ℝ
b)forall a. Fractional a => a -> a -> a
/ℝ
2
midval :: ℝ
midval = ℝ -> ℝ
f ℝ
mid
in if ℝ
midval forall a. Ord a => a -> a -> Bool
> ℝ
0
then Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateBin (Fastℕ
nforall a. Num a => a -> a -> a
+Fastℕ
1) (forall a. a -> a -> V2 a
V2 ℝ
mid ℝ
midval) (forall a. a -> a -> V2 a
V2 ℝ
b ℝ
bval) ℝ -> ℝ
f
else Fastℕ -> ℝ2 -> ℝ2 -> (ℝ -> ℝ) -> ℝ
interpolateBin (Fastℕ
nforall a. Num a => a -> a -> a
+Fastℕ
1) (forall a. a -> a -> V2 a
V2 ℝ
a ℝ
aval) (forall a. a -> a -> V2 a
V2 ℝ
mid ℝ
midval) ℝ -> ℝ
f