1

我正在尝试用Haskell Diagram创建一个动画。我正在为此使用Reanimate 。我试过这段代码:

{-# LANGUAGE OverloadedStrings #-}
module Reanimate.Diagrams
  ( renderDiagram
  ) where

import Data.Text.Lazy (toStrict)
import Diagrams.Backend.SVG (SVG (SVG), Options (SVGOptions))
import Diagrams.Core.Types (Diagram)
import Diagrams.Core.Compile (renderDia)
import Diagrams.Size (absolute)
import Graphics.Svg.Core (renderText)
import Graphics.SvgTree (Tree, parseSvgFile)
import Reanimate.Svg.Unuse (unbox)

import Data.Maybe (maybe)

renderDiagram :: Diagram SVG -> Tree
renderDiagram d =
  let opts = SVGOptions absolute Nothing "" [] False
      e = renderDia SVG opts d
      t = toStrict $ renderText e
      err = error "Malformed SVG"
  in  maybe err unbox (parseSvgFile "" t)

和:

module Main where

import Diagrams.Core.Types (Diagram)
import Diagrams.Backend.SVG (B)
import Diagrams.TwoD.Ellipse (circle)

import Reanimate (addStatic, mkBackground, reanimate, staticFrame)
import Reanimate.Diagrams (renderDiagram)

main :: IO ()
main = reanimate $ addStatic (mkBackground "cyan")
                 $ staticFrame 1 $ renderDiagram dia

dia :: Diagram B
dia = circle 1 # lw 0.1 <> square 1 # lw 0.1 # (moveTo $ p2 (1, 1))

我明白了: 图片

但是,如果我直接生成图表(没有 Reanimate):

main :: IO ()
main = mainWith $ bg white $ dia

我明白了: 图片

还是线宽的问题……图好像也是垂直翻转的。谢谢

编辑:添加箭头也会带来问题。

dia :: Diagram B
dia = (circle 1 # lw 0.01 # named "circle"
   <> square 1 # lw 0.01 # (moveTo $ p2 (1, 1)) # named "square")
   #  connect "circle" "square"

给出: 在此处输入图像描述

4

0 回答 0