我想使用由Transform
和Shape
节点组成的Data.Tree
在Haskell中实现简单的SceneGraph。在SceneGraph中,空间变换在遍历时进行累加并应用于渲染形状。Haskell中的场景图遍历
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)是否有更短的版本来定义这棵树?除第一个节点定义和所有空子树外,其他所有节点实际上都是多余的。
谢谢!