Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Manhattan Distance between tiles in a hexagonal grid

Tags:

For a square grid the euclidean distance between tile A and B is:

distance = sqrt(sqr(x1-x2)) + sqr(y1-y2))

For an actor constrained to move along a square grid, the Manhattan Distance is a better measure of actual distance we must travel:

manhattanDistance = abs(x1-x2) + abs(y1-y2))

How do I get the manhattan distance between two tiles in a hexagonal grid as illustrated with the red and blue lines below?

enter image description here

like image 225
Coyod Avatar asked Feb 22 '11 22:02

Coyod


People also ask

How do you find the distance between two objects in Manhattan?

The Manhattan Distance between two points (X1, Y1) and (X2, Y2) is given by |X1 – X2| + |Y1 – Y2|.

What is Manhattan distance formula?

The Manhattan distance is defined by(6.2)Dm(x,y)=∑i=1D|xi−yi|, which is its L1-norm.

What is Manhattan distance in clustering?

Manhattan distance captures the distance between two points by aggregating the pairwise absolute difference between each variable while Euclidean distance captures the same by aggregating the squared difference in each variable.

When should Manhattan distance be used?

Manhattan distance is usually preferred over the more common Euclidean distance when there is high dimensionality in the data. Hamming distance is used to measure the distance between categorical variables, and the Cosine distance metric is mainly used to find the amount of similarity between two data points.


2 Answers

I once set up a hexagonal coordinate system in a game so that the y-axis was at a 60-degree angle to the x-axis. This avoids the odd-even row distinction.

Hexagonal grid
(source: althenia.net)

The distance in this coordinate system is:

dx = x1 - x0 dy = y1 - y0  if sign(dx) == sign(dy)     abs(dx + dy) else     max(abs(dx), abs(dy)) 

You can convert (x', y) from your coordinate system to (x, y) in this one using:

x = x' - floor(y/2) 

So dx becomes:

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

Careful with rounding when implementing this using integer division. In C for int y floor(y/2) is (y%2 ? y-1 : y)/2.

like image 112
aaz Avatar answered Oct 13 '22 23:10

aaz


I assume that you want the Euclidean distance in the plane between the centers of two tiles that are identified as you showed in the figure. I think this can be derived from the figure. For any x and y, the vector from the center of tile (x, y) to the center of tile (x + dx, y) is (dx, 0). The vector from the center of tile (x, y) and (x, y + dy) is (-dy / 2, dy*sqrt(3) / 2). A simple vector addition gives a vector of (dx - (dy / 2), dy * sqrt(3) / 2) between (x, y) and (x + dx, y + dy) for any x, y, dx, and dy. The total distance is then the norm of the vector: sqrt((dx - (dy / 2)) ^ 2 + 3 * dy * dy / 4)

like image 21
Ted Hopp Avatar answered Oct 13 '22 23:10

Ted Hopp