pythagoras_tree.sf 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Pythagoras_tree
  4. #
  5. require('Imager')
  6. func tree(img, x1, y1, x2, y2, depth) {
  7. depth <= 0 && return()
  8. var dx = (x2 - x1)
  9. var dy = (y1 - y2)
  10. var x3 = (x2 - dy)
  11. var y3 = (y2 - dx)
  12. var x4 = (x1 - dy)
  13. var y4 = (y1 - dx)
  14. var x5 = (x4 + 0.5*(dx - dy))
  15. var y5 = (y4 - 0.5*(dx + dy))
  16. # square
  17. img.polygon(
  18. points => [
  19. [x1, y1],
  20. [x2, y2],
  21. [x3, y3],
  22. [x4, y4],
  23. ],
  24. color => [0, 255/depth, 0],
  25. )
  26. # triangle
  27. img.polygon(
  28. points => [
  29. [x3, y3],
  30. [x4, y4],
  31. [x5, y5],
  32. ],
  33. color => [0, 255/depth, 0],
  34. )
  35. tree(img, x4, y4, x5, y5, depth - 1)
  36. tree(img, x5, y5, x3, y3, depth - 1)
  37. }
  38. var (width=1920, height=1080)
  39. var img = %s<Imager>.new(xsize => width, ysize => height)
  40. img.box(filled => 1, color => 'white')
  41. tree(img, width/2.3, height, width/1.8, height, 10)
  42. img.write(file => 'pythagoras_tree.png')