draw_a_cuboid.sf 930 B

12345678910111213141516171819202122232425262728293031323334
  1. #!/usr/bin/ruby
  2. const dirs = Hash("-" => [1,0], "|" => [0,1], "/" => [1,1])
  3.  
  4. func cuboid(nx, ny, nz) {
  5. say("cuboid %d %d %d:" % (nx, ny, nz))
  6. var(x, y, z) = (8*nx, 2*ny, 4*nz)
  7. var area = []
  8. var line = func(n, sx, sy, c) {
  9. var(dx, dy) = dirs{c}...;
  10. for i (0..n) {
  11. var (xi, yi) = (sx + i*dx, sy + i*dy)
  12. area[yi] \\= [" "]*(x+y+1)
  13. area[yi][xi] = (area[yi][xi] == " " ? c : '+')
  14. }
  15. }
  16.  
  17. 0 .. nz-1 -> each {|i| line.call(x, 0, 4*i, "-")}
  18. 0 .. ny -> each {|i| line.call(x, 2*i, z + 2*i, "-")}
  19. 0 .. nx-1 -> each {|i| line.call(z, 8*i, 0, "|")}
  20. 0 .. ny -> each {|i| line.call(z, x + 2*i, 2*i, "|")}
  21. 0 .. nz-1 -> each {|i| line.call(y, x, 4*i, "/")}
  22. 0 .. nx -> each {|i| line.call(y, 8*i, z, "/")}
  23.  
  24. area.reverse.each { |line|
  25. say line.join('')
  26. }
  27. }
  28.  
  29. cuboid(2, 3, 4)
  30. cuboid(1, 1, 1)
  31. cuboid(6, 2, 1)
  32. cuboid(2, 4, 1)