require 'igraph' require 'cairo' g = IGraph.barabasi_game(100,3,false,false) vertices = g.to_a layout = g.send(ARGV.shift.to_sym,*ARGV.map{|a| eval(a)}).to_a format = Cairo::FORMAT_ARGB32 width = 1000 height = 1000 surface = Cairo::ImageSurface.new(format, width, height) cr = Cairo::Context.new(surface) # fill background with white cr.set_source_rgba(1.0, 1.0, 1.0, 0.8) cr.paint max_x = layout.map{|a| a[0]}.max min_x = layout.map{|a| a[0]}.min max_y = layout.map{|a| a[1]}.max min_y = layout.map{|a| a[1]}.min x_var = max_x - min_x y_var = max_y - min_y max_var = [x_var,y_var].max layout.each_with_index do |a,i| x,y = *a x = (x - min_x)/max_var y = (y - min_y)/max_var x *= (width) y *= (height) layout[i] = [x,y] puts "#{x} #{y}" end layout.each_with_index do |a,i| v = vertices[i] x,y = *a cr.set_source_rgba(rand,rand,rand,0.5) cr.circle(x,y,1).fill g.adjacent_vertices(v,IGraph::OUT).each do |w| cr.move_to(x,y) wx,wy = *layout[vertices.index(w)] cr.line_to(wx,wy) cr.stroke end end cr.target.write_to_png("test.png")