我正在写一个等距的平铺游戏。每块瓷砖的宽度是它的两倍(w:h = 2:1)。地图中的所有图块都具有相同的大小,其宽度和高度是已知的(TileWidth和TileHeight)。
可以有任意数量的列(> 0)和行(> 0)。
我正在努力想出一个公式来计算完全绘制的地图的宽度和高度。这需要是从最顶部到最底部以及从最左侧到最右侧的距离。由于列数和行数可以变化(因此地图并不总是完美的钻石),因此证明非常难!
答案 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屏幕坐标,你需要做的是:
从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)