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