From: Lars Christensen Date: 2008-06-17T19:44:00+09:00 Subject: Re: Circle Drawing (#166) Don't reinvent the wheel (no pun intended :-) require 'cairo' radius = ARGV[0].to_f aspect = (ARGV[1]||1.0).to_f linewidth = (ARGV[2]||1.0).to_f width = (aspect * radius * 2 + 1 + linewidth + 0.5).to_i height = (radius * 2 + 1 + linewidth + 0.5).to_i Cairo::ImageSurface.new(width, height) do |surface| cr = Cairo::Context.new(surface) cr.set_antialias(Cairo::ANTIALIAS_NONE) cr.set_source_rgb(0,0,0) cr.paint cr.save cr.scale(aspect, 1.0) cr.arc(width / 2.0 / aspect + 0.5, height / 2.0 + 0.5, radius, 0, 2 * Math::PI) cr.restore cr.set_source_rgb(1,1,1) cr.set_line_width(linewidth) cr.stroke height.times { |row| puts cr.target.data[row * width * 4, width * 4].unpack("N*").map { |x| (x >> 8) > 0 ? '#' : ' ' }.join } end