从交错的等距网格上的坐标获取瓦片

时间:2018-01-29 17:53:58

标签: c# 2d grid-layout isometric staggeredgridlayout

我无法弄清楚数学。我有一个交错的2d等距网格,将网格单元转换为世界坐标没有问题,但现在我无法弄清楚如何扭转这个过程。

这是CellToCoord方法:

public static Vector2 CellToCoord(int x, int y) {
    return new Vector2() {
        x = x + ((y % 2) * 0.5f),
        y = y * -0.25f
    };
}

非常简单,并且显示网格与i wanted it to be完全相同,我想现在从世界坐标中获取图块。

编辑:
Image,我从CellToCoord()方法获得的世界坐标给出了一个代表细胞中心的世界位置。

1 个答案:

答案 0 :(得分:0)

public static Point CoordToCell(Vector2 coord) {
    // Divide the cell coordinate the value again (or multiply by -4)
    // Then Math.Round() to eliminate any floating point inaccuracies
    var cellY = (int)Math.Round(coord.y / -0.25f);

    // Armed with the original Integer Y, we can undo the mutation of X (again, accounting for floating point inaccuracies)
    var cellX = (int)Math.Round(coord.x - ((cellY % 2) * 0.5f));

    return new Point() {
        x = cellX,
        y = cellY
    };
}

这应该扭转这个过程。我已经使用Point作为整数X和Y坐标的通用容器,您可以根据需要替换它。

我认为最大的问题是X变异最初是基于Y的整数值,然后从中存储浮点值。如果没有Math.Round()来强制将浮点结果强制转换回整数值,我无法找到解决此问题的方法。

更新计算包含给定世界坐标的单元格坐标:

看看你的世界坐标是如何排列的,我们可以看到每个单元格的中心位于以下对角线上:

  • y =(x - i)/ 2 ...或... x - 2y = i
  • y =(j - x)/ 2 ... 或者...... x + 2y = j

其中i和j是整数。此图表显示了x - 2y = i diagonals。

Diagram showing diagonal coordinates

使用这些,我们可以取一个给定点的世界坐标,计算出i和j,然后将它们四舍五入到最接近的整数,得到单元格的中心为i和j。

然后我们可以使用i和j来计算单元格中心的x和y,并使用我之前发布的函数将它们转换回单元格坐标。

public static Point CoordToCell(Vector2 coord)
{
    // Work out the diagonal i and j coordinates of the point.
    // i and j are in a diagonal coordinate system that allows us
    // to round them to get the centre of the cell.
    var i = Math.Round( coord.x - coord.y * 2 );
    var j = Math.Round( coord.x + coord.y * 2 );

    // With the i and j coordinates of the centre of the cell,
    // convert these back into the world coordinates of the centre
    var centreX = ( i + j ) / 2;
    var centreY = ( j - i ) / 4;

    // Now convert these centre world coordinates back into the
    // cell coordinates
    int cellY = (int)Math.Round(centreY * -4f);
    int cellX = (int)Math.Round(centreX - ((cellY % 2) * 0.5f));

    return new Point() {
        x = cellX,
        y = cellY
    };
}

我使用以下坐标点作为测试用例

{ x = 1.5f, y = -0.25f } => ( 1, 1 )        // Centre of 1, 1
{ x = 1.9f, y = -0.25f } => ( 1, 1 )        // Near the right of 1, 1
{ x = 1.5f, y = -0.374f } => ( 1, 1 )       // Near the bottom of 1, 1
{ x = 1.1f, y = -0.25f } => ( 1, 1 )        // Near the left of 1, 1
{ x = 1.5f, y = -0.126f } => ( 1, 1 )       // Near the top of 1, 1
{ x = 2.5f, y = -0.25f } => ( 2, 1 )        // Centre of 2, 1
{ x = 2f, y = -0.5f } => ( 2, 2 )           // Centre of 2, 2

希望这有帮助