12345678910111213141516171819202122232425262728293031323334353637383940 |
- #!/usr/bin/ruby
- # https://rosettacode.org/wiki/Sierpinski_triangle/Graphical#Sidef
- func sierpinski_triangle(n) -> Array {
- var triangle = ['*']
- { |i|
- var sp = (' ' * pow(2, i));
- triangle = (triangle.map {|x| sp + x + sp} +
- triangle.map {|x| x + ' ' + x})
- } * n
- triangle
- }
- class Array {
- method to_png(scale=1, bgcolor='white', fgcolor='black') {
- static gd = require('GD::Simple')
- var width = self.max_by{.len}.len
- self.map!{|r| "%-#{width}s" % r}
- var img = gd.new(width * scale, self.len * scale)
- for i in ^self {
- for j in RangeNum(i*scale, i*scale + scale) {
- img.moveTo(0, j)
- for line in (self[i].scan(/(\s+|\S+)/)) {
- img.fgcolor(line.contains(/\S/) ? fgcolor : bgcolor)
- img.line(scale * line.len)
- }
- }
- }
- img.png
- }
- }
- var triangle = sierpinski_triangle(7)
- var raw_png = triangle.to_png(scale: 5, bgcolor:'black', fgcolor:'red')
- File('triangle.png').write(raw_png, :raw)
|