Trattare una struttura dati 1D come griglia 2D

40

Sto lavorando con una classe nativa che rappresenta un'immagine 2D come array 1D. Se vuoi cambiare un pixel, ad esempio, ora devi calcolare come ricavare l'indice dalle coordinate di x,y .

Quindi, supponiamo di avere un array 1D array1d come questo:

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 ]

Nel contesto del nostro programma, array1d rappresenta una griglia 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

E vogliamo eseguire operazioni su array1d come:

  • Ottieni il valore su x,y coordinate (in questo esempio, 1,2 darebbe l )
  • Ottieni una qualsiasi sub-griglia utilizzando x,y,width,height ( 1,2,2,2 darebbe [l, m, q, r] )
  • Imposta il valore su qualsiasi coordinata x,y (ecc.)

Come facciamo questi?

    
posta GladstoneKeep 28.09.2013 - 19:03
fonte

1 risposta

70

2D / 1D: la mappatura è piuttosto semplice. Dato xey, e le dimensioni degli array 2D width e height , puoi calcolare il secondo indice i nello spazio 1D (a base zero) di

i = x + width*y;

e l'operazione inversa è

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

Puoi estenderlo facilmente a 3 o più dimensioni. Ad esempio, per una matrice 3D con dimensioni "larghezza", "altezza" e "profondità":

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

e retromarcia:

x = i % width;
y = (i / width)%height;
z = i / (width*height);
    
risposta data 28.09.2013 - 19:54
fonte

Leggi altre domande sui tag