Tratando uma estrutura de dados 1D como grade 2D

40

Estou trabalhando com uma classe nativa que representa uma imagem 2D como uma matriz 1D. Se você quiser alterar um pixel, por exemplo, você precisa agora como derivar o índice das coordenadas x,y .

Então, digamos que temos uma matriz 1D array1d assim:

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 ]

No contexto do nosso programa, array1d representa uma grade 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 queremos realizar operações em array1d , como:

  • Obtenha o valor em x,y coordinates (neste exemplo, 1,2 daria l )
  • Obtenha qualquer sub-grade usando x,y,width,height ( 1,2,2,2 daria [l, m, q, r] )
  • Defina o valor em qualquer x,y coordinate (etc.)

Como fazemos isso?

    
por GladstoneKeep 28.09.2013 / 19:03
fonte

1 resposta

70

2D / 1D - o mapeamento é bem simples. Dados os tamanhos xey e array 2D width e height , é possível calcular o índice de acordo i no espaço 1D (baseado em zero) por

i = x + width*y;

e a operação inversa é

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

Você pode estender isso facilmente para três ou mais dimensões. Por exemplo, para uma matriz 3D com dimensões "largura", "altura" e "profundidade":

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

e inversa:

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