Forum: Ruby How to translate a C tree structure to ruby tree objects

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
anne001 (Guest)
on 2006-02-18 14:51
(Received via mailing list)
I want to draw a figure with opengl. The key seems to start from a tree
structure.
The top of the tree is the trunk, there are several childrens, head,
upper arms upper legs, each of these have children of their own...

I found a tutorial which explains

Information is stored in nodes which include
pointer to a function that draws the object
matrix which positions, scales and orient this node relative to parent
(including children)
pointer to children of node

typedef struct treenode {
GLfloat m[16]; 	//transformation - e.g. translation
void *f(); 		//figure - e.g. Left leg
struct treenode *child;
struct treenode *parent;
} treenode;

What is the OOP ruby way of building a tree? Can it be something like
this? (per Brian Schröder)

class Node
   attr_reader :children

  def initialize
     @children = []
  end
end

what goes in @children?  the transformation and drawing would be Node
methods I think?
And how do you refer to parent (You need information on the parent to
know where to draw the node)
What do I do with my class Node (called traversing a tree? )

I saw  http://raa.ruby-lang.org/search.rhtml?search=tree
that trees are something people think about in ruby. Do any of those
reference have a bearing on my question?
(Guest)
on 2006-02-18 17:19
(Received via mailing list)
The children of a node go in @children.  They're probably other nodes.

The transformation matrix and function would likely be data members
holding, respectively, a matrix and a proc object.  An alternate
approach for the drawing function would be to make an instance method
that receives a block (where the block would contain the drawing
function).

So, potentially something like this:

class Node
  attr_accessor :children, :parent, :transform
  def initialize(parent = nil, transform = some_sort_of _matrix_object)
    @children = []
    @transform = transform
    if parent then parent.add_child(self) end
  end

  def add_child(node)
    @children.push(node)
    node.parent = self
  end

  def draw(&block)
    yield
  end
end
This topic is locked and can not be replied to.