fork download
  1. #coding: utf-8
  2. require 'dxruby'
  3.  
  4. ITER_COUNT = 16
  5. BASE_X = 100
  6. BASE_Y = 100
  7. SIZE = 100
  8. MARGIN = 100
  9.  
  10. WINDOW_WIDTH = 1600
  11. WINDOW_HEIGHT = 900
  12.  
  13. Window.x = 0
  14. Window.y = 0
  15. Window.width = WINDOW_WIDTH
  16. Window.height = WINDOW_HEIGHT
  17.  
  18. module Color
  19. def hsb2rgb(h, s=1.0, b=1.0)
  20. hi = ((h.to_f/60).floor)%6
  21. f = h.to_f/60 - hi
  22. p = b*(1-s)
  23. q = b*(1-f*s)
  24. t = b*(1-(1-f)*s)
  25. case hi
  26. when 0
  27. return [255*b, 255*t, 255*p].map(&:round)
  28. when 1
  29. return [255*q, 255*b, 255*p].map(&:round)
  30. when 2
  31. return [255*p, 255*b, 255*t].map(&:round)
  32. when 3
  33. return [255*p, 255*q, 255*b].map(&:round)
  34. when 4
  35. return [255*t, 255*p, 255*b].map(&:round)
  36. when 5
  37. return [255*b, 255*p, 255*q].map(&:round)
  38. end
  39. end
  40.  
  41. def ave_hsb(hsb1=[0, 1, 1], hsb2=[0, 1, 1])
  42. return [((hsb1[0]+hsb2[0]).to_f/2).round, (hsb1[1]+hsb2[1]).to_f/2, (hsb1[2]+hsb2[2]).to_f/2]
  43. end
  44. end
  45. include Color
  46.  
  47. class Image
  48. def dragon(x1, y1, x2, y2, count, start_hue=[0, 1, 1], end_hue=[0, 1, 1])
  49. if count==0
  50. line(x1, y1, x2, y2, hsb2rgb(*start_hue))
  51. else
  52. dragon(x1, y1, (x2+x1+y2-y1)/2, (x1-x2+y2+y1)/2, count-1, start_hue, ave_hsb(start_hue,end_hue))
  53. dragon(x2, y2, (x2+x1+y2-y1)/2, (x1-x2+y2+y1)/2, count-1, end_hue, ave_hsb(start_hue,end_hue))
  54. end
  55. end
  56. end
  57.  
  58. dragons = []
  59.  
  60. 4.times do |i|
  61. 10.times do |j|
  62. 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])
  63. 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])
  64. 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])
  65. 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])
  66. end
  67. end
  68.  
  69. Window.loop do
  70. dragons.each do |dragon|
  71. Window.draw(0, 0, dragon)
  72. end
  73. end
  74.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty