Guest User

Untitled

a guest
Jun 25th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.40 KB | None | 0 0
  1. class Table
  2.    def initialize(x,y=1,z=1)
  3.       @xsize,@ysize,@zsize=x,y,z
  4.       @data=Array.new(x*y*z, 0)
  5.    end
  6.    def [](x,y=0,z=0)
  7.       @data[x+y*@xsize+z*@xsize*@ysize]
  8.    end
  9.    def []=(*args)
  10.       x=args[0]
  11.       y=args.size>2 ?args[1]:0
  12.       z=args.size>3 ?args[2]:0
  13.       v=args.pop
  14.       @data[x+y*@xsize+z*@xsize*@ysize]=v
  15.    end
  16.    def _dump(d=0)
  17.       s=[3].pack('L')
  18.       s+=[@xsize].pack('L')+[@ysize].pack('L')+[@zsize].pack('L')
  19.       s+=[@xsize*@ysize*@zsize].pack('L')
  20.       for z in 0...@zsize
  21.          for y in 0...@ysize
  22.             for x in 0...@xsize
  23.                s+=[@data[x+y*@xsize+z*@xsize*@ysize],0,0].pack('L')[0,2]
  24.             end
  25.          end
  26.       end
  27.       s
  28.    end
  29.    attr_reader(:xsize,:ysize,:zsize,:data)
  30.    class << self
  31.       def _load(s)
  32.          size=s[0,4].unpack('L')[0]
  33.          nx=s[4,4].unpack('L')[0]
  34.          ny=s[8,4].unpack('L')[0]
  35.          nz=s[12,4].unpack('L')[0]
  36.          data=[]
  37.          pointer=20
  38.          loop do
  39.             data.push((s[pointer,2]+"\000\000").unpack('L')[0])
  40.             pointer+=2
  41.             break if pointer > s.size-1
  42.          end
  43.          t=Table.new(nx,ny,nz)
  44.          n=0
  45.          for z in 0...nz
  46.             for y in 0...ny
  47.                for x in 0...nx
  48.                   t[x,y,z]=data[n]
  49.                   n+=1
  50.                end
  51.             end
  52.          end
  53.          t
  54.       end
  55.    end
  56. end
Add Comment
Please, Sign In to add comment