web-dev-qa-db-fra.com

Comprendre les tableaux à trois dimensions

J'essaie de faire le tour des tableaux en trois dimensions. Je comprends qu’il s’agit de tableaux de tableaux à deux dimensions, mais le livre que je lisais disait quelque chose qui me rend confus.

Dans un exercice pour le livre que je lis, il me demande de créer un tableau en trois dimensions pour une image en couleur. Cela donne un petit exemple en disant ceci:

Si nous décidons de choisir un tableau à trois dimensions, voici comment le tableau pourrait être déclaré:

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

Cependant, ne serait-il pas plus efficace comme ça?

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

Où 3 est la valeur de la RVB, 0 étant le rouge, 1 le vert et 2 le bleu. Avec ce dernier, chaque tableau à deux dimensions stockerait la valeur de couleur de la ligne et de la colonne, non? Je veux juste m'assurer de comprendre comment utiliser efficacement un tableau à trois dimensions.

Toute aide sera grandement appréciée, merci.

8
Undefined

L'ordre n'a pas d'importance et, en fait, la première forme est plus lisible:

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

L'ordre ne devrait pas avoir d'importance, donc l'un n'est pas plus efficace que l'autre. La seule chose qui compte, c’est que quel que soit l’accès à colorImage, quelle dimension est utilisée pour quoi. Un peu plus de contexte sur les tableaux multidimensionnels ici .

2
Tyson

Je ne suis pas sûr que ce soit une bonne idée de tout mettre dans un tableau à trois dimensions d'int.

Votre première erreur est la dataytpe: RGB est un int. Mais R est un octet, G est un octet, B est un octet aussi .. (Color.getXXX() délivre un int, je ne sais pas pourquoi parce que c'est un octet 0-255)

Vous avez besoin d'un int parce que vous voulez traiter plus de 256 colonnes et lignes. (C'est d'accord). Mais je pense qu'il est bien préférable d'encapsuler les informations de couleur dans un objet supplémentaire. Peut-être une infrastructure de données privée comme

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;
        }
    }

et le mettre dans un tableau 2dim de MyColor[numRows][numColumns]

Mais si vous rendez la classe MyColor publique à l'ensemble de votre application, je modifierais la conception de la classe pour la rendre plus sécurisée.

0
Mirko