2016-09-11 10 views
1

Ich versuche zu verstehen, wie Diagramme Bibliothek in Haskell zu verwenden.So erstellen Sie diese einfache GIF-Animation mit Diagrammen

Hier ist mein Versuch, eine einfache GIF-Animation zu machen, die zwischen zwei Kreisen mit den Radien Schalter 1 und 2. Ich habe versucht zu imitieren, was ich auf

sah

Hier ist der Code, habe ich versucht.

{-# 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 

Aber das kompiliert nicht! Die Fehler, die ich bekomme, sind

[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 

Wo gehe ich falsch in den Code oben?

+1

Anstelle von 'take 2 (repeat x)' können Sie 'replicate 2 x' verwenden. –

+2

@JoachimBreitner: oder einfach' repeat x' in diesem Fall, da die 'zip' dafür sorgt, dass sie nur abgeschnitten wird richtige Länge – Cactus

+0

@Cactus Or einfach 'map (\ d -> (d, 3))', da 'zip'ing mit einer konstanten Liste Overkill ist. –

Antwort

3

Ich brauchte einen Moment, um es herauszufinden, weil die Fehlermeldung überhaupt nicht offensichtlich ist, aber es ist ein Backend-Problem. The documentation besagt, dass das Cairo Backend animierte Gif erstellen kann. Allerdings verwenden Sie das SVG-Backend (das verstehen nicht in der Lage, ist, was [(Diagram B, Int)] ist.

Um dies zu lösen, stellen Sie sicher, dass das diagrams-cairo Paket installiert ist, und ändern Sie die Zeile

import Diagrams.Backend.SVG.CmdLine 

zu

import Diagrams.Backend.Cairo.CmdLine 
+0

Danke! Ich habe deinen Vorschlag ausprobiert und es kompiliert. Ich lief es mit './main -o output.gif -w 400' Aber die resultierende gif-Datei war nur ein großes schwarzes Quadrat: keine Kreise wurden gezeigt. Hattest du die gleichen Probleme auf deinem Computer? – smilingbuddha

+1

@smilingbuddha: Es scheint, dass das GIF-Backend standardmäßig schwarzen Hintergrund und Vordergrund hat; wenn Sie z.B. 'circle 1 # lc white' Dann siehst du einen weißen Umriss eines Kreises auf schwarzem Hintergrund. – Cactus

+0

@Cactus Oh, ich verstehe. Vielen Dank!!! Ich habe versucht, '# white' zu ​​beiden Elementen meines Arrays hinzuzufügen. Aber jetzt sehe ich nur einen einzigen weißen Kreis auf schwarzem Grund. Ich wollte, dass die Animation zwischen den beiden weißen Kreisen wechselt. – smilingbuddha

Verwandte Themen