Ruby GraphViz Binary Tree Record - PullRequest
1 голос
/ 31 мая 2010

Я использую гем 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}"

Ответы [ 3 ]

1 голос
/ 31 мая 2010

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

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 # id

Грег

1 голос
/ 31 января 2015

Ваш способ указания узла и поля был неверным. Скорее вы должны сделать:

@graph.add_edge({@node1.name=>"left"}, @node2)

См. Пример с исходным кодом по адресу: https://github.com/glejeune/Ruby-Graphviz/blob/master/examples/sample07.rb

1 голос
/ 31 мая 2010

Вот как я это сделал:

@graph.add_edge(@node1, @node2, :tailport => "left")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...