Os pensamentos de Amit sobre Grades [Parte 6: Transformação das Coordenadas]

by apecode1

Em ambos os sistemas gráficos 2D e 3D, nós temos que transformar as coordenadas do “mundo” em coordenadas da “tela” e vice versa. Com grades, nós também temos que transformar as coordenadas da “grade” em coordenadas do “mundo” e vice e versa. Transformações ocorrem em pontos. De grades para coordenadas do mundo, nós transformamos vértices e ocasionalmente os centros das faces. Do mundo para as coordenadas da grade, nós podemos ou escolher encontrar o ponto anexado da face, a borda mais próxima à um ponto, ou o vértice mais próximo à um ponto.

Quadrados

Quadrados são fáceis de se trabalhar. Se um dos lados do quadrado possui comprimento “s” e as bordas deste quadrado são alinhadas com os eixos “x” e “y”, você pode simplesmente multiplicar as coordenadas do vértice da sua grade por “s” para obter a coordenada do mundo.

Agora fazendo o contrário, nós queremos determinar qual vértice é mais próxima de um ponto no espaço do mundo. Simplesmente divida as coordenadas do mundo por “s” e arredonde para cima a float para uma interger para obter o vértice mais próximo. Se ao invés você quer determinar que face se anexa a um ponto no espaço do mundo, arredonde para baixo ao invés de para cima.

Hexágonos

Figura 1: Medidas do Hexágono

Hexágonos são só um pouco mais complicados de se trabalhar do que quadrados. Computar o centro da face é simples. Na Figura 1, há um vetor “i” e um vetor “j” indo das coordenadas hexagonais às coordenadas do mundo é uma multiplicação de matriz(bem simples):

⎛ x ⎞     ⎡ ix jx ⎤ ⎛ u ⎞
⎝ y ⎠  =  ⎣ iy jy ⎦ ⎝ v ⎠

Expandido ficaria:

x = ix * u + jx * v
y = iy * u + jy * v

O diagrama mostra que “i” é (hexagon_narrow_width, 0.5*hexagon_height) e “j” é (0, hexagon_height), então isto nos da valores para “ix”, “iY”, “jx”, “jy”. O código resultante é:

# Centro da Face
x = hexagon_narrow_width * u
y = hexagon_height * (u*0.5 + v)

Computar vértices também é algo um tanto simples. No resto dos artigos eu rotulei as vértices do hexágono de “L” ou “R”. Esses dois vértices ocorrem da metade da largura do hexágono para a esquerda ou direita do centro da face do hexágono(veja a Figura 1), então tudo o que nós temos que fazer é somar ou subtrair hexagon_wide_width * 0.5:

# Se x,y são o centro da face, nós podemos ajustar para encontrar um vértice
case side
  when :L
    x -= hexagon_wide_width * 0.5
  when :R
    x += hexagon_wide_width * 0.5
end

Quando estiver trabalhando com hexágonos, trate o centro das faces como primário e os vértices como secundário.

Ir de coordenadas hexagonais (u, v) para coordenadas do mundo (x, y) foi uma multiplicação de matriz. Para ir de coordenadas do mundo de volta para hexágonos, você pode resolver a equação para (u, v). Eu vou pular a álgebra; aqui está o resultado:

u = x / hexagon_narrow_width
v = y / hexagon_height - u * 0.5

Isto funciona se você começar com (x, y) no centro de uma face. Se você tiver arbitrariamente (x, y) é um pouco mais trabalhoso. A maneira mais simples(porém não mais eficiente) é de considerar o calculado (u, v) mais todos os vizinhos e determinar qual é o mais próximo da dada coordenada do mundo. Esta abordagem funciona com qualquer um dos três tipos de grades. Se você estiver utilizando esta forma para seleção por mouse, está é bastante rápida. Pode ser melhorada mais ainda ao se ter mais atenção com os polígonos.

Triângulos

Triângulos são quadrados distorcidos e divididos. Converter as vértices de um triângulo das coordenadas da grade para coordenadas do mundo simplesmente envolve multiplicá-las pelos vetores do eixo, assim como as coordenadas da face do hexágono:

⎛ x ⎞     ⎡ ix jx ⎤ ⎛ u ⎞
⎝ y ⎠  =  ⎣ iy jy ⎦ ⎝ v ⎠

Converter as coordenadas da face triangular para coordenadas do mundo é fácil, envolve um ajuste. O “L” do centro da face triangular é (0.25*i, 0.25*j) do vértice inferior esquerdo. O “R” do centro da face triangular é (0.75*i, 0.75*j) do vértice inferior esquerdo.

Para converter de coordenadas do mundo para vértices do triângulo é fácil. Esclareça para (u, v) usando álgebra. Para determinar qual face o ponto do mundo está, considere a borda que está dividindo os dois triângulos dentro do quadrado retorcido; esta borda é rotulada “E”. Se o seu ponto é à esquerda desta linha, o ponto está na face “L”; se estiver na direita, o ponto está na face “R”. Acredito que seja “R” quando frac(u) + frac(v) >= 0.5.

Quando trabalhar com triângulos, trate as vértices como primárias, e o centro das faces como secundário. Este é o oposto de como tratamos os hexágonos.