8 de julho de 2015

Como Achatar Vetores Multidimensionais

O uso de vetores é extremamente comum e importante na programação. Em alguns casos porém acaba sendo um problema ter que lidar com vetores de 2 ou 3 dimensões. Neste tutorial vou mostrar como transformar 2 ou 3 índices em apenas 1.

Os vetores de uma dimensão são os mais simples, caso não saiba utilizá-los veja o Tutorial sobre Vetores. A posição indicada dá diretamente o número da célula que iremos utilizar, por exemplo:

vetor[2] indica a célula 2. Atenção, a célula 2 não é o mesmo que 2ª célula, pois a contagem se inicia no 0. Portenta célula 2 é a terceira posição do vetor.

Já nos vetores de maiores dimensões, novas coordenadas são necessárias para acessar uma célula, por exemplo:

status[2, 1]
status[1, 3, 4] //Lembrando que o Game Maker não suporta vetores 3D, portanto este método também é uma maneira de 'burlar' o sistema.

Deste modo não estamos mais utilizando o número da célula, mas sim suas coordenadas. Se imaginarmos um grid 3x3, a celula 0 estaria na posição (0,0) e a célula 8 estaria na posição (2,2).

0  1  2
3  4  5
6  7  8

Para transformar uma coordenada de duas dimensões em um indíce utilizamos a fórmula:

índice  = x + y*linha

x e y são coordenadas
linha é o tamanho máximo da linha (3 no exemplo acima)

Na coordenada (1, 1) teremos e célula 4 pois: 1 + 1*3 = 4.

A lógica é simples, para cada linha completa adicionamos o número de células de uma linha e somamos à coordenada x.

Para 3 dimensções o raciocínio é semelhante:

índice = x + y * linha + (z * linha * coluna)

x, y e z são as coordenada
linha é o tamanho máximo da linha
coluna é o tamanho máximo da coluna

Além da posição definida por x e y, adicionamos também o número total de células a cada "andar"  do eixo z. Podemos simplificar a fórmula colocando "linha" em evidência. Teremos então:

x + linha*(y + z * coluna)

Desta forma teremos o índice de qualquer célula localizada no plano x/y ou x/y/z. 

Nenhum comentário :

Postar um comentário