2010-05-31 4 views
1

Я использую драгоценный камень ruby-graphviz, и я пытаюсь рисовать двоичные деревья. Я хотел бы использовать record shape, так что каждый узел может иметь левое, среднее и правое поле и, таким образом, если есть два ребра, выходящие из узла, можно выделить левый и правый края.Ruby GraphViz Запись двоичного дерева

Я попытался указать поле, объединив имя поля следующим образом: @node1.name + ":left" Но это не сработало. Каков правильный способ задания поля?

require 'rubygems' 
require 'graphviz' 

@graph = GraphViz.new(:G, :type => :digraph) 

@node1 = @graph.add_node("1", 
    "shape" => "record", 
    "label" => "<left>|<f1> 1|<right>") 

@node2 = @graph.add_node("2", 
    "shape" => "record", 
    "label" => "<left>|<f1> 2|<right>") 

@graph.add_edge(@node1.name + ":left", @node2) 

# generate a random filename 
filename = "/tmp/#{(0...8).map{65.+(rand(25)).chr}.join}.png" 
@graph.output(:png => filename) 
exec "open #{filename}" 

ответ

1

Вот как я в конечном итоге делает это:

@graph.add_edge(@node1, @node2, :tailport => "left") 
1

в документации GraphViz, вы можете увидеть, что идентификатор узла не должен начинаться с цифры. Так что если вы измените свой код и заменить два имени узлов (1 и 2) любой другой ID, начиная от буквы или подчеркивания, это работает:

require 'rubygems' 
require 'graphviz' 

@graph = GraphViz.new(:G, :type => :digraph) 

@node1 = @graph.add_node("A1", 
    "shape" => "record", 
    "label" => "<left>|<f1> 1|<right>") 

@node2 = @graph.add_node("A2", 
    "shape" => "record", 
    "label" => "<left>|<f1> 2|<right>") 

@graph.add_edge(@node1.name + ":left", @node2) 

# generate a random filename 
filename = "/tmp/#{(0...8).map{65.+(rand(25)).chr}.join}.png" 
@graph.output(:png => filename) 
exec "open #{filename}" 

Может быть, мне нужно заменить GraphViz :: Node имя # по GraphViz :: Node # идентификатор

Грег

+2

Oups! Я ошибаюсь ... Идентификатор может начинаться с цифры, если идентификатор является ТОЛЬКО числом (сопоставление [-]? (. [0-9] + | [0-9] + (. [0-9] *)?)) Я только что сделал исправление в lib! Это ошибка! – greg

 Смежные вопросы

  • Нет связанных вопросов^_^