• Create Account

## Isometric Hex Picking

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

8 replies to this topic

### #1AesteroidBlues  Members

129
Like
0Likes
Like

Posted 05 August 2012 - 06:48 PM

Hey everyone,

I was wondering if anyone had any suggestions or words of wisdom on how to perform picking on a grid of isometric hexagonal tiles. Something like this:

I've read Paul Firth's excellent article on isometric picking on a square-tile map and I was wondering if there was a similar method for hexagons. We're using Javascript on an HTML5 canvas and I'm not sure a system that compares pixel color data (as described on XNA Resources) would be ideal for performance reasons. Thanks for any advice you can give me!

### #2Neometron  Members

516
Like
1Likes
Like

Posted 06 August 2012 - 02:43 AM

Thanks for link to Paul Firth's article It sparked new ideas for me.
I never done isometric let alone hexagonal so please forgive me in advance for guessing.

Looking at the image of the hexagonal tiles in OP, I tilt my head slightly to the left and see that this is still a 2d grid (x,y).
Starting on the far left tile is (0,0) and the far right is (5,3)
Every hex tile has a center. The center point will become the exact tile location.

Based on the 'Coordinate Systems' section of the article: (0,0) will become the origin for the up 'U' and right 'V' vectors.
The two vectors will pass through all the center points of each hex tile along the edge of the map.
Get the screen coordinate 'P'
Do the math to get tU and tV

Temporarily select a tile based on (tU, tV). So if (tU, tV) = (1.3, 2.7) then it will pick tile (1, 3).

Afterwards, do a more comprehensive test.
Using the temporary tile, check the six sides if the (tU, tV) falls within the polygon. All sides are equal distance from the center of the tile.
If any one side fails the check then the adjacent tile is the tile to be selected. Otherwise the current tile is the selected tile.

### #3AesteroidBlues  Members

129
Like
0Likes
Like

Posted 06 August 2012 - 02:19 PM

Ah! That makes quite a bit of sense, however does the assumption that all sides of the hexagon are equidistant from the centerpoint hold when the isometric perspective is applied? This would be correct for an orthographic top-down map, but just eyeballing it with my mouse pointer over the image in the OP, it appears that the "top" and "bottom" of the hex tile are closer than the sides. I could be mistaken though.

### #4Firestryke31  Members

350
Like
0Likes
Like

Posted 06 August 2012 - 07:34 PM

I don't see how it's all that different from regular isometric:

Hex: (Ignore the "Stop deleting my spaces HTML" dots)
[source lang="plain"].__ .. __/ A\__/ B\\__/ C\__// D\__/ E\\__/ F\__/[/source]
Iso:
[source lang="plain"]/A\ /B\\ /C\ //D\ /E\\ /F\ /[/source]

The only difference I see drawing/picking logic wise is the tiles are a little wider and slightly differently shaped.

### #5Neometron  Members

516
Like
0Likes
Like

Posted 07 August 2012 - 12:29 AM

"does the assumption that all sides of the hexagon are equidistant from the centerpoint hold when the isometric perspective is applied?"

It should hold true. I though point P is in screen space and it gets translated into point T which is P in grid space. Essentially grid space is like viewing the hexagon tile from perfectly above or basically without perspective.

### #6face08  Members

109
Like
0Likes
Like

Posted 07 August 2012 - 07:28 PM

I find a demo like this but AesteroidBlues shows the pic is slant

### #7 joew   Members

4335
Like
0Likes
Like

Posted 07 August 2012 - 08:42 PM

One of the quickest and easiest ways to do it would be to use a mouse map like in this article (check out the very bottom for the mouse map idea).

Edited by Saruman, 07 August 2012 - 08:42 PM.

### #8AesteroidBlues  Members

129
Like
0Likes
Like

Posted 08 August 2012 - 09:18 PM

It should hold true. I though point P is in screen space and it gets translated into point T which is P in grid space. Essentially grid space is like viewing the hexagon tile from perfectly above or basically without perspective.

Oh I see what you're doing, I think I was getting confused by all of the variables
This method would be great, but I'm afraid I don't know how to transform screen point P into its equivalent point in grid-space. Something tells me it involves matrices

One of the quickest and easiest ways to do it would be to use a mouse map like in this article (check out the very bottom for the mouse map idea).

I've read quite a bit about mouse maps, unfortunately I'm wary of their performance cost in my development environment (HTML5 with Canvas and Javascript). I'll certainly be experimenting with this method tomorrow but I've had mixed experiences with Canvas' getPixelData() function.

### #9 joew   Members

4335
Like
1Likes
Like

Posted 09 August 2012 - 11:58 PM

I'll certainly be experimenting with this method tomorrow but I've had mixed experiences with Canvas' getPixelData() function.

If it turns out to be slow you could always use the equivalent technique but as an array (i.e. just assign each color a number and build an array that you embed as an include), that way the only cost is a very quick array index lookup.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.