2013-04-13 125 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),因爲它開始於零。