2012-07-24 17 views
5

Üç boyutlu diziler kafamı sarmak için çalışıyorum. Onların iki boyutlu dizilerden oluşan diziler olduğunu anlıyorum, ama okuduğum kitap beni şaşırtan bir şey söyledi. Okuduğum kitap için bir egzersizde anlama Üç Boyutlu Diziler

, bir tam renkli görüntü için üç boyutlu bir dizi yapmak için soruyor. Bu söyleyerek bununla ilgili bir örnek:

biz üç boyutlu bir dizi seçim için karar verirseniz, burada dizi ilan edilmesi nasıl açıklanmıştır:

int[][][] colorImage = new int[numRows][numColumns][3]; 

Ancak, daha olmaz bu şekilde etkili mi?

3 rgb değeri, 0 kırmızı, 1 yeşil ve 2 mavi olduğunda. İkincisi ile, her iki boyutlu dizi, satır ve sütunun renk değerini saklıyordu, değil mi? Sadece üç boyutlu bir diziyi nasıl kullanacağımı anladığımdan emin olmak istiyorum.

Herhangi bir yardım büyük takdir edilecektir, teşekkürler.

+0

de aynı durum geçerlidir. Tutarlı olduğu sürece boyutları istediğiniz gibi kullanabilirsiniz. Performans veya hafıza farkı yoktur. – Bohemian

+0

Siparişin neden bir fark yarattığına inanıyorsunuz? – Luxspes

+0

@Luxspes Ben buna inanmıyorum. Bunu biliyorum. – Bohemian

cevap

1

al fark etmez, ve aslında eski formunu daha okunabilir:

final const int RED = 0; 
final const int GREEN = 1; 
final const int BLUE = 2; 

int[][][] colorImage = new int[numRows][numColumns][3]; 
//... 

int x = getSomeX(); 
int y = getSomeY(); 

int redComponent = colorImage[x][y][RED]; 
int greenComponent = colorImage[x][y][GREEN]; 
int blueComponent = colorImage[x][y][BLUE]; 
+1

Yukarıdaki kodda hata. İndeksleri 0,1,2 istiyorum. 1,2,3 değil. – Gazzonyx

+0

@Gazzonyx doğru. Sabit. – Strelok

1

önemli olmamalı düzen, yani birinin diğerinden daha etkili değildir. Önemli olan tek şey, colorImage ne olursa olsun, hangi boyutun ne için kullanıldığını bilir. Çok boyutlu dizilerle ilgili daha fazla bağlam here.

0

emin değilim onun iyi bir fikir int bir 3-boyutlu dizide her şeyi koymak eğer.

İlk hatan dataytpe geçerli: RGB bir int. Ama R bir bayt olduğunu, G, bir bayt, B bir bayt

Bir int ihtiyaç ele almak istediğiniz çünkü (Color.getXXX() ben çünkü onun bayt 0-255 nedenini bilmiyorum, bir int verir) .. çok olduğu 256'dan fazla cols & satır. (Sorun yok). Ancak, renk bilgisini fazladan bir nesnede kapsüllemek çok daha iyi. Eğer bütün app sınıfı MyColor kamu yaparsanız belki

class MyColor { 

     public byte r, g, b; //public for efficient access; 
     public int color;  //public for efficient access; 

     public MyColor(final int rgb) { 
      this(new Color(rgb)); 
     } 

     public MyColor(final Color c) { 
      this((byte) c.getRed(), (byte) c.getGreen(), (byte) c.getBlue(), c.getRGB()); 
     } 

     public MyColor(final byte red, final byte green, final byte blue, final int c) { 
      this.r = red; 
      this.g = green; 
      this.b = blue; 
      this.color = c; 
     } 
    } 

ve MyColor[numRows][numColumns]

bir 2dim dizide bu koymak gibi özel veri tipleri de Ama - i sınıfın tasarımını değiştirecek daha güvenli olması için .

İlgili konular