HaskellのDiagramsライブラリ
今日はDiagramsのことを知った。
Diagrams - About diagrams
DiagramsはHaskellで使えるベクターグラフィックス・ライブラリを生成するためのドメイン特化言語。ギャラリーを見ると、どんなことができるか少しだけ分かる。
チュートリアルの最初の例。
{-# LANGUAGE NoMonomorphismRestriction #-} import Diagrams.Prelude import Diagrams.Backend.Cairo.CmdLine main = defaultMain (circle 1)
これをコンパイルして、実行する。
$ ghc --make DiagramsTutorial.hs [1 of 1] Compiling Main ( DiagramsTutorial.hs, DiagramsTutorial.o ) Linking DiagramsTutorial ... $ ./DiagramsTutorial -o circle.png -w 200
runghcで実行してもいい。
$ runghc DiagramsTutorial.hs -o circle.png -w 200
最初の例は、単に円が出力される。
円を塗りつぶす色を指定してみよう。
{-# LANGUAGE NoMonomorphismRestriction #-} import Diagrams.Prelude import Diagrams.Backend.Cairo.CmdLine import Data.Colour.Names main = defaultMain myDiagram myDiagram = circle 1 # fc skyblue
演算子 (#) は、右辺の関数を左辺に適用する。
x # f = f x
だから、上の例は
myDiagram = fc skyblue (circle 1)
と同じ。
skyblueはData.Colour.Namesで定義されている。
今度は図形を重ねる。
myDiagram = square 0.5 # fc yellow `atop` circle 1 # fc skyblue
`atop`は図形を重ねる。左辺の図形が上にくる。こんな感じで図形に関数を適用していって、目的の図を作ることができる。
雪だるまの顔を描いてみる。
{-# LANGUAGE NoMonomorphismRestriction #-} import Diagrams.Prelude import Diagrams.Backend.Cairo.CmdLine import Data.Colour.Names main = defaultMain snowman'sFace snowman'sFace = nose `atop` eyes `atop` mouth `atop` face eyes = (translateY 0.4) . centerXY $ eye ||| strutX 0.2 ||| eye eye = circle 0.2 # fc black face = circle 1 # fc snow nose = circle 0.2 # fc tomato mouth = arc (tau * 6 / 10 :: Rad) (tau * 9 / 10 :: Rad) # scale 0.6 # lw 0.1
(雪だるまの顔に見えるかは少し厳しい)
この前(はてブで)話題になっていたFactorization diagramsもDiagramsで。
Factorization diagrams | The Math Less Traveled
もっと詳しい使い方はチュートリアル(英語)とかユーザーマニュアル(英語)を読むといいよ。