gordon
3/6/2006 2:12:00 AM
Here is my solution. I decided to go with RMagick for my output, since
I figured it would be easier than ascii. Then I got the idea to write
an ascii "Magick" module to do the output in ascii. It is pretty
limited, but it has enough functionality to handle this quiz. Just
change "require 'RMagick'" to "require 'asciiMagick'".
# file: golden_fibbonacci.rb
require 'RMagick'
#require 'asciiMagick'
include Magick
def fib(n)
x,y = 1,1
n.times do
yield x
x, y = y, x + y
end
end
def points(n,multiplier=2)
x1,y1 = 0,0
fib(n) do |fib|
fib *= multiplier
x2,y2 = (fib + x1),(fib + y1)
yield x1,y1,x2, y2
if x1 == 0
x1,y1 = fib,0
else
x1,y1 = 0,fib
end
end
end
img = Draw.new
img.stroke('black')
img.fill= 'white'
points(9){|x,y,@x,@y| img.rectangle(x,y,@x,@y)}
canvas = Image.new(@x + 1,@y + 1)
img.draw(canvas)
canvas.write('golden_fibbonacci.jpg')
# file: asciiMagick.rb
module Magick
class Image
attr_accessor :args
def initialize(x,y)
@a = Array.new(y)
@a.map! do |i|
i = Array.new(x,' ')
end
@a
end
def draw_rectangle
x1,y1,x2,y2 = @args
x1.upto(x2) do |i|
@a[y1][i] = '#'
@a[y2][i] = '#'
end
y1.upto(y2) do |i|
@a[i][x1] = '#'
@a[i][x2] = '#'
end
end
def write(string)
puts @a.map!{|i| i.join('')}
end
end
class Draw
def initialize
@cache = Array.new
end
def stroke(str)
## this isn't used
end
def fill=(str)
## this isn't used
end
def draw(canvas)
@cache.each do |hash|
hash.each do|method_name,args|
canvas.args = args
canvas.method(method_name).call
end
end
end
def rectangle(x1,y1,x2,y2)
@cache << {:draw_rectangle => [x1,y1,x2,y2]}
end
end
end