Triangular tile map
Recall from the previous post there are only three regular polygons that can be used as tiles. Let's have a look at triangles now. Such tiles are practically not used in games because there is no direct path on the map and the game unit should be turned at each tile. Besides, it is rather hard to place units within acute corners because a lot of free space is wasted.
A triangular tile map can be easily converted from a square tile map transformed to a parallelogram:
Let me introduce several definitions to be used in further calculations:
- The tile size defines distance between the central points of neighbors. The size is set during a map initialization and is used to calculate other values.
- Coordinates of a point.
- Indices of a tile.
r = size/2
- Radius of the inscribed circle.
h = r + size
- Height of the triangle.
w = h / sin 60°
- Width of the triangle.
Calculating the central point of a tile by its index
x = (i - j) × w/2
y = j × h + r if a triangle is turned over
y = j × h + size otherwise
Calculating the index of a tile by a point inside
j = (int) y/h
i = (int) 2 × x/w + j + 1
dx = 2 × x - i × w
dy = y - j × h
dy = h - dy only if triangle is turned over
i-- only if (
w × dy > h × dx)
Calculating distance between two tiles
di = 2 × |i1»1 - i2»1|
dj = 2 × |j1 - j2|
d = di + dj if
(i1 ≤ i2)&(j1 ≥ j2) or
(i1 ≥ i2)&(j1 ≤ j2)
d = max(di,dj) otherwise
The following calculations should be made if one triangle is normal and another one is turned over:
d++ if first triangle is turned over and
(j1 - j2) < (i1 - i2) / 2
d++ if second triangle is turned over and
(j1 - j2) ≥ (i1 - i2) / 2
Running the example
The following example shows an implementation of the triangular tiling map. Each tile contains information about its indices and a distance from the selected tile.
The source code is available, though, it is not optimal. It is