とノードData.Tree
で構成される単純なSceneGraphをHaskellに実装したいと思います。シーングラフでは、空間変換はトラバース中に蓄積され、レンダリングのためにシェイプに適用されます。Transform
Shape
type Transform = Vector2 Double
data Shape = Circle Double | Square Double
data SceneNode = XFormNode Transform | ShapeNode Shape
右に移動し、下部に正方形、上部に円で構成されるオブジェクトがあるシーンがあるとします。
^
|
| ()
| []
0----->
私はこのツリーの定義を思いついた:
let tree = Node (XFormNode (vector2 10 0))
[Node (ShapeNode (Square 10)) []
,Node (XFormNode (vector2 0 10))
[Node (ShapeNode (Circle 10)) []]
]
レンダリングは次のようになります。
render :: Position2 -> Shape -> IO ()
render p (Circle r) = drawCircle p r
render p (Square a) = drawSquare p a
私の質問は次のとおりです。
1)traverse
変換を累積し、レンダリングタスクを呼び出す関数をどのように定義しますか?
2)トラバースIOを作成しないようにするにはどうすればよいですか?
3)このツリーを定義するためのより短いバージョンはありますか?最初のノード定義とすべての空のsubForestを除くすべては、実際には不要です。
ありがとうございました!