找到x,y坐标列表的{Bounds'

时间:2018-03-01 16:11:34

标签: c# unity3d

我正试图找出一种快速而有效的方法来解决这个问题,但我正在努力解决这个问题。

我有一个对象'Tile',它包含坐标(x,y)。然后我得到一个形成一个形状的对象列表。一个简单的例子就是一个矩形。但它可能是一个更复杂的形状。这些形状代表一个'房间'

我需要的是能够获得构成房间外边缘的所有边界瓷砖对象的列表。然后我会用它在房间周围创建一堵墙。

我确信有一种简单的数学方法可以做到这一点,但我不能为我的生活想到它。

编辑:

我想我很难解释这个:

看看新的两点医院视频 https://youtu.be/--N_eQMtTB0?t=79

你可以看到他们拖出一个房间(放置物品等等)然后当它们完成时会在那个房间周围形成墙壁。

这就是我想在2D游戏中实现的目标。如果您想象该视频中地板上的每个正方形都是一个图块,从0,0开始运行到多个图块(每个图块是一个坐标)

我只是想拿一个属于房间的瓷砖列表,找到外面的瓷砖,这样我就可以自动在这些瓷砖上生成墙。

2 个答案:

答案 0 :(得分:2)

与我的其他解决方案不同且可能更简单的解决方案是简单地检查每个瓷砖,如果其他任何一侧不存在另一个瓷砖,则您知道它位于边界上。该解决方案适用于任何形状。

伪代码:

MakeList()
{
    foreach tile in tilelist
       if no tile at tile.x + 1
       or no tile at tile.x - 1
       or no tile at tile.y + 1
       or no tile at tile.y - 1
          add tile to Boundarylist
}

答案 1 :(得分:1)

一种解决方案的一般方法是检查切片网格中的每一行和每列,并返回具有最小y和x值的切片。一般步骤是。

  1. 获取所有x坐标的列表。
  2. 将每个x坐标中y值最小的切片添加到Boundarylist。
  3. 将每个x坐标中y值最大的图块添加到边界列表中(如果列表中尚未存在)
  4. 获取所有y坐标的列表。
  5. 重复步骤2和3,将最小和最大的x坐标添加到边界列表中(如果不是重复的话)。
  6. 一些伪代码:

    void MakeList()
    {
       foreach tile in tilelist
          if xcoordlist does not contain tile.xcoord
             add xcoord
          if ycoordlist does not contain tile.ycoord
             add ycoord
    
       foreach xcoord in xcoordlist
          foreach tile in tilelist where tile.xcoord == xcoord
             add tile with max and min y to Boundarylist
    
       foreach ycoord in ycoordlist
          foreach tile in tilelist where tile.ycoord == ycoord
             add tile with max and min x to Boundarylist
    }