我想在 Haskell 中使用Data.Tree
包含Transform
和Shape
节点实现一个简单的 SceneGraph。在 SceneGraph 中,空间变换在遍历时累积并应用于形状以进行渲染。
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) 是否有更短的版本来定义这棵树?除了第一个 Node 定义和所有空的 subForests 之外的所有内容实际上都是多余的。
谢谢!