如何计算等距矩形/正方形的高度和宽度

时间:2011-01-06 12:57:43

标签: math drawing trigonometry tiles isometric

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

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

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

5 个答案:

答案 0 :(得分: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 = [沿r轴为+ + 5 * U,沿c轴为+ 3 * U],D2 =沿r轴为+ + 5 * U,沿c轴为-3 * U ],其中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列,且tile长度为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

答案 1 :(得分:2)

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

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

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

编辑:看你的图像,看起来投影不是等距的(至少不是我在学校里学到的),两边的角度都是60度,所以用{{1替换Cos(60) } {} Cos(30)Sin(60)

另一种看待它的方式:

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

答案 2 :(得分: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坐标(投影后)。
  5. 从2减去1,你得到宽度,从4得到3来得到高度。

    这有帮助吗?

答案 3 :(得分:0)

我认为您可以使用Pythagoras' theorem执行此操作:

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

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

答案 4 :(得分:0)