never executed always true always false
    1 module Reanimate.Morph.Linear
    2   ( linear, rawLinear
    3   , linearCorrespondence
    4   , closestLinearCorrespondence
    5   , closestLinearCorrespondenceA
    6   , linearTrajectory
    7   ) where
    8 
    9 import           Data.Hashable
   10 import qualified Data.Vector            as V
   11 import           Linear.Vector
   12 import           Reanimate.ColorComponents
   13 import           Reanimate.Math.Common
   14 import           Reanimate.Math.Polygon
   15 import           Reanimate.Morph.Cache
   16 import           Reanimate.Morph.Common
   17 
   18 linear :: Morph
   19 linear = rawLinear
   20   { morphPointCorrespondence  =
   21       cachePointCorrespondence (hash ("closest"::String))
   22         closestLinearCorrespondence }
   23 
   24 rawLinear :: Morph
   25 rawLinear = Morph
   26   { morphTolerance            = 0.001
   27   , morphColorComponents      = labComponents
   28   , morphPointCorrespondence  = linearCorrespondence
   29   , morphTrajectory           = linearTrajectory
   30   , morphObjectCorrespondence = splitObjectCorrespondence }
   31 
   32 linearCorrespondence :: PointCorrespondence
   33 linearCorrespondence = normalizePolygons
   34 
   35 closestLinearCorrespondence :: PointCorrespondence
   36 closestLinearCorrespondence = closestLinearCorrespondenceA
   37 
   38 closestLinearCorrespondenceA :: (Real a, Fractional a) => APolygon a -> APolygon a -> (APolygon a, APolygon a)
   39 closestLinearCorrespondenceA src' dst' =
   40     (src, worker dst (score dst) options)
   41   where
   42     (src, dst) = normalizePolygons src' dst'
   43     worker bestP _bestPScore [] = bestP
   44     worker bestP bestPScore (x:xs) =
   45       let newScore = score x in
   46       if newScore < bestPScore
   47         then worker x newScore xs
   48         else worker bestP bestPScore xs
   49     options = pCycles dst
   50     score p = sum
   51       [ -- approxDist (pAccess src n) (pAccess p n)
   52         distSquared (pAccess src n) (pAccess p n)
   53       | n <- [0 .. pSize src-1] ]
   54 
   55 linearTrajectory :: Trajectory
   56 linearTrajectory (src,dst)
   57   | pSize src == pSize dst = \t -> mkPolygon $
   58     V.zipWith (lerp $ realToFrac t) (polygonPoints dst) (polygonPoints src)
   59   | otherwise = error $ "Invalid lengths: " ++ show (pSize src, pSize dst)