Tech notes for the curious:
I started the page in 2013 based on notes I had been collecting for ~20 years before that. I update this reference page as I come up with better visualizations and explanations. The last major update was in 2018 when I rewrote it from using d3.js to using vue.js. It greatly reduced the amount of code I was writing, and also let me make the page more interactive. I then added lots more (doubled coordinates, links to papers, axes legends, diagonal directions, side by side comparisons) and improved most of the existing sections. In 2019 the changes were minor, rewriting the map storage section and improving performance. In 2020 I improved the cube/hex animation, the pixel-to-hex section, and added Rust sample code. There's lots more I could add to the page[1] but I don't have any specific plans for when I'll get around to it.
The page is svg- and js-heavy. I prerender the diagrams on the server (try loading it without js!). Then using IntersectionObserver on each section of the page, I swap the static diagrams and text with interactive versions. This improves load times somewhat, because almost no JS has to run on page load.
For printability I process the page with xsltproc, extract all the links, and turn them into footnotes. Try print preview on the page to see these. Unfortunately the diagrams are broken when printing in Chrome (it works in Firefox) so I need to investigate.
[1]: https://www.notion.so/redblobgames/f8bc2f44fba94607afa9c0671...
https://www.gearoidoconnor.ie/blog/2017/02/22/Building-on-de...
There is truly nothing out there like it. :)
It reminds me of old school web. When google first came on the scene I was amazed at how many informational pages from either hobbyists or professionals existed (but which I wasn't finding with older search engines), where someone just decided to put everything they know about some topic into a page in glorious detail.
I want to see more pages like that so, following “Be the change that you wish to see in the world”, I am writing informational pages.
Hexagonal grids give you precise measurements in exactly 6 directions.
If you approximate sqrt(2) as 1.5 then square grids give you pretty darn accurate measurements in 8 directions, including 2 pairs of directions that are orthogonal, which is good for rectangular features like buildings.
Furthermore the distance between two points can be quickly calculated with (long-side + 1/2 short-side), which is doable in your head, unlike the distance calculation on a hex grid.
Lastly, if you divide the circle into a large number of slices and calculate the average error for path distance using hex or squares, among those slices, the average error (compared to pythogorean) is smaller with squares (obviously for small multiples of 6 and small multiples of 8 respectively, one or the other will be preferred).
Square grids give you precise measurements in exactly 4.
> If you approximate sqrt(2) as 1.5 then square grids give you pretty darn accurate measurements in 8 directions, including 2 pairs of directions that are orthogonal
If you approximate sqrt(3) as 1.75, then hex grids give you pretty darn accurate measurements in 12 directions, including 3 pairs of directions that are orthogonal.
(If square grids have an advantage here, it's that the quantum of measurement the same on each axis of each orthogonal pair, 1 on one axis and 1.5 on the other; whereas each orthogonal pair on a hex grids has one axis with quantum 1 and one with quantum 1.75.)
> Furthermore the distance between two points can be quickly calculated with (long-side + 1/2 short-side), which is doable in your head, unlike the distance calculation on a hex grid.
The equivalent loose approximation on a hex grid would seem to be long direction minus 1/4 short direction, which doesn't seem any harder.
As promised in a sibling comment I would work it out on paper. By my path, using the 7/4 approximation for sqrt(3), the ratio between X and Y directions is 12:21 which is much harder to do in your head than the 3:2 that a square grid gives you. However, a simpler approximation of (5:3) with acceptably low error came out.
Math (see diagram below)
Normalizing your 1.75 approximation to 7 "units" then the sides of the hexagon are of length 7, the distance from center to corner is length 7, and the distance from center to side is 6. This gives a distance from A to other points as:
B: 12 (Center -> Side -> Center)
C: 12 (Center -> Side -> Center)
D: 21 (Center -> Corner -> Corner -> Center)
Given that the actual value of A->D is ~20.784 that suggests approximating A->D = 20 alowing us to reduce as follows:
B: 3
C: 3
D: 5
This has a ~3.7% error in the horizontal direction.
______ ______
/ \ / \
/ B \______/ \___
\ / \ /
\ / \ /
---- C ----
/ \ / \
/ A \______/ D \___
\ / \ /
\ / \ /
---- ----
/ \ / \
/ \______/ \___
\ / \ /
\ / \ /
---- ----I agree mostly, though i prefer hex grids for war games and square grids for rpgs/roguelikes.
Hex grids allow for more units in a given encounter, plus, i'm likely biased as the first tabletop war game i ever played was battle masters which used a huge hex grid map and a card draw system for movement with some 'cool skull dice' for battles and big plastic figures on bases with flags for units. There was like 6-7 unique unit types for each side, including a special unique unit for each army with special abilities. You got to build an awesome plastic tower units could occupy, it was basically orcs vs humans like the first warcraft. My 8-9 year old self was pretty stoked.
Also, for some reason i remember there was an elven shortsword item card that had this description
'Light as a moonbeam, sharp as a tiger's claw'
That's really stuck in my head as the definitive description of elvish/elfish(for you pedantic Tolkien fans) weapons.
Just seems fitting.
For a hexagonal grid, the distance is approximated by counting the number of cells of the shortest path. This has <10% relative error (IIRC) from the actual distance.
The half-short-side heuristic (sqrt(aa + bb) ~= a + b/2) makes taxicab very close to correct for non-square distance as well.
Image: "Hexagonal formations on the surface of the Salar de Uyuni (Bolivia, 3,656 meters above sea level) [0] as a result of salt crystallization from evaporating water": https://en.wikipedia.org/wiki/Salar_de_Uyuni#/media/File:Sal...
"During the rainy season (December to March) the salt flat gets covered with a layer of water. As the water evaporates under largely still conditions, the salt forms hexagonal shapes (optimal for heat transfer) on its surface known as Bénard cells, an example of the Rayleigh–Bénard convection [1] phenomena." [2]
[0] https://en.wikipedia.org/wiki/Salar_de_Uyuni
[1] https://en.wikipedia.org/wiki/Rayleigh%E2%80%93B%C3%A9nard_c...
[2] https://commons.wikimedia.org/wiki/File:20170809_Bolivia_158...
[0] https://www.flickr.com/photos/jeremyjohnstone/3979747216/
2019 https://news.ycombinator.com/item?id=19184412
2017 https://news.ycombinator.com/item?id=14627711
2015 https://news.ycombinator.com/item?id=9537009
2015 https://news.ycombinator.com/item?id=8941588
Discussed at the time: https://news.ycombinator.com/item?id=5809724
The source site also has a lot of great stuff on applications of computer science to less-thought-of aspects of game development (by which I mean people usually think of pixel-blasting 3D engines as "game development", but there's a lot more to it)
I've been doodling with Processing and was working on hexagonal Truchet tiles. (basically random tiles that have paths connecting to any random tiles next to it, with hexagons as tiles instead of squares)
I ended up having to figure out some of that stuff again, in particular the coordinate system inside each tile so that I could deal with integer coordinates and translate them into the right fraction of the radius.
It was fun to figure out what I needed, so I don't regret it :)
And I am also planning on doing something with cubes, so this page will come in handy.
Thanks for sharing! I love how it covers all aspects of the problem.
Result of the tiling: https://twitter.com/_timothee/status/1330315929641570304
Diagram of my coordinate system: https://twitter.com/_timothee/status/1327859098642046976
[0] https://en.wikipedia.org/wiki/Sébastien_Truchet [1] https://support.apple.com/en-afri/guide/motion/motn5d6778a0/...
https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...
I've been on this website so often, and pointed other people so many times to it... I hope this never gets lost and is archived.
If Amit would write a book about gamedev, I'd definitely buy it and add it to my collection.
https://github.com/churchofthought/HexagonalComplexAutomata
Or in WebGL:
It’s something I’m dabbling in, but no doubt an order of magnitude more difficult to implement than orthodox chess.
The idea of indexing by cubes is so obvious once you discover it, but maybe not as easy to intuit. Same goes for the data structures.
https://en.wikipedia.org/wiki/Truncated_trihexagonal_tiling#...
Scaleable like a square grid.
12 directions.
It's a great page. It was invaluable to me.
This was for BYU CS 340. If you search those on GitHub you can probably find some students' implementations. The whole class was about working as a group and design patterns.
Thanks for posting it.
I don’t need to do this too often, but I like having choices.