barnsley_fern.sf 713 B

1234567891011121314151617181920212223242526272829
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Barnsley_fern
  4. #
  5. require('Imager')
  6. var w = 640
  7. var h = 640
  8. var img = %O<Imager>.new(xsize => w, ysize => h, channels => 3)
  9. var green = %O<Imager::Color>.new('#00FF00')
  10. var (x, y) = (float(0), float(0))
  11. for r in (^1e4 -> lazy.map { 100.irand }) {
  12. (x, y) = (
  13. if (r <= 1) { ( 0.00*x - 0.00*y, 0.00*x + 0.16*y + 0.00) }
  14. elsif (r <= 8) { ( 0.20*x - 0.26*y, 0.23*x + 0.22*y + 1.60) }
  15. elsif (r <= 15) { (-0.15*x + 0.28*y, 0.26*x + 0.24*y + 0.44) }
  16. else { ( 0.85*x + 0.04*y, -0.04*x + 0.85*y + 1.60) }
  17. )
  18. img.setpixel(x => w/2 + 60*x, y => 60*y, color => green)
  19. }
  20. img.flip(dir => 'v')
  21. img.write(file => 'barnsleyFern.png')