7

我正在写一个等距瓷砖游戏。每块瓷砖的宽度是高度的两倍(w:h = 2:1)。地图中的所有图块大小相同,并且它们的宽度和高度是已知的(TileWidth 和 TileHeight)。

可以有任意数量的列 (>0) 和行 (>0)。

我正在努力想出一个公式来计算完全绘制的地图的宽度和高度。这需要是从最顶部到最底部以及从极左到极右的距离。由于列数和行数可以变化(因此地图并不总是完美的菱形),事实证明这非常困难!

4

5 回答 5

5

好问题!有一个不太明显的答案,但很容易计算:

让我们称行轴“r”和列轴“c”,并考虑第一张图,其中沿 r 轴的范围为 5,沿 c 轴的范围为 3。

相对于绘图平面,沿 r 轴的单位增量为角度 +30 = (cos 30°, sin 30°) = (sqrt(3)/2, 0.5),沿 c 轴的单位增量为在 -30 = (cos 30°, -sin 30°) = (sqrt(3)/2, -0.5)。

您需要考虑等距矩形的两条对角线。在第一张图片中,这些对角线是 D1 = [+5*U 沿 r 轴,+3*U 沿 c 轴] 和 D2 = [+5*U 沿 r 轴,-3*U 沿 c 轴],其中 U 是等轴测平面中的瓷砖长度。当转换到绘图平面时,变为 D1 = ((5+3)*sqrt(3)/2*U, (5-3)/2*U) = (4*sqrt(3)*U, 1* U) 和 D2 = ((5-3)*sqrt(3)/2*U, (5+3)/2*U) = (sqrt(3)*U, 4*U)。因此,屏幕宽度和高度是两个范围中的最大值 = 4*sqrt(3)*U, 4*U。

这可以概括为:如果有 Nr 行 Nc 列,并且瓦片长度为 U,则矩形的对角线在绘图平面中的范围为 D1 = ((Nr+Nc)*sqrt(3)/2* U, (Nr-Nc)/2*U) 和 D2 = ((Nr-Nc)*sqrt(3)/2*U, (Nr+Nc)/2*U),因此屏幕宽度和高度, 是:

W = U*(Nr+Nc)*sqrt(3)/2
H = U*(Nr+Nc)/2
于 2011-01-06T14:46:38.777 回答
2

等轴测投影的角度为 60 度和 30 度。瓷砖的实际宽度和高度将是:

Wiso = TileWidth * Cos(30) + TileHeight * Cos(60)
Hiso = TileWidth * Sin(30) + TileHeight * Sin(60)

现在,您可以将这些数字乘以每行和每列的图块数来获得网格的大小。

编辑:看着你的图像,投影似乎不是等距的(至少不是我在学校学到的),并且两边的角度都是 60 度,所以替换Cos(60)withCos(30)和 the Sin(60)withSin(30)

另一种看待它的方式:

Wgrid = TileWidth * Cos(30) * Ncols + TileHeight * Cos(30) * Nrows
Hgrid = TileWidth * Sin(30) * Ncols + TileHeight * Sin(30) * Nrows

于 2011-01-06T14:23:31.287 回答
2

如果您从底部开始向左侧走,则每列向上移动一半高度,然后每行向上移动一半高度。同样,如果您从左侧开始沿着底部边缘走,则每列向上移动一半的平铺宽度,然后每行移动一半的宽度。

所以地图的轴对齐边界框的宽度是(rows+columns)*TileWidth/2,高度是(rows+columns)*TileHeight/2

于 2011-01-06T18:14:01.790 回答
0

为什么不使用如下旋转方程:

假设瓦片没有旋转,那么四个角的坐标如下:

(0, 0, 0)
(w, 0, 0)
(0, h, 0)
(w, h, 0)

在哪里

w = Number of Columns * Tile Width
h = Number of Rows * Tile Height

现在我假设你有投影矩阵,所以在应用它之后,你得到了 4 个 3D 点的 2D 屏幕坐标,你需要做的是:

  1. 获取所有点的最小 x 坐标(投影后)。
  2. 获取所有点的最大 x 坐标(投影后)。
  3. 获取所有点的最小 y 坐标(投影后)。
  4. 获取所有点的最大 y 坐标(投影后)。

从 2 中减去 1 得到宽度,从 4 中减去 3 得到高度。

这有帮助吗?

于 2011-01-06T13:06:33.490 回答
0

我认为你可以用毕达哥拉斯定理做到这一点:

halfWidth = tileWidth / 2;
halfHeight = tileHeight / 2;
h = Math.sqrt((halfWidth * halfWidth ) * (halfHeight * halfHeight));
rowLength = rowSize * h;
colLength = colSize * h;

我的数学不是很好,但h应该是瓷砖一侧的长度,这样你就可以将它乘以瓷砖的数量。

于 2011-01-06T13:29:31.383 回答