SceneGraph traversal in Haskell -


i want implement simple scenegraph in haskell using data.tree consisting of transform , shape nodes. in scenegraph spatial transformation accumulated while traversing , applied shape rendering.

type transform = vector2 double data shape     = circle double | square double data scenenode = xformnode transform | shapenode shape 

say have scene object moved right , consisting of square @ bottom , circle on top

^ | |  () |  [] 0-----> 

i came tree definition:

let tree = node (xformnode (vector2 10 0))                 [node (shapenode (square 10)) []                 ,node (xformnode (vector2 0 10))                       [node (shapenode (circle 10)) []]                 ] 

the rendering this:

render :: position2 -> shape -> io () render p (circle r) = drawcircle p r render p (square a) = drawsquare p 

my questions are:

1) how define traverse function, accumulates transformation , calls render tasks?

2) how avoid making traverse io?

3) there shorter version define tree? first node definition , empty subforests superfluous.

thank you!

paradoxically, data.tree not used in haskell because defining custom tree type easy. in case, implement scene graph (tree) follows:

type transform = vector2 double data shape     = circle double | square double data scene     = transform transform [scene] | shape shape 

your example becomes

example :: scene example = transform (vector2 10 0)                     [ shape (square 10)                     , transform (vector2 0 10) [shape (circle 10)]                     ] 

this answers point 3.

to traverse tree, use recursion:

render :: position2 -> scene -> io () render p (transform v scenes) = mapm_ (render (p+v)) scenes render p (shape (circle r))   = drawcircle p r render p (shape (square a))   = drawsquare p 

there more generic traversals available, instance in data.traversable, more "uniform". in short, using recursion on trees fine.

concering point 2, there nothing can once decide circles , squares should rendered in io monad.


Comments

Popular posts from this blog

c++ - How do I get a multi line tooltip in MFC -

asp.net - In javascript how to find the height and width -

c# - DataTable to EnumerableRowCollection -