LoginSignup
2
3

More than 3 years have passed since last update.

gloss で Turtle Graphics

Last updated at Posted at 2020-01-25

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 CircleDancestack 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 ()

Colorglosssimulate 関数に渡すものです。詳しくは こちら を参照し てください。

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

TurtleSTinitST で既定値を設定できます。

initST = TurtleST { angle    = 0
                  , point    = (0, 0)
                  , penColor = black
                  , pen      = True
                  , mark     = True
                  }

Command は亀に実行させる命令です。

Turtle Graphics のコマンド

各コマンドの型は次のようになっています。

type PrimitiveCommand = TurtleST -> (Picture, TurtleST)
type Command          = [PrimitiveCommand]

PrimitiveCommandTurtleST を受け取り、図形 (Picture) とコマンド実行後の TurtleST を返します。

CommandPrimitiveCommand のリストになっており、通常はこちらを使用します。

コマンド 省略形 動作
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 をリリースするにあたり、以前投稿したものと一部異なる仕様になったため、本文を書き替えました。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3