Eu desenho um mapa isométrico com bloco 64x32 :
const Offset = 160;
int X, Y;
for (int a=0; a < 6; a++)
for (int b=0; b < 6; b++) {
X = a * 32 - b * 32 + Offset;
Y = a * 16 + b * 16;
DrawTile(X, Y, tile);
}
Imagem, ilustrando este código:
Caros profissionais, por favor, ajudem com uma fórmula de transformação de coordenadas de mouse em índices isométricos de uma célula. Exemplo: (105; 100) -> [1; 4]
mathematics
algorithm
isometric
Alexan-Dwer
fonte
fonte
while(val = arr[i++])
construções semelhantes ou similares, não a use . Use++a
e em++b
vez disso.Respostas:
Você precisa determinar a matriz de transformação de coordenadas de espaço em mosaico em coordenadas de espaço de tela e, em seguida, calcular a matriz inversa para isso, que quando aplicada às coordenadas de espaço em tela as transforma em coordenadas de espaço em mosaico.
Caso específico
O que você está basicamente fazendo para transformar as coordenadas do espaço do bloco (a, b) em coordenadas do espaço da tela (x, y) é executá-lo através da seguinte matriz de transformação:
Definições: um e b para o ladrilho (0, 0) estão no intervalo [0.0, 1.0) com (0.0, 0.0), sendo o canto superior, (1.0, 1.0) no canto inferior, (0.0, 1.0) o canto esquerdo e (1,0, 0,0) o canto direito no espaço da tela.
Nós estendemos as definições de coordenadas por uma terceira coordenada constante (é sempre exatamente 1) para poder incorporar a tradução na matriz.
Agora você pode criar a matriz inversa para essa transformação. A fórmula básica é:
... com C sendo a matriz de co-factores para uma .
No seu caso, o determinante | Um | é sempre 1024, independentemente do deslocamento, portanto, a matriz inversa é:
Exemplo de cálculo
Agora, para seus dados de exemplo ...
Coloque seu número para deslocamento na fórmula e você obtém:
Multiplicar (105, 100, 1) (as coordenadas da tela) com a matriz permite:
Como a terceira coordenada é sempre 1, não precisamos calculá-la. Arredonde para o número inteiro mais próximo e você obtém (1, 4) as coordenadas do espaço do bloco, conforme o esperado.
Matrizes de projeção dimétrica geral
Se você tiver uma perspectiva como essa, com cada ladrilho com 2 w de largura (64 no exemplo, então w = 32) e 2 h de altura (32 no exemplo, então h = 16) e o deslocamento do ponto de origem no espaço de tela ser f x e f y para o eixo horizontal e vertical, respectivamente, (192 e 0 no exemplo), as matrizes de olhar como se segue.
Espaço em bloco para o espaço da tela
Espaço da tela para o espaço lado a lado
fonte