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

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

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

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


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

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

假设瓷砖未旋转,因此四个角具有以下坐标:

(0, 0, 0)
(w, 0, 0)
(0, h, 0)
(w, h, 0)
在哪里

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

  • 获取所有点的最小x坐标(投影后)
  • 获取所有点的最大x坐标(投影后)
  • 获取所有点的最小y坐标(投影后)
  • 获取所有点的最大y坐标(投影后)
  • 从2中减去1得到宽度,从4中减去3得到高度


    这有帮助吗?

    我想你可以通过以下方法来实现:


    我的数学不是很好,但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