2013-04-13 84 views
2

的片当奇数,立方3D阵列(3x3x3的,5×5×,7x7x7等)工作,这将是返回数组的2D切片的最有效方法,给出定位切片的轴和用于确定切片沿该轴的相关位置的值?Java 3D的数组:存储立方体,检索立方体

+0

你能更具体地说明“轴”和“切片”是什么意思吗?轴是否与x-y-z方向对齐?如果他们不是,在横截面不是矩形的情况下,你想要返回什么? –

+0

是的,轴将是,例如,将对应于在原始数组中心居中的x/y/z轴的int 0/1/2,则该值可以是与中心0/+ 1/-1/etc,或从侧面。在这种情况下,切片将是一个垂直于指定轴的2d阵列,并由该值偏移。 – Shukaro

回答

1

我认为你有三个选项作出选择,这取决于你想要什么你的输入及切分方法的输出是:

  • 切片工作的基本多维Java数组上,产生一个原始的多维Java数组,例如:

int[][] ArrayUtils.slice(int[][][] cube, int axis, int sliceIndex)

  • 切片操作上的原始多维Java数组,produc ES与吸气剂例如一个对象:

SomeKindOf2DimArrayClass ArrayUtils.slice(int[][][] cube, int axis, int sliceIndex)

  • 切片使用非原始阵列既作为输入和输出,并且是这样的类的方法:

SomeKindOf2DimArrayClass slice(int axis, int sliceIndex)

就你的界面而言。

实现明智的,如果你使用基本数组,那么你没有太多的选择,只能做一些“重任” - 打造为siice二维数组 - 至少第3个轴。对于第一个轴,您只需使用其中一个二维数组(即result = Arrays.copyOf(cube[sliceIndex]),如果您感觉活跃,甚至只是使用该参考);第二轴,你会如果你使用一个对象有类似

for(int i=0; i<cube.length; i++) { 
    myAllocated2dArray[i] = Arrays.copyOf(cube[i][sliceindex]) 
} 

,你有很多的选择,从我刚才所描述的是什么@Aquillo在his answer这里建议,为O( 1)使用getter方法的原始数组的空间包装。

你可能会得到关于已通过阅读关于在C language FAQs类似的问题,这里使用的指针(引用)是明确的答复建议的两种实现一些启示:

How can I use statically- and dynamically-allocated multidimensional arrays interchangeably when passing them to functions?

1

由于这是一个相当有趣的话题对我来说,我一直在寻找过答案。我想你可能会碰到Mark Byers的方法:

除了将它存储在一个三维数组中,Mark在如何使用一维数组中有一个非常好的方法。

一些尝试,我拿出完整的立方体后,希望这套房,为您:

public class Cube { 
    int w, h, d; 
    int[] cube; 

    public Cube(int w, int h, int d) { 
     this.w = w; 
     this.h = h; 
     this.d = d; 
     System.out.println("cube: w" + w + ", h" + h + ", d" + d + " = " + (w * h * d)); 
     cube = new int[w * h * d]; 
    } 

    int getCubeValue(int x, int y, int z) { 
     return cube[x * h * d + y * d + z]; 
    } 

    void setCubeValue(int x, int y, int z, int value) { 
     System.out.println("value " + (x * h * d + y * d + z) + ": x" + x + ", y" + y + ", z" + z + " = " + value); 
     cube[x * h * d + y * d + z] = value; 
    } 

    int[] xSlice(int x) { 
     int[] slice = new int[h * d]; 
     for(int y = 0; y < h; y++) { 
       for(int z = 0; z < d; z++) { 
         slice[y * d + z] = getCubeValue(x, y, z); 
       } 
     } 
     return slice; 
    } 

    int xSliceValue(int[] slice, int y, int z) { 
     return slice[y * d + z]; 
    } 

    int[] ySlice(int y) { 
     int[] slice = new int[d * w]; 
     for(int z = 0; z < d; z++) { 
       for(int x = 0; x < w; x++) { 
         slice[z * w + x] = getCubeValue(x, y, z); 
       } 
     } 
     return slice; 
    } 

    int ySliceValue(int[] slice, int x, int z) { 
     return slice[z * w + x]; 
    } 

    int[] zSlice(int z) { 
     int[] slice = new int[w * h]; 
     for(int x = 0; x < w; x++) { 
      for(int y = 0; y < h; y++) { 
       slice[x * h + y] = getCubeValue(x, y, z); 
      } 
     } 
     return slice; 
    } 

    int zSliceValue(int[] slice, int x, int y) { 
     return slice[x * h + y]; 
    } 
} 

说你作出这样new Cube(3, 3, 3)多维数据集,最后的值将是平易近人的cube.getCubeValue(2, 2, 2),因为它开始于零。