|
|
|
@@ -0,0 +1,61 @@ |
|
|
|
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") |