{-# LANGUAGE BlockArguments #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE PolyKinds #-} module Geomancy.Interpolate ( linear , linearE , b1 , quadratic , quadraticE , b2 , cubic , cubicE , b3 ) where import Data.VectorSpace (VectorSpace, (*^), (^+^)) import Geomancy.Elementwise (Element, Elementwise(..)) {-# INLINEABLE linear #-} linear :: (VectorSpace v a, Num a) => v -> v -> a -> v linear :: forall v a. (VectorSpace v a, Num a) => v -> v -> a -> v linear v p0 v p1 a t = a b01 forall v a. VectorSpace v a => a -> v -> v *^ v p0 forall v a. VectorSpace v a => v -> v -> v ^+^ a b11 forall v a. VectorSpace v a => a -> v -> v *^ v p1 where (a b01, a b11) = forall b. Num b => b -> (b, b) b1 a t {-# INLINEABLE linearE #-} linearE :: (Elementwise v, Element v ~ Float) => v -> v -> v -> v linearE :: forall v. (Elementwise v, Element v ~ Float) => v -> v -> v -> v linearE = forall a. Elementwise a => (Element a -> Element a -> Element a -> Element a) -> a -> a -> a -> a emap3 forall v a. (VectorSpace v a, Num a) => v -> v -> a -> v linear {-# INLINE b1 #-} b1 :: Num b => b -> (b, b) b1 :: forall b. Num b => b -> (b, b) b1 b t = ( b 1 forall a. Num a => a -> a -> a - b t , b t ) {-# INLINEABLE quadratic #-} quadratic :: (VectorSpace v a, Num a) => v -> v -> v -> a -> v quadratic :: forall v a. (VectorSpace v a, Num a) => v -> v -> v -> a -> v quadratic v p0 v p1 v p2 a t = a b02 forall v a. VectorSpace v a => a -> v -> v *^ v p0 forall v a. VectorSpace v a => v -> v -> v ^+^ a b12 forall v a. VectorSpace v a => a -> v -> v *^ v p1 forall v a. VectorSpace v a => v -> v -> v ^+^ a b22 forall v a. VectorSpace v a => a -> v -> v *^ v p2 where (a b02, a b12, a b22) = forall c. Num c => c -> (c, c, c) b2 a t {-# INLINEABLE quadraticE #-} quadraticE :: (Elementwise v, Element v ~ Float) => v -> v -> v -> v -> v quadraticE :: forall v. (Elementwise v, Element v ~ Float) => v -> v -> v -> v -> v quadraticE = forall a. Elementwise a => (Element a -> Element a -> Element a -> Element a -> Element a) -> a -> a -> a -> a -> a emap4 forall v a. (VectorSpace v a, Num a) => v -> v -> v -> a -> v quadratic {-# INLINE b2 #-} b2 :: Num c => c -> (c, c, c) b2 :: forall c. Num c => c -> (c, c, c) b2 c t = ( c 1 forall a. Num a => a -> a -> a - c 2 forall a. Num a => a -> a -> a * c t forall a. Num a => a -> a -> a + c t forall a. Num a => a -> a -> a * c t , c 2 forall a. Num a => a -> a -> a * c t forall a. Num a => a -> a -> a - c 2 forall a. Num a => a -> a -> a * c t forall a. Num a => a -> a -> a * c t , c t forall a. Num a => a -> a -> a * c t ) {-# INLINEABLE cubic #-} cubic :: (VectorSpace v a, Num a) => v -> v -> v -> v -> a -> v cubic :: forall v a. (VectorSpace v a, Num a) => v -> v -> v -> v -> a -> v cubic v p0 v p1 v p2 v p3 a t = a b03 forall v a. VectorSpace v a => a -> v -> v *^ v p0 forall v a. VectorSpace v a => v -> v -> v ^+^ a b13 forall v a. VectorSpace v a => a -> v -> v *^ v p1 forall v a. VectorSpace v a => v -> v -> v ^+^ a b23 forall v a. VectorSpace v a => a -> v -> v *^ v p2 forall v a. VectorSpace v a => v -> v -> v ^+^ a b33 forall v a. VectorSpace v a => a -> v -> v *^ v p3 where (a b03, a b13, a b23, a b33) = forall d. Num d => d -> (d, d, d, d) b3 a t {-# INLINEABLE cubicE #-} cubicE :: (Elementwise v, Element v ~ Float) => v -> v -> v -> v -> v -> v cubicE :: forall v. (Elementwise v, Element v ~ Float) => v -> v -> v -> v -> v -> v cubicE = forall a. Elementwise a => (Element a -> Element a -> Element a -> Element a -> Element a -> Element a) -> a -> a -> a -> a -> a -> a emap5 forall v a. (VectorSpace v a, Num a) => v -> v -> v -> v -> a -> v cubic {-# INLINE b3 #-} b3 :: Num d => d -> (d, d, d, d) b3 :: forall d. Num d => d -> (d, d, d, d) b3 d t = ( d 1 forall a. Num a => a -> a -> a - d 3 forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a + d 3 forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a - d t forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a * d t , d 3 forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a - d 6 forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a + d 3 forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a * d t , d 3 forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a - d 3 forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a * d t , d t forall a. Num a => a -> a -> a * d t forall a. Num a => a -> a -> a * d t )