Math 如何计算等距矩形/正方形的高度和宽度
我正在写一个等距瓷砖游戏。每个瓷砖的宽度是其高度的两倍(w:h=2:1)。地图中的所有平铺大小相同,其宽度和高度已知(平铺宽度和平铺高度) 可以有任意数量的列(>0)和行(>0)Math 如何计算等距矩形/正方形的高度和宽度,math,drawing,trigonometry,tiles,isometric,Math,Drawing,Trigonometry,Tiles,Isometric,我正在写一个等距瓷砖游戏。每个瓷砖的宽度是其高度的两倍(w:h=2:1)。地图中的所有平铺大小相同,其宽度和高度已知(平铺宽度和平铺高度) 可以有任意数量的列(>0)和行(>0) 我正在努力想出一个公式来计算完全绘制的地图的宽度和高度。这需要是从最顶部到最底部以及从最左侧到最右侧的距离。由于列和行的数量可能会有所不同(因此地图并不总是一个完美的菱形),这证明是非常困难的 为什么不使用如下旋转方程: 假设瓷砖未旋转,因此四个角具有以下坐标: (0, 0, 0) (w, 0, 0) (0, h, 0
我正在努力想出一个公式来计算完全绘制的地图的宽度和高度。这需要是从最顶部到最底部以及从最左侧到最右侧的距离。由于列和行的数量可能会有所不同(因此地图并不总是一个完美的菱形),这证明是非常困难的 为什么不使用如下旋转方程: 假设瓷砖未旋转,因此四个角具有以下坐标:
(0, 0, 0)
(w, 0, 0)
(0, h, 0)
(w, h, 0)
在哪里
现在我假设你有投影矩阵,应用它之后,你得到4个3D点的2D屏幕坐标,你需要做的是:
这有帮助吗?我想你可以通过以下方法来实现:
我的数学不是很好,但h应该是瓷砖一侧的长度,这样你就可以将它乘以瓷砖的数量。等距投影的角度是60度和30度。瓷砖的实际宽度和高度为:
Wiso=TileWidth*Cos(30)+tilewhight*Cos(60)
Hiso=TileWidth*Sin(30)+tilewhight*Sin(60)
现在,您可以将这些数字乘以每行和每列的平铺数,以获得网格的大小
编辑:看你的图像,看起来投影不是等距的(至少不是我在学校学到的),而且角度是两边60度,所以将Cos(60)
替换为Cos(30)
,将Sin(60)
替换为Sin(30)
从另一个角度来看:
Wgrid=TileWidth*Cos(30)*Ncols+TileHeight*Cos(30)*Nrows
Hgrid=TileWidth*Sin(30)*Ncols+TileHeight*Sin(30)*Nrows
好问题!有一个不太明显的答案,但很容易计算:
让我们称行轴“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
如果从底部开始,从左侧向上走,则会将每列的瓷砖高度向上移动一半,然后将每行的瓷砖高度向上移动一半。类似地,如果从左侧开始并沿底部边缘行走,则会向上移动每列平铺宽度的一半,然后向上移动每行宽度的一半
因此,地图的轴对齐边界框的宽度为
(行+列)*平铺宽度/2
,高度为(行+列)*平铺高度/2
等轴测投影不是旋转。对不起,这并不能真正改变解决方案。他可以使用投影矩阵,而不用旋转矩阵,然后进行同样的计算。这很棘手。我想我的角度θ是45度,但我并不真正理解维基百科文章中的矩阵公式。我觉得自己很笨(我的背景不是数学或计算机科学!)。好的,那你能解释一下你的游戏吗?你用什么?游戏引擎?DirectX等。?你是如何定义瓷砖的?这样我可以给你一个具体的答案。这是一个在RealStudio中编写的游戏引擎。瓷砖是png图像。下面是我用来在屏幕上放置平铺的代码:x=column*(Data.TileWidth/2)+(row*(TileWidth/2))+Origin.xy=column*(TileHeight/2)-(row*(TileHeight/2))+Origin.y。其中原点是地图的起点(处理滚动),x和y是实际坐标。这用于计算矩形的宽度和高度(从而计算将地图平分的三角形的斜边),而不是地图的宽度。谢谢。它们不是严格等距的——它们是二维的(宽度是高度的两倍)。
halfWidth = tileWidth / 2;
halfHeight = tileHeight / 2;
h = Math.sqrt((halfWidth * halfWidth ) * (halfHeight * halfHeight));
rowLength = rowSize * h;
colLength = colSize * h;
W = U*(Nr+Nc)*sqrt(3)/2
H = U*(Nr+Nc)/2