web-dev-qa-db-fra.com

Traiter une structure de données 1D comme une grille 2D

Je travaille avec une classe native qui représente une image 2D comme un tableau 1D. Si vous souhaitez modifier un pixel, par exemple, vous devez maintenant savoir comment dériver l'index à partir de x,y coordonnées.

Supposons donc que nous ayons un tableau 1D array1d comme ça:

array1d = [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y ]

Dans le cadre de notre programme, array1d représente une grille 2D:

a b c d e
f g h i j
k l m n o
p q r s t
u v w x y

Et nous voulons effectuer des opérations sur array1d tel que:

  • Obtenez la valeur à x,y coordonnées (dans cet exemple, 1,2 donnerait l)
  • Obtenez n'importe quelle sous-grille en utilisant x,y,width,height (1,2,2,2 donnerait [l, m, q, r])
  • Définissez la valeur à n'importe quel x,y coordonnée (etc.)

Comment faisons-nous cela?

47
GladstoneKeep

2D/1D - la cartographie est assez simple. Étant donné x et y, et les tailles de tableau 2D width (pour la direction x) et height (pour la direction y), vous pouvez calculer l'indice correspondant i dans l'espace 1D (base zéro) par

i = x + width*y;

et l'opération inverse est

x = i % width;    // % is the "modulo operator", the remainder of i / width;
y = i / width;    // where "/" is an integer division

Vous pouvez facilement l'étendre à 3 dimensions ou plus. Par exemple, pour une matrice 3D avec les dimensions "largeur", "hauteur" et "profondeur":

i = x + width*y + width*height*z;

et inverser:

x = i % width;
y = (i / width)%height;
z = i / (width*height);
90
Doc Brown