Saltar al contenido

Manhattan Distancia entre mosaicos en una cuadrícula hexagonal

Solución:

Una vez configuré un sistema de coordenadas hexagonales en un juego para que el y-eje estaba en un ángulo de 60 grados con el X-eje. Esto evita la distinción entre filas pares e impares.

Rejilla hexagonal


(fuente: althenia.net)

La distancia en este sistema de coordenadas es:

dx = x1 - x0
dy = y1 - y0

if sign(dx) == sign(dy)
    abs(dx + dy)
else
    max(abs(dx), abs(dy))

Puede convertir (X‘, y) de su sistema de coordenadas a (X, y) en este usando:

x = x' - floor(y/2)

Entonces dx se convierte en:

dx = x1' - x0' - floor(y1/2) + floor(y0/2)

Tenga cuidado con el redondeo al implementar esto mediante la división de enteros. En C para int y floor(y/2) es (y%2 ? y-1 : y)/2.

Supongo que desea la distancia euclidiana en el plano entre los centros de dos mosaicos que se identifican como se muestra en la figura. Creo que esto se puede derivar de la figura. Para cualquier xey, el vector desde el centro del mosaico (x, y) al centro del mosaico (x + dx, y) es (dx, 0). El vector del centro del mosaico (x, y) y (x, y + dy) es (-dy / 2, dy * sqrt (3) / 2). Una simple suma vectorial da un vector de (dx – (dy / 2), dy * sqrt (3) / 2) entre (x, y) y (x + dx, y + dy) para cualquier x, y, dx, y dy. La distancia total es entonces la norma del vector: sqrt ((dx – (dy / 2)) ^ 2 + 3 * dy * dy / 4)

Si desea la distancia en línea recta:

double dy = y2 - y1;
double dx = x2 - x1;
// if the height is odd
if ((int)dy & 1){
    // whether the upper x coord is displaced left or right
    // depends on whether the y1 coordinate is odd
    dx += ((y1 & 1) ? -0.5 : 0.5);
}
double dis = sqrt(dx*dx + dy*dy);

Lo que estoy tratando de decir es, si dy es uniforme, es solo un espacio rectangular. Si dy es impar, la posición de la esquina superior derecha es 1/2 unidad hacia la izquierda o hacia la derecha.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *