#coding: utf-8
require 'dxruby'
ITER_COUNT = 16
BASE_X = 100
BASE_Y = 100
SIZE = 100
MARGIN = 100
WINDOW_WIDTH = 1600
WINDOW_HEIGHT = 900
Window.x = 0
Window.y = 0
Window.width = WINDOW_WIDTH
Window.height = WINDOW_HEIGHT
module Color
def hsb2rgb(h, s=1.0, b=1.0)
hi = ((h.to_f/60).floor)%6
f = h.to_f/60 - hi
p = b*(1-s)
q = b*(1-f*s)
t = b*(1-(1-f)*s)
case hi
when 0
return [255*b, 255*t, 255*p].map(&:round)
when 1
return [255*q, 255*b, 255*p].map(&:round)
when 2
return [255*p, 255*b, 255*t].map(&:round)
when 3
return [255*p, 255*q, 255*b].map(&:round)
when 4
return [255*t, 255*p, 255*b].map(&:round)
when 5
return [255*b, 255*p, 255*q].map(&:round)
end
end
def ave_hsb(hsb1=[0, 1, 1], hsb2=[0, 1, 1])
return [((hsb1[0]+hsb2[0]).to_f/2).round, (hsb1[1]+hsb2[1]).to_f/2, (hsb1[2]+hsb2[2]).to_f/2]
end
end
include Color
class Image
def dragon(x1, y1, x2, y2, count, start_hue=[0, 1, 1], end_hue=[0, 1, 1])
if count==0
line(x1, y1, x2, y2, hsb2rgb(*start_hue))
else
dragon(x1, y1, (x2+x1+y2-y1)/2, (x1-x2+y2+y1)/2, count-1, start_hue, ave_hsb(start_hue,end_hue))
dragon(x2, y2, (x2+x1+y2-y1)/2, (x1-x2+y2+y1)/2, count-1, end_hue, ave_hsb(start_hue,end_hue))
end
end
end
dragons = []
4.times do |i|
10.times do |j|
dragons << Image.new(WINDOW_WIDTH, WINDOW_HEIGHT).dragon(BASE_X+SIZE*j, BASE_Y+(MARGIN+SIZE)*i, BASE_X+SIZE*j+SIZE, BASE_Y+(MARGIN+SIZE)*i, ITER_COUNT, [90*(i%4), 1-0.1*j, 1], [90*((i+1)%4)-1, 1-0.1*j, 1])
dragons << Image.new(WINDOW_WIDTH, WINDOW_HEIGHT).dragon(BASE_X+SIZE*j+SIZE, BASE_Y+(MARGIN+SIZE)*i, BASE_X+SIZE*j+SIZE, BASE_Y+(MARGIN+SIZE)*i+SIZE, ITER_COUNT, [90*((i+1)%4), 1-0.1*j, 1], [90*((i+2)%4)-1, 1-0.1*j, 1])
dragons << Image.new(WINDOW_WIDTH, WINDOW_HEIGHT).dragon(BASE_X+SIZE*j+SIZE, BASE_Y+(MARGIN+SIZE)*i+SIZE, BASE_X+SIZE*j, BASE_Y+(MARGIN+SIZE)*i+SIZE, ITER_COUNT, [90*((i+2)%4), 1-0.1*j, 1], [90*((i+3)%4)-1, 1-0.1*j, 1])
dragons << Image.new(WINDOW_WIDTH, WINDOW_HEIGHT).dragon(BASE_X+SIZE*j, BASE_Y+(MARGIN+SIZE)*i+SIZE, BASE_X+SIZE*j, BASE_Y+(MARGIN+SIZE)*i, ITER_COUNT, [90*((i+3)%4), 1-0.1*j, 1], [90*(i%4)-1, 1-0.1*j, 1])
end
end
Window.loop do
dragons.each do |dragon|
Window.draw(0, 0, dragon)
end
end
I2NvZGluZzogdXRmLTgKcmVxdWlyZSAnZHhydWJ5JwoKSVRFUl9DT1VOVCA9IDE2CkJBU0VfWCA9IDEwMApCQVNFX1kgPSAxMDAKU0laRSA9IDEwMApNQVJHSU4gPSAxMDAKCldJTkRPV19XSURUSCA9IDE2MDAKV0lORE9XX0hFSUdIVCA9IDkwMAoKV2luZG93LnggPSAwCldpbmRvdy55ID0gMApXaW5kb3cud2lkdGggPSBXSU5ET1dfV0lEVEgKV2luZG93LmhlaWdodCA9IFdJTkRPV19IRUlHSFQKCm1vZHVsZSBDb2xvcgogIGRlZiBoc2IycmdiKGgsIHM9MS4wLCBiPTEuMCkKICAgIGhpID0gKChoLnRvX2YvNjApLmZsb29yKSU2CglmID0gaC50b19mLzYwIC0gaGkKCXAgPSBiKigxLXMpCglxID0gYiooMS1mKnMpCgl0ID0gYiooMS0oMS1mKSpzKQoJY2FzZSBoaQoJICB3aGVuIDAKCSAgICByZXR1cm4gWzI1NSpiLCAyNTUqdCwgMjU1KnBdLm1hcCgmOnJvdW5kKQoJICB3aGVuIDEKCSAgICByZXR1cm4gWzI1NSpxLCAyNTUqYiwgMjU1KnBdLm1hcCgmOnJvdW5kKQoJICB3aGVuIDIKCSAgICByZXR1cm4gWzI1NSpwLCAyNTUqYiwgMjU1KnRdLm1hcCgmOnJvdW5kKQoJICB3aGVuIDMKCSAgICByZXR1cm4gWzI1NSpwLCAyNTUqcSwgMjU1KmJdLm1hcCgmOnJvdW5kKQoJICB3aGVuIDQKCSAgICByZXR1cm4gWzI1NSp0LCAyNTUqcCwgMjU1KmJdLm1hcCgmOnJvdW5kKQoJICB3aGVuIDUKCSAgICByZXR1cm4gWzI1NSpiLCAyNTUqcCwgMjU1KnFdLm1hcCgmOnJvdW5kKQoJZW5kCiAgZW5kCiAgCiAgZGVmIGF2ZV9oc2IoaHNiMT1bMCwgMSwgMV0sIGhzYjI9WzAsIDEsIDFdKQogICAgcmV0dXJuIFsoKGhzYjFbMF0raHNiMlswXSkudG9fZi8yKS5yb3VuZCwgKGhzYjFbMV0raHNiMlsxXSkudG9fZi8yLCAoaHNiMVsyXStoc2IyWzJdKS50b19mLzJdCiAgZW5kCmVuZAppbmNsdWRlIENvbG9yCgpjbGFzcyBJbWFnZQogIGRlZiBkcmFnb24oeDEsIHkxLCB4MiwgeTIsIGNvdW50LCBzdGFydF9odWU9WzAsIDEsIDFdLCBlbmRfaHVlPVswLCAxLCAxXSkKICAgIGlmIGNvdW50PT0wCgkgIGxpbmUoeDEsIHkxLCB4MiwgeTIsIGhzYjJyZ2IoKnN0YXJ0X2h1ZSkpCgllbHNlCgkgIGRyYWdvbih4MSwgeTEsICh4Mit4MSt5Mi15MSkvMiwgKHgxLXgyK3kyK3kxKS8yLCBjb3VudC0xLCBzdGFydF9odWUsIGF2ZV9oc2Ioc3RhcnRfaHVlLGVuZF9odWUpKQoJICBkcmFnb24oeDIsIHkyLCAoeDIreDEreTIteTEpLzIsICh4MS14Mit5Mit5MSkvMiwgY291bnQtMSwgZW5kX2h1ZSwgYXZlX2hzYihzdGFydF9odWUsZW5kX2h1ZSkpCgllbmQKICBlbmQKZW5kCgpkcmFnb25zID0gW10KCjQudGltZXMgZG8gfGl8CiAgMTAudGltZXMgZG8gfGp8CiAgICBkcmFnb25zIDw8IEltYWdlLm5ldyhXSU5ET1dfV0lEVEgsIFdJTkRPV19IRUlHSFQpLmRyYWdvbihCQVNFX1grU0laRSpqLCBCQVNFX1krKE1BUkdJTitTSVpFKSppLCBCQVNFX1grU0laRSpqK1NJWkUsIEJBU0VfWSsoTUFSR0lOK1NJWkUpKmksIElURVJfQ09VTlQsIFs5MCooaSU0KSwgMS0wLjEqaiwgMV0sIFs5MCooKGkrMSklNCktMSwgMS0wLjEqaiwgMV0pCiAgICBkcmFnb25zIDw8IEltYWdlLm5ldyhXSU5ET1dfV0lEVEgsIFdJTkRPV19IRUlHSFQpLmRyYWdvbihCQVNFX1grU0laRSpqK1NJWkUsIEJBU0VfWSsoTUFSR0lOK1NJWkUpKmksIEJBU0VfWCtTSVpFKmorU0laRSwgQkFTRV9ZKyhNQVJHSU4rU0laRSkqaStTSVpFLCBJVEVSX0NPVU5ULCBbOTAqKChpKzEpJTQpLCAxLTAuMSpqLCAxXSwgWzkwKigoaSsyKSU0KS0xLCAxLTAuMSpqLCAxXSkKICAgIGRyYWdvbnMgPDwgSW1hZ2UubmV3KFdJTkRPV19XSURUSCwgV0lORE9XX0hFSUdIVCkuZHJhZ29uKEJBU0VfWCtTSVpFKmorU0laRSwgQkFTRV9ZKyhNQVJHSU4rU0laRSkqaStTSVpFLCBCQVNFX1grU0laRSpqLCBCQVNFX1krKE1BUkdJTitTSVpFKSppK1NJWkUsIElURVJfQ09VTlQsIFs5MCooKGkrMiklNCksIDEtMC4xKmosIDFdLCBbOTAqKChpKzMpJTQpLTEsIDEtMC4xKmosIDFdKQogICAgZHJhZ29ucyA8PCBJbWFnZS5uZXcoV0lORE9XX1dJRFRILCBXSU5ET1dfSEVJR0hUKS5kcmFnb24oQkFTRV9YK1NJWkUqaiwgQkFTRV9ZKyhNQVJHSU4rU0laRSkqaStTSVpFLCBCQVNFX1grU0laRSpqLCBCQVNFX1krKE1BUkdJTitTSVpFKSppLCBJVEVSX0NPVU5ULCBbOTAqKChpKzMpJTQpLCAxLTAuMSpqLCAxXSwgWzkwKihpJTQpLTEsIDEtMC4xKmosIDFdKQogIGVuZAplbmQKCldpbmRvdy5sb29wIGRvCiAgZHJhZ29ucy5lYWNoIGRvIHxkcmFnb258CiAgICBXaW5kb3cuZHJhdygwLCAwLCBkcmFnb24pCiAgZW5kCmVuZAo=