mirror of
https://github.com/reanimate/reanimate.git
synced 2026-09-15 18:12:20 +00:00
Deploying to gh-pages from @ 15472e46f8 🚀
This commit is contained in:
parent
41ccaf574b
commit
555e89d5cb
7 changed files with 523 additions and 489 deletions
|
|
@ -44,70 +44,74 @@ span.spaces { background: white }
|
|||
<span class="lineno"> 25 </span>--
|
||||
<span class="lineno"> 26 </span>-- Example:
|
||||
<span class="lineno"> 27 </span>--
|
||||
<span class="lineno"> 28 </span>-- > playThenReverseA $ pauseAround 0.5 0.5 $ mkAnimation 3 $ \t ->
|
||||
<span class="lineno"> 29 </span>-- > withStrokeLineJoin JoinRound $
|
||||
<span class="lineno"> 30 </span>-- > let src = scale 8 $ center $ latex "X"
|
||||
<span class="lineno"> 31 </span>-- > dst = scale 8 $ center $ latex "H"
|
||||
<span class="lineno"> 32 </span>-- > in morph linear src dst t
|
||||
<span class="lineno"> 33 </span>--
|
||||
<span class="lineno"> 34 </span>-- <<docs/gifs/doc_linear.gif>>
|
||||
<span class="lineno"> 35 </span>linear :: Morph
|
||||
<span class="lineno"> 36 </span><span class="decl"><span class="nottickedoff">linear = rawLinear</span>
|
||||
<span class="lineno"> 37 </span><span class="spaces"> </span><span class="nottickedoff">{ morphPointCorrespondence =</span>
|
||||
<span class="lineno"> 38 </span><span class="spaces"> </span><span class="nottickedoff">cachePointCorrespondence (hash ("closest"::String))</span>
|
||||
<span class="lineno"> 39 </span><span class="spaces"> </span><span class="nottickedoff">closestLinearCorrespondence }</span></span>
|
||||
<span class="lineno"> 40 </span>
|
||||
<span class="lineno"> 41 </span>-- | Linear interpolation strategy without realigning corners.
|
||||
<span class="lineno"> 42 </span>-- May give better results if the polygons are already aligned.
|
||||
<span class="lineno"> 43 </span>-- Usually gives worse results.
|
||||
<span class="lineno"> 44 </span>--
|
||||
<span class="lineno"> 45 </span>-- Example:
|
||||
<span class="lineno"> 28 </span>-- @
|
||||
<span class="lineno"> 29 </span>-- 'Reanimate.playThenReverseA' $ 'Reanimate.pauseAround' 0.5 0.5 $ 'Reanimate.mkAnimation' 3 $ \\t ->
|
||||
<span class="lineno"> 30 </span>-- 'Reanimate.withStrokeLineJoin' 'Graphics.SvgTree.JoinRound' $
|
||||
<span class="lineno"> 31 </span>-- let src = 'Reanimate.scale' 8 $ 'Reanimate.center' $ 'Reanimate.LaTeX.latex' \"X\"
|
||||
<span class="lineno"> 32 </span>-- dst = 'Reanimate.scale' 8 $ 'Reanimate.center' $ 'Reanimate.LaTeX.latex' \"H\"
|
||||
<span class="lineno"> 33 </span>-- in 'morph' 'linear' src dst t
|
||||
<span class="lineno"> 34 </span>-- @
|
||||
<span class="lineno"> 35 </span>--
|
||||
<span class="lineno"> 36 </span>-- <<docs/gifs/doc_linear.gif>>
|
||||
<span class="lineno"> 37 </span>linear :: Morph
|
||||
<span class="lineno"> 38 </span><span class="decl"><span class="nottickedoff">linear = rawLinear</span>
|
||||
<span class="lineno"> 39 </span><span class="spaces"> </span><span class="nottickedoff">{ morphPointCorrespondence =</span>
|
||||
<span class="lineno"> 40 </span><span class="spaces"> </span><span class="nottickedoff">cachePointCorrespondence (hash ("closest"::String))</span>
|
||||
<span class="lineno"> 41 </span><span class="spaces"> </span><span class="nottickedoff">closestLinearCorrespondence }</span></span>
|
||||
<span class="lineno"> 42 </span>
|
||||
<span class="lineno"> 43 </span>-- | Linear interpolation strategy without realigning corners.
|
||||
<span class="lineno"> 44 </span>-- May give better results if the polygons are already aligned.
|
||||
<span class="lineno"> 45 </span>-- Usually gives worse results.
|
||||
<span class="lineno"> 46 </span>--
|
||||
<span class="lineno"> 47 </span>-- > playThenReverseA $ pauseAround 0.5 0.5 $ mkAnimation 3 $ \t ->
|
||||
<span class="lineno"> 48 </span>-- > withStrokeLineJoin JoinRound $
|
||||
<span class="lineno"> 49 </span>-- > let src = scale 8 $ center $ latex "X"
|
||||
<span class="lineno"> 50 </span>-- > dst = scale 8 $ center $ latex "H"
|
||||
<span class="lineno"> 51 </span>-- > in morph rawLinear src dst t
|
||||
<span class="lineno"> 52 </span>--
|
||||
<span class="lineno"> 53 </span>-- <<docs/gifs/doc_rawLinear.gif>>
|
||||
<span class="lineno"> 54 </span>rawLinear :: Morph
|
||||
<span class="lineno"> 55 </span><span class="decl"><span class="istickedoff">rawLinear = Morph</span>
|
||||
<span class="lineno"> 56 </span><span class="spaces"> </span><span class="istickedoff">{ morphTolerance = 0.001</span>
|
||||
<span class="lineno"> 57 </span><span class="spaces"> </span><span class="istickedoff">, morphColorComponents = <span class="nottickedoff">labComponents</span></span>
|
||||
<span class="lineno"> 58 </span><span class="spaces"> </span><span class="istickedoff">, morphPointCorrespondence = normalizePolygons</span>
|
||||
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff">, morphTrajectory = linearTrajectory</span>
|
||||
<span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff">, morphObjectCorrespondence = splitObjectCorrespondence }</span></span>
|
||||
<span class="lineno"> 61 </span>
|
||||
<span class="lineno"> 62 </span>-- | Cycle polygons until the sum of the point trajectory path lengths
|
||||
<span class="lineno"> 63 </span>-- is smallest.
|
||||
<span class="lineno"> 64 </span>closestLinearCorrespondence :: PointCorrespondence
|
||||
<span class="lineno"> 65 </span><span class="decl"><span class="nottickedoff">closestLinearCorrespondence = closestLinearCorrespondenceA</span></span>
|
||||
<span class="lineno"> 66 </span>
|
||||
<span class="lineno"> 67 </span>-- | Cycle polygons until the sum of the point trajectory path lengths
|
||||
<span class="lineno"> 68 </span>-- is smallest.
|
||||
<span class="lineno"> 69 </span>closestLinearCorrespondenceA :: (Real a, Fractional a, Epsilon a) => APolygon a -> APolygon a -> (APolygon a, APolygon a)
|
||||
<span class="lineno"> 70 </span><span class="decl"><span class="nottickedoff">closestLinearCorrespondenceA src' dst' =</span>
|
||||
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="nottickedoff">(src, worker dst (score dst) options)</span>
|
||||
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 73 </span><span class="spaces"> </span><span class="nottickedoff">(src, dst) = normalizePolygons src' dst'</span>
|
||||
<span class="lineno"> 74 </span><span class="spaces"> </span><span class="nottickedoff">worker bestP _bestPScore [] = bestP</span>
|
||||
<span class="lineno"> 75 </span><span class="spaces"> </span><span class="nottickedoff">worker bestP bestPScore (x:xs) =</span>
|
||||
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="nottickedoff">let newScore = score x in</span>
|
||||
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="nottickedoff">if newScore < bestPScore</span>
|
||||
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="nottickedoff">then worker x newScore xs</span>
|
||||
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="nottickedoff">else worker bestP bestPScore xs</span>
|
||||
<span class="lineno"> 80 </span><span class="spaces"> </span><span class="nottickedoff">options = pCycles dst</span>
|
||||
<span class="lineno"> 81 </span><span class="spaces"> </span><span class="nottickedoff">score p = sum</span>
|
||||
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="nottickedoff">[ -- approxDist (pAccess src n) (pAccess p n)</span>
|
||||
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">distSquared (pAccess src n) (pAccess p n)</span>
|
||||
<span class="lineno"> 84 </span><span class="spaces"> </span><span class="nottickedoff">| n <- [0 .. pSize src-1] ]</span></span>
|
||||
<span class="lineno"> 85 </span>
|
||||
<span class="lineno"> 86 </span>-- | Strategy for moving points in a linear (straight-line) trajectory.
|
||||
<span class="lineno"> 87 </span>linearTrajectory :: Trajectory
|
||||
<span class="lineno"> 88 </span><span class="decl"><span class="istickedoff">linearTrajectory (src,dst)</span>
|
||||
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">pSize src == pSize dst</span> = \t -> mkPolygon $</span>
|
||||
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="istickedoff">V.zipWith (lerp $ realToFrac t) (polygonPoints dst) (polygonPoints src)</span>
|
||||
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">error $ "Invalid lengths: " ++ show (pSize src, pSize dst)</span></span></span>
|
||||
<span class="lineno"> 47 </span>-- Example:
|
||||
<span class="lineno"> 48 </span>--
|
||||
<span class="lineno"> 49 </span>-- @
|
||||
<span class="lineno"> 50 </span>-- 'Reanimate.playThenReverseA' $ 'Reanimate.pauseAround' 0.5 0.5 $ 'Reanimate.mkAnimation' 3 $ \\t ->
|
||||
<span class="lineno"> 51 </span>-- 'Reanimate.withStrokeLineJoin' 'Graphics.SvgTree.JoinRound' $
|
||||
<span class="lineno"> 52 </span>-- let src = 'Reanimate.scale' 8 $ 'Reanimate.center' $ 'Reanimate.LaTeX.latex' \"X\"
|
||||
<span class="lineno"> 53 </span>-- dst = 'Reanimate.scale' 8 $ 'Reanimate.center' $ 'Reanimate.LaTeX.latex' \"H\"
|
||||
<span class="lineno"> 54 </span>-- in 'morph' 'rawLinear' src dst t
|
||||
<span class="lineno"> 55 </span>-- @
|
||||
<span class="lineno"> 56 </span>--
|
||||
<span class="lineno"> 57 </span>-- <<docs/gifs/doc_rawLinear.gif>>
|
||||
<span class="lineno"> 58 </span>rawLinear :: Morph
|
||||
<span class="lineno"> 59 </span><span class="decl"><span class="istickedoff">rawLinear = Morph</span>
|
||||
<span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff">{ morphTolerance = 0.001</span>
|
||||
<span class="lineno"> 61 </span><span class="spaces"> </span><span class="istickedoff">, morphColorComponents = <span class="nottickedoff">labComponents</span></span>
|
||||
<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">, morphPointCorrespondence = normalizePolygons</span>
|
||||
<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff">, morphTrajectory = linearTrajectory</span>
|
||||
<span class="lineno"> 64 </span><span class="spaces"> </span><span class="istickedoff">, morphObjectCorrespondence = splitObjectCorrespondence }</span></span>
|
||||
<span class="lineno"> 65 </span>
|
||||
<span class="lineno"> 66 </span>-- | Cycle polygons until the sum of the point trajectory path lengths
|
||||
<span class="lineno"> 67 </span>-- is smallest.
|
||||
<span class="lineno"> 68 </span>closestLinearCorrespondence :: PointCorrespondence
|
||||
<span class="lineno"> 69 </span><span class="decl"><span class="nottickedoff">closestLinearCorrespondence = closestLinearCorrespondenceA</span></span>
|
||||
<span class="lineno"> 70 </span>
|
||||
<span class="lineno"> 71 </span>-- | Cycle polygons until the sum of the point trajectory path lengths
|
||||
<span class="lineno"> 72 </span>-- is smallest.
|
||||
<span class="lineno"> 73 </span>closestLinearCorrespondenceA :: (Real a, Fractional a, Epsilon a) => APolygon a -> APolygon a -> (APolygon a, APolygon a)
|
||||
<span class="lineno"> 74 </span><span class="decl"><span class="nottickedoff">closestLinearCorrespondenceA src' dst' =</span>
|
||||
<span class="lineno"> 75 </span><span class="spaces"> </span><span class="nottickedoff">(src, worker dst (score dst) options)</span>
|
||||
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="nottickedoff">(src, dst) = normalizePolygons src' dst'</span>
|
||||
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="nottickedoff">worker bestP _bestPScore [] = bestP</span>
|
||||
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="nottickedoff">worker bestP bestPScore (x:xs) =</span>
|
||||
<span class="lineno"> 80 </span><span class="spaces"> </span><span class="nottickedoff">let newScore = score x in</span>
|
||||
<span class="lineno"> 81 </span><span class="spaces"> </span><span class="nottickedoff">if newScore < bestPScore</span>
|
||||
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="nottickedoff">then worker x newScore xs</span>
|
||||
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">else worker bestP bestPScore xs</span>
|
||||
<span class="lineno"> 84 </span><span class="spaces"> </span><span class="nottickedoff">options = pCycles dst</span>
|
||||
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="nottickedoff">score p = sum</span>
|
||||
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="nottickedoff">[ -- approxDist (pAccess src n) (pAccess p n)</span>
|
||||
<span class="lineno"> 87 </span><span class="spaces"> </span><span class="nottickedoff">distSquared (pAccess src n) (pAccess p n)</span>
|
||||
<span class="lineno"> 88 </span><span class="spaces"> </span><span class="nottickedoff">| n <- [0 .. pSize src-1] ]</span></span>
|
||||
<span class="lineno"> 89 </span>
|
||||
<span class="lineno"> 90 </span>-- | Strategy for moving points in a linear (straight-line) trajectory.
|
||||
<span class="lineno"> 91 </span>linearTrajectory :: Trajectory
|
||||
<span class="lineno"> 92 </span><span class="decl"><span class="istickedoff">linearTrajectory (src,dst)</span>
|
||||
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">pSize src == pSize dst</span> = \t -> mkPolygon $</span>
|
||||
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">V.zipWith (lerp $ realToFrac t) (polygonPoints dst) (polygonPoints src)</span>
|
||||
<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">error $ "Invalid lengths: " ++ show (pSize src, pSize dst)</span></span></span>
|
||||
|
||||
</pre>
|
||||
</body>
|
||||
|
|
|
|||
Loading…
Reference in a new issue