sierpinski_triangle_graphical.sf 994 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #!/usr/bin/ruby
  2. # https://rosettacode.org/wiki/Sierpinski_triangle/Graphical#Sidef
  3. func sierpinski_triangle(n) -> Array {
  4. var triangle = ['*']
  5. { |i|
  6. var sp = (' ' * pow(2, i));
  7. triangle = (triangle.map {|x| sp + x + sp} +
  8. triangle.map {|x| x + ' ' + x})
  9. } * n
  10. triangle
  11. }
  12. class Array {
  13. method to_png(scale=1, bgcolor='white', fgcolor='black') {
  14. static gd = require('GD::Simple')
  15. var width = self.max_by{.len}.len
  16. self.map!{|r| "%-#{width}s" % r}
  17. var img = gd.new(width * scale, self.len * scale)
  18. for i in ^self {
  19. for j in RangeNum(i*scale, i*scale + scale) {
  20. img.moveTo(0, j)
  21. for line in (self[i].scan(/(\s+|\S+)/)) {
  22. img.fgcolor(line.contains(/\S/) ? fgcolor : bgcolor)
  23. img.line(scale * line.len)
  24. }
  25. }
  26. }
  27. img.png
  28. }
  29. }
  30. var triangle = sierpinski_triangle(7)
  31. var raw_png = triangle.to_png(scale: 5, bgcolor:'black', fgcolor:'red')
  32. File('triangle.png').write(raw_png, :raw)