如何使用Diagrams创建这个简单的gif动画

时间:2016-09-11 23:37:15

标签: haskell

我试图了解如何在Haskell中使用Diagrams库。

这是我尝试制作一个简单的gif动画,它在两个半径为1和2的圆圈之间切换。我试图模仿我所看到的

这是代码,我试过了。

{-# LANGUAGE NoMonomorphismRestriction #-}
import Diagrams.Backend.SVG.CmdLine
import Diagrams.Prelude

delays = take 2 (repeat 3)

gif :: [(Diagram B, Int)]
gif = zip [circle 1, circle 2] delays

main = mainWith $ gif

但这无法编译!我得到的错误是

[1 of 1] Compiling Main             ( maze.hs, maze.o )

maze.hs:10:8:
    No instance for (Diagrams.Backend.CmdLine.Parseable
                       (Diagrams.Backend.CmdLine.MainOpts
                          [(QDiagram B V2 Double Any, Int)]))
      arising from a use of ‘mainWith’
    In the expression: mainWith
    In the expression: mainWith $ gif
    In an equation for ‘main’: main = mainWith $ gif

上面的代码我哪里出错了?

2 个答案:

答案 0 :(得分:3)

我花了一点时间弄明白,因为错误信息根本不明显,但这是一个后端问题。 The documentation声明cairo后端可以创建GIF动画。但是,您使用的是svg后端(无法理解[(Diagram B, Int)]是什么。

要解决此问题,请确保已安装diagrams-cairo软件包,并更改行

import Diagrams.Backend.SVG.CmdLine

import Diagrams.Backend.Cairo.CmdLine

答案 1 :(得分:2)

我将解释必要的其他步骤,因为这是在图表中进行动画的第一个搜索结果之一。图表将视口重新调整为每个圆的图像大小,以便circle 1circle 2等效。要解决此问题,您可以将圆圈放在与circle 2相同大小的不可见方块上。 此外,延迟时间为1/100秒。那么正确的代码就是:

{-# LANGUAGE NoMonomorphismRestriction #-}
import Diagrams.Backend.Cairo.CmdLine
import Diagrams.Prelude

gif :: [(Diagram B, Int)]
gif = map (\x -> (x # lc white <> square 4 # lw none,300)) [circle 1,circle 2]

main = mainWith gif