计算六边形运动场的纵横比

Calculate aspect ratio of a hexagonal playing field

我正在将平顶六边形瓷砖网格渲染到 HTML5 canvas 上。放置和拾取工作完美无缺。在任何时候,整个网格都应该是可见的。

为此,我计算了完全包含所有六边形的最小矩形,并使用其高度和宽度来计算 canvas 大小(信箱)。为了计算尺寸,我使用与选择和布置瓷砖相同的坐标并计算:

tile_width = 2                    // 2 * distance center-corner
tile_height = 1.7320508075688772  // sqrt(3) * distance center-corner
horiz_dist = 1.5                  // 3/4 * tile_width


width = 1/4 * tile_width + number_x_tiles * horiz_dist
height = 1/2 * tile_height + number_y_tiles * tile_h
aspect = width/height

但是,显示的图块扭曲了,它们在 x 方向上被拉伸了。我的公式有什么问题吗?测量值是根据 the fantastic redblob games resource 的描述得出的。

我很确定根据纵横比应用 x 和 y 缩放的函数工作正常,因为正交贴图看起来完全符合预期。

从您的 post 来看,您似乎想要一个 平顶 网格。根据您 link、

的信息
tile_width = size * 2 = 2
tile_height = sqrt(3) * size = sqrt(3)/2 * tile_width = sqrt(3)
horiz_dist = (tile_width + size) / 2 = tile_width * 3/4 = 1.5

其中 size = 1 是六边形边的长度。

定义 number_x_tiles 为网格中 odd 列和 even 列的数量,您对网格的计算width 正确:

width = tile_width + (number_x_tiles - 1) * horiz_dist
      = tile_width + (number_x_tiles - 1) * tile_width * 3/4
      = tile_width - tile_width * 3/4 + number_x_tiles * tile_width * 3/4
      = 1/4 * tile_width + number_x_tiles * horiz_dist

所以问题在于计算网格height。你的公式

height = 1/2 * tile_height + number_y_tiles * tile_height
odd 列中的六边形行数与 even 列中的六边形行数相同时,

是正确的(按照惯例,第一列是 even 列,第二列是 odd)。如果不是,则需要确定 odd 列中的六边形行数是否多于 even 列中的六边形行数。因此,逻辑应该是:

if (num_rows_in_odd_column == num_rows_in_even_column)
  height = 1/2 * tile_height + number_y_tiles * tile_height
else
  number_y_tiles  = max(num_rows_in_odd_column, num_rows_in_even_column)
  height = number_y_tiles * tile_height

希望对您有所帮助。