fibonacci_word_fractal.sf 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/ruby
  2. # A modified Fibonacci word fractal, using Braille graphics.
  3. var(m=14, scale=2) = ARGV.map{.to_i}...
  4. (var world = Hash.new){0}{0} = 1
  5. var loc = 0
  6. var w = 1
  7. var dir = Quadratic(0, 1, w)
  8. var fib = ['1', '0']
  9. func fib_word(n) {
  10. fib[n] := (fib_word(n-1) + fib_word(n-2))
  11. }
  12. func step {
  13. scale.times {
  14. loc += dir
  15. world{loc.im}{loc.re} = 1
  16. }
  17. }
  18. var turns = [
  19. Quadratic(0, 1, w),
  20. -Quadratic(0, 1, w),
  21. Quadratic(1, 0, w),
  22. ].shuffle
  23. var n = 1
  24. fib_word(m).each { |c|
  25. if (c == '0') {
  26. step()
  27. dir *= turns[n % 3]
  28. } else { ++n }
  29. }
  30. func braille_graphics(a) {
  31. var (xlo, xhi, ylo, yhi) = +([Inf, -Inf]*2)...
  32. a.each_key { |y|
  33. ylo.min!(y.to_n)
  34. yhi.max!(y.to_n)
  35. a{y}.each_key { |x|
  36. xlo.min!(x.to_n)
  37. xhi.max!(x.to_n)
  38. }
  39. }
  40. for y in (ylo .. (yhi, 4)) {
  41. for x in (xlo .. (xhi, 2)) {
  42. var cell = 0x2800
  43. a{y+0}{x+0} && (cell += 1)
  44. a{y+1}{x+0} && (cell += 2)
  45. a{y+2}{x+0} && (cell += 4)
  46. a{y+0}{x+1} && (cell += 8)
  47. a{y+1}{x+1} && (cell += 16)
  48. a{y+2}{x+1} && (cell += 32)
  49. a{y+3}{x+0} && (cell += 64)
  50. a{y+3}{x+1} && (cell += 128)
  51. print cell.chr
  52. }
  53. print "\n"
  54. }
  55. }
  56. braille_graphics(world)