GHCで直接Glossを使えるようになった


2012年 12月 31日

import Graphics.Gloss
が最初の行にあるので、まずは、Graphics.Glossについて調べてみよう。

gloss-1.7.8.1: Painless 2D vector graphics, animations and simulations.

haskell.orgのちゃんとした正式ドキュメントと、前回書いたものを比較してみよう。
Webから実行したときのプログラムがこれ。

import Graphics.Gloss
picture = circle 80

そして、Graphics.Gloss のページのサンプルプログラムがこれ。

import Graphics.Gloss
main = display (InWindow "Nice Window" (200, 200) (10, 10)) white (Circle 80)

mainがあって、displayの後ろのごちゃごちゃあって、最後に (Circle 80) とある。

まずは、これをそのまま sample.hs としてソースプログラムを作っちゃって、実行してみよう。

$ cat sample.hs
import Graphics.Gloss
main = display (InWindow "Nice Window" (200, 200) (10, 10)) white (circle 80)
$ ghc sample.hs
[1 of 1] Compiling Main             ( sample.hs, sample.o )
Linking sample ...
$ sample

出来上がった sample を実行すると、次のウィンドウが画面左上の方に出た。

sample-circle.png

さて、 display について調べよう。

displaySource
:: Display    Display mode.
-> Color    Background color.
-> Picture    The picture to draw.
-> IO ()

Open a new window and display the given picture. 

との説明があった。
さらに、 Display については、

InWindow String (Int, Int) (Int, Int)    
Display in a window with the given name, size and position. 

とあった、 InWindow の直後の文字列が、ウィンドウの名前になるようだ。
実際、sample.hs では、”Nice Window”としていたのが、ウィンドウのタイトルバーの位置に示されている。

最初の (Int, Int) がウィンドウのサイズ、次の (Int, Int) がウィンドウの位置である。

そして、display の第2パラメータが white になっていたが、これは背景色。

display の第3パラメータに指定されたもの(Picture)を表示する。
ここでは、Circle 80 である。

ということで、sample.hs を少しだけ書き換えてみた。

import Graphics.Gloss
display = circle 80

main = display (InWindow "Nice Window" (500, 500) (10, 10)) white display

WebからGlossを使うときには、このようになっているソースの最後のmainの行を除いた部分をWebで入力するのだろう。

このままでは、図形が1つだけしか描けない。
複数の図形を描くには、次の様にするとよい。

picture = pictures [
      circle 80,
    rectangleWire 200 100 ]

カンマ(,)で区切って、[]の中に並べると、それらを描いてくれるようだ。

$ cat sample2.hs
import Graphics.Gloss
picture = pictures [
      circle 80,
    rectangleWire 200 100 ]

main = display (InWindow "Nice Window" (300, 200) (10, 10)) white picture
$ ghc sample2
[1 of 1] Compiling Main             ( sample2.hs, sample2.o )
Linking sample2 ...
$ sample2

sample-circlebox.png
年内に何とかGlossで絵が描けるところまでできたので、安心して年が越せる。

最初の授業がまだ終わらないのだが、長くなったので、残りは次回にしよう。