web-gelistirme-sc.com

Üç Boyutlu Dizileri Anlamak

Kafamı üç boyutlu dizilerin etrafına sarmaya çalışıyorum. Onların iki boyutlu dizilerin dizileri olduğunu anlıyorum, ancak okuduğum kitap kafamı karıştıran bir şey söyledi.

Okuduğum kitap için bir alıştırmada, tam renkli bir resim için üç boyutlu bir dizi yapmamı istedi. Bunu söyleyen küçük bir örnek verir:

Üç boyutlu bir dizi seçmeye karar verirsek, dizi nasıl açıklanır:

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

Ancak, böyle daha etkili olmaz mıydı?

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

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

Herhangi bir yardım çok takdir edilecektir, teşekkürler.

8
Undefined

Düzen önemli değil ve aslında eski form daha okunaklı:

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];
2
Strelok

Emir önemli olmamalı, biri diğerinden daha etkili değil. Önemli olan tek şey, colorImage'a erişenin, hangi boyutun ne için kullanıldığını bilmesidir. Çok boyutlu dizilerde biraz daha fazla bağlam burada .

2
Tyson

Her şeyi üç boyutlu bir int dizisine koymak iyi bir fikir olup olmadığından emin değilim.

İlk hatanın veri türü: RGB bir int. Fakat R bir bayt, G bir bayt, B de bir bayt .. (Color.getXXX() bir int sağlar, neden bilmiyorum çünkü onun bir bayt 0-255)

Bir int'ye ihtiyacınız var çünkü 256'dan fazla sütun ve satırdan fazlasını ele almak istiyorsunuz. (Sorun yok). Ama bence renk bilgisini fazladan bir nesneye yerleştirmek çok daha iyi. Belki de özel bir veri yapısı

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 bunu 2dim MyColor[numRows][numColumns] dizisine koyun

Ama eğer sınıfını MyColor'u tüm uygulamanıza açık hale getirirseniz, sınıfın tasarımını daha güvenli olacak şekilde değiştirirdim.

0
Mirko