任意の大きさのPNGを円で埋める

rubyでSVGファイルを生成するの続き
本当は六角形を出力したいんですが、ひとまず円で使い方を覚えるなど。

使用例

幅、高さ、ファイル名

F:\dev\ruby>ruby write_svg.rb 800 600 100 maru.png
[-30, -100]
[56, -150]
[142, -100]
[228, -150]
[314, -100]
[400, -150]
[486, -100]
[572, -150]
[658, -100]
[744, -150]
[830, -100]
[916, -150]

中身

require 'cairo'

format = Cairo::FORMAT_ARGB32
width = ARGV[0].to_i	#横幅
height = ARGV[1].to_i	#上下

diameter = ARGV[2].to_i
radius = diameter / 2		#半径

#sufaceとcの生成
surface = Cairo::ImageSurface.new(format, width, height)
#surface = Cairo::SVGSurface.new("hex.svg", width, height)
#SVG開くよりPNGを開く方が早いので…。今は許せSVG
c = Cairo::Context.new(surface)

c.set_source_rgb(1, 1, 1)
c.rectangle(0, 0, width, height)
c.fill

#使用色指定。黒
c.set_source_rgb(0, 0, 0)

#中央まで移動
x = width / 2
y = height / 2

while 0 - radius < y
	y -= diameter
#	p [x,y]
end
y_min = y

while 0 - radius < x
	x -= (diameter*0.86).to_i
#	p [x, y]
end

col_count = 0
while x < width + radius
	while y < width + radius
		c.circle(x, y, radius)
		c.close_path
		c.stroke
		y += diameter
#		p [x, y]
	end
	y = y_min
	y -= radius if col_count.odd?	#2列に1列ずらす
	x += (diameter*0.86).to_i
	p [x, y]
	
	col_count += 1	#列番号管理用
end
surface.write_to_png(ARGV[3])

結果