Я хочу реализовать простой SceneGraph в Haskell, используя Data.Tree
, состоящий из Transform
и Shape
узлов. В 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) Как избежать обходного ввода-вывода?
3) Существует ли более короткая версия для определения этого дерева? Все, кроме первого определения узла и всех пустых подфорестов, на самом деле излишни.
Спасибо!