Turtle Graphics on Gloss Ver.1.0.0.0
Gloss を使った Turtle Graphics です。
実際のコードは こちらの github にあります。
Gloss については こちら の記事が参考になる と思います。
含まれるファイル
app / Main.hs -- 実験用
sample
├ circleDance.hs -- 複数の円を同時に描く
├ dragonCurve.hs -- dragon 曲線を描く
├ kochCurve.hs -- Koch 曲線を描く
├ graph.hs -- 関数のグラフを描く
└ star.hs -- 星を描く
sample / L-system
├ dragonCurveL.hs -- L-system で dragon 曲線を描く
└ kochCurveL.hs -- L-system で Koch 曲線を描く
src / Graphics
├ Turtle.hs -- Turtle Graphics 本体
└ L_system.hs -- L-System
Sample の実行法
-
stack buildを実行することで sample ディレクトリ以下にあるファイルがコン パイルされ、CircleDance, DragonCurve, KochCurve, Graph, Star, DragonCurveL, KochCurveLといったファイルが作られます。 -
stack exec CircleDanceやstack exec DragonCurveLを実行すると図形が 描画されます。
Turtle Graphics の使い方
使用例を示します。
import Graphics.Gloss
import Graphics.Turtle
main :: IO ()
main = runTurtle window white 20 [(st, cmdLst)]
where
window = initWindow
st = initST
cmdLst = [forward 200, left 120, forward 200, left 120, forward 200]
runTurtle の型は次のようになってます。
runTurtle :: WinConfig -- ^ 画面の状態
-> Color -- ^ 背景色
-> Int -- ^ 1 秒あたりのステップ数
-> [(TurtleST, [Command])] -- ^ [ ( 亀の初期値, [ コマンド ] ) ]
-> IO ()
Color は gloss の simulate 関数に渡すものです。詳しくは こちら を参照し てください。
WinConfig は画面の設定を保持しています。
data WinConfig = WinConfig { title :: String -- ^ Window のタイトル
, winSize :: (Int, Int) -- ^ Window のサイズ
, winPos :: (Int, Int) -- ^ Window の位置
, zoom :: Float -- ^ 画像の拡大率
, shiftXY :: (Float, Float) -- ^ 画像の移動量
} deriving Show
initWindow で既定値に設定することが可能です。
initWindow :: WinConfig
initWindow = WinConfig { title = "Turtle Graphics"
, winSize = (800, 600)
, winPos = (10, 10)
, zoom = 1
, shiftXY = (0, 0)
}
TurtleST は亀の状態を保持します。
data TurtleST = TurtleST { angle :: Float -- ^ 亀の向き
, point :: Point -- ^ 亀の位置
, penColor :: Color -- ^ ペンの色
, pen :: Bool -- ^ up or down
, mark :: Bool -- ^ 亀のマーク
, stack :: [(Float, Point, Color, Bool, Bool)]
} deriving Show
TurtleST は initST で既定値を設定できます。
initST = TurtleST { angle = 0
, point = (0, 0)
, penColor = black
, pen = True
, mark = True
}
Command は亀に実行させる命令です。
Turtle Graphics のコマンド
各コマンドの型は次のようになっています。
type PrimitiveCommand = TurtleST -> (Picture, TurtleST)
type Command = [PrimitiveCommand]
PrimitiveCommand は TurtleST を受け取り、図形 (Picture) とコマンド実行後の TurtleST を返します。
Command は PrimitiveCommand のリストになっており、通常はこちらを使用します。
| コマンド | 省略形 | 動作 |
|---|---|---|
| forward n | fd n | 亀が n だけ前進する。 |
| quickForward n | qf n | forward より高速に前進する。 |
| backward n | bk n | 亀が n だけ後退する。 |
| left th | lt th | 亀が th 度だけ左旋回する。 |
| quickLeft th | ql th | left より高速に左旋回する。 |
| right th | rt th | 亀が th 度だけ右旋回する。 |
| quickRight th | qr th | right より高速に右旋回する。 |
| goto p | -- | 亀が p の位置へ移動する。亀は進行方向を向く。 |
| penDown | pd | 亀のペンを下げる。亀が移動すると線が描かれる。 |
| penUp | pu | 亀のペンを上げる。亀が移動しても線は描かれない。 |
| push | -- | 亀の状態を Push する。 |
| pop | -- | 亀の状態を Pop する。 |
| nop | -- | 何もしない。 |
| nopN n | -- | n 回 nop を繰り返す。 |
| setAngle th | -- | 亀の向きを th 度に設定する。 |
| setPoint p | -- | 亀の位置を p に設定する。 |
| setColor c | -- | 亀のペンの色を c に設定する。 |
| drawPolygonL n m | -- | 一辺の長さが m の正 n 角形を左回りに描く。 |
| drawPolygonR n m | -- | 一辺の長さが m の正 n 角形を右回りに描く。 |
| drawCircle r | -- | 亀の位置を中心に、半径 r の円を描く。 |
| drawCircleSolid r | -- | 亀の位置を中心に、半径 r の Solid な円を描く。 |
| drawArcL th r | -- | 中心角 th , 半径 r の円弧を左回りに描く。 |
| drawArcR th r | -- | 中心角 th , 半径 r の円弧を右回りに描く。 |
| drawGraph fx domain | -- | 陽関数のグラフを描く。 |
| drawGraph' fx fy domain | -- | 陰関数のグラフを描く。 |
| grid | -- | grid' 500 10 |
| grid' range size | -- | -size ~ size の範囲に目盛サイズ size の方眼を表示する。 |
| updateAngle func | -- | 亀の向きを関数に従って更新する。 |
| updatePoint func | -- | 亀の位置を関数に従って更新する。 |
| updateColor fr fg fb fa | -- | ペンの色の成分を関数に従って更新する。 |
※ Ver.1.0.0.0 をリリースするにあたり、以前投稿したものと一部異なる仕様になったため、本文を書き替えました。