def initialize(cube)
@cube = cube
@imax = @cube.if[0].imax
@jmax = @cube.if[0].jmax
@kmax = @cube.if[1].jmax
@diffx0, @diffy0, @diffz0 = Array.new, Array.new, Array.new
@diffx5, @diffy5, @diffz5 = Array.new, Array.new, Array.new
(0..@imax).each do |idir|
@diffx0[idir], @diffy0[idir], @diffz0[idir] = Array.new, Array.new, Array.new
@diffx5[idir], @diffy5[idir], @diffz5[idir] = Array.new, Array.new, Array.new
(0..@jmax - 1).each do |jdir|
face0point0 = @cube.if[0].getpointno(idir, jdir)
face0point1 = @cube.if[0].getpointno(idir, jdir + 1)
face5point0 = @cube.if[5].getpointno(idir, jdir)
face5point1 = @cube.if[5].getpointno(idir, jdir + 1)
@diffx0[idir][jdir] = @cube.if[0].parent.x[0][face0point1] - @cube.if[0].parent.x[0][face0point0]
@diffy0[idir][jdir] = @cube.if[0].parent.y[0][face0point1] - @cube.if[0].parent.y[0][face0point0]
@diffz0[idir][jdir] = @cube.if[0].parent.z[0][face0point1] - @cube.if[0].parent.z[0][face0point0]
@diffx5[idir][jdir] = @cube.if[5].parent.x[0][face5point1] - @cube.if[5].parent.x[0][face5point0]
@diffy5[idir][jdir] = @cube.if[5].parent.y[0][face5point1] - @cube.if[5].parent.y[0][face5point0]
@diffz5[idir][jdir] = @cube.if[5].parent.z[0][face5point1] - @cube.if[5].parent.z[0][face5point0]
end
end
(0..@imax).each do |idir|
@diffx0[idir] = [0.0] + @diffx0[idir]
@diffy0[idir] = [0.0] + @diffy0[idir]
@diffz0[idir] = [0.0] + @diffz0[idir]
@diffx5[idir] = [0.0] + @diffx5[idir]
@diffy5[idir] = [0.0] + @diffy5[idir]
@diffz5[idir] = [0.0] + @diffz5[idir]
end
@diffx4, @diffy4, @diffz4 = Array.new, Array.new, Array.new
@diffx2, @diffy2, @diffz2 = Array.new, Array.new, Array.new
(0..@kmax).each do |kdir|
@diffx4[kdir], @diffy4[kdir], @diffz4[kdir] = Array.new, Array.new, Array.new
@diffx2[kdir], @diffy2[kdir], @diffz2[kdir] = Array.new, Array.new, Array.new
(0..@jmax - 1).each do |jdir|
face4point0 = @cube.if[4].getpointno(jdir, kdir)
face4point1 = @cube.if[4].getpointno(jdir + 1, kdir)
face2point0 = @cube.if[2].getpointno(jdir, kdir)
face2point1 = @cube.if[2].getpointno(jdir + 1, kdir)
@diffx4[kdir][jdir] = @cube.if[4].parent.x[0][face4point1] - @cube.if[4].parent.x[0][face4point0]
@diffy4[kdir][jdir] = @cube.if[4].parent.y[0][face4point1] - @cube.if[4].parent.y[0][face4point0]
@diffz4[kdir][jdir] = @cube.if[4].parent.z[0][face4point1] - @cube.if[4].parent.z[0][face4point0]
@diffx2[kdir][jdir] = @cube.if[2].parent.x[0][face2point1] - @cube.if[2].parent.x[0][face2point0]
@diffy2[kdir][jdir] = @cube.if[2].parent.y[0][face2point1] - @cube.if[2].parent.y[0][face2point0]
@diffz2[kdir][jdir] = @cube.if[2].parent.z[0][face2point1] - @cube.if[2].parent.z[0][face2point0]
end
end
(0..@kmax).each do |kdir|
@diffx4[kdir] = [0.0] + @diffx4[kdir]
@diffy4[kdir] = [0.0] + @diffy4[kdir]
@diffz4[kdir] = [0.0] + @diffz4[kdir]
@diffx2[kdir] = [0.0] + @diffx2[kdir]
@diffy2[kdir] = [0.0] + @diffy2[kdir]
@diffz2[kdir] = [0.0] + @diffz2[kdir]
end
@diffx, @diffy, @diffz = Array.new, Array.new, Array.new
(0..@imax).each do |idir|
@diffx[idir], @diffy[idir], @diffz[idir] = Array.new, Array.new, Array.new
(0..@kmax).each do |kdir|
@diffx[idir][kdir], @diffy[idir][kdir], @diffz[idir][kdir] = Array.new, Array.new, Array.new
(0..@jmax).each do |jdir|
length0 = vectLength( [@diffx0[idir][jdir], @diffy0[idir][jdir], @diffz0[idir][jdir] ] )
length5 = vectLength( [@diffx5[idir][jdir], @diffy5[idir][jdir], @diffz5[idir][jdir] ] )
@weightedlength = length0*(@kmax - kdir)/@kmax + length5*kdir/@kmax
@x0and5 = @diffx0[idir][jdir]*(@kmax - kdir)/@kmax + @diffx5[idir][jdir]*kdir/@kmax
@y0and5 = @diffy0[idir][jdir]*(@kmax - kdir)/@kmax + @diffy5[idir][jdir]*kdir/@kmax
@z0and5 = @diffz0[idir][jdir]*(@kmax - kdir)/@kmax + @diffz5[idir][jdir]*kdir/@kmax
@xcomb = @x0and5
@ycomb = @y0and5
@zcomb = @z0and5
@diffx[idir][kdir][jdir] = @xcomb
@diffy[idir][kdir][jdir] = @ycomb
@diffz[idir][kdir][jdir] = @zcomb
end
end
end
@sumx, @sumy, @sumz = Array.new, Array.new, Array.new
(0..@imax).each do |idir|
@sumx[idir], @sumy[idir], @sumz[idir] = Array.new, Array.new, Array.new
(0..@kmax).each do |kdir|
@sumx[idir][kdir] = @diffx[idir][kdir].inject(0){|sum, item| sum + item }
@sumy[idir][kdir] = @diffy[idir][kdir].inject(0){|sum, item| sum + item }
@sumz[idir][kdir] = @diffz[idir][kdir].inject(0){|sum, item| sum + item }
end
end
@startpointx, @startpointy, @startpointz, @endpointx, @endpointy, @endpointz = Array.new, Array.new, Array.new, Array.new, Array.new, Array.new
(0..@imax).each do |idir|
@startpointx[idir], @startpointy[idir], @startpointz[idir] = Array.new, Array.new, Array.new
@endpointx[idir], @endpointy[idir], @endpointz[idir] = Array.new, Array.new, Array.new
(0..@kmax).each do |kdir|
face1point = @cube.if[1].getpointno(idir, kdir)
@startpointx[idir][kdir] = @cube.if[1].parent.x[0][face1point]
@startpointy[idir][kdir] = @cube.if[1].parent.y[0][face1point]
@startpointz[idir][kdir] = @cube.if[1].parent.z[0][face1point]
face3point = @cube.if[3].getpointno(idir, kdir)
@endpointx[idir][kdir] = @cube.if[3].parent.x[0][face3point]
@endpointy[idir][kdir] = @cube.if[3].parent.y[0][face3point]
@endpointz[idir][kdir] = @cube.if[3].parent.z[0][face3point]
end
end
@sx, @sy, @sz = Array.new, Array.new, Array.new
previousx, previousy, previousz = 1.0, 1.0, 1.0
(0..@imax).each do |idir|
@sx[idir], @sy[idir], @sz[idir] = Array.new, Array.new, Array.new
(0..@kmax).each do |kdir|
dist = @endpointx[idir][kdir] - @startpointx[idir][kdir]
if dist.abs < 1e-10 || dist == 0.0 || dist == -0.0
@sx[idir][kdir] = previousx
else
@sx[idir][kdir] = dist/@sumx[idir][kdir]
end
if @sx[idir][kdir].nan? || @sx[idir][kdir].abs > 100.0
@sx[idir][kdir] = previousx
end
previousx = @sx[idir][kdir]
dist = @endpointy[idir][kdir] - @startpointy[idir][kdir]
if dist.abs < 1e-10 || dist == 0.0 || dist == -0.0
@sy[idir][kdir] = previousy
else
@sy[idir][kdir] = dist/@sumy[idir][kdir]
end
if @sy[idir][kdir].nan? || @sy[idir][kdir].abs > 100.0
@sy[idir][kdir] = previousy
end
previousy = @sy[idir][kdir]
dist = @endpointz[idir][kdir] - @startpointz[idir][kdir]
if dist.abs < 1e-10 || dist == 0.0 || dist == -0.0
@sz[idir][kdir] = previousz
else
@sz[idir][kdir] = dist/@sumz[idir][kdir]
end
if @sz[idir][kdir].nan? || @sz[idir][kdir].abs > 100.0
@sz[idir][kdir] = previousz
end
previousz = @sz[idir][kdir]
end
end
@xpos, @ypos, @zpos = Array.new, Array.new, Array.new
(0..@imax).each do |idir|
@xpos[idir], @ypos[idir], @zpos[idir] = Array.new, Array.new, Array.new
(0..@jmax).each do |jdir|
@xpos[idir][jdir], @ypos[idir][jdir], @zpos[idir][jdir] = Array.new, Array.new, Array.new
end
end
(0..@imax).each do |idir|
(0..@kmax).each do |kdir|
sumx = @startpointx[idir][kdir]
sumy = @startpointy[idir][kdir]
sumz = @startpointz[idir][kdir]
(0..@jmax).each do |jdir|
sumx += @sx[idir][kdir] * @diffx[idir][kdir][jdir]
sumy += @sy[idir][kdir] * @diffy[idir][kdir][jdir]
sumz += @sz[idir][kdir] * @diffz[idir][kdir][jdir]
@xpos[idir][jdir][kdir] = sumx
@ypos[idir][jdir][kdir] = sumy
@zpos[idir][jdir][kdir] = sumz
end
end
end
end