获取顶点列表

时间:2016-10-30 02:18:55

标签: c# polygon vertices collider

我目前正在开发一个关卡编辑器,而且我已经收集了一些我想用来创建多边形对撞机的顶点列表。

我通过将某些瓷砖标记为"碰撞器"来获得这些顶点。并通过算法运行它们以获取连接的切片列表。然后,我从连接的切片列表中创建了一个顶点列表,并删除了所有重复项。

下面是一张有助于解释的图片。所有的点都是目前在我的列表中的顶点,但我想使用红色的点来创建一个多边形。

enter image description here

1 个答案:

答案 0 :(得分:0)

这就是我最终解决问题的方法。每个顶点都是四个不同图块的一部分(排除地图边缘的情况),所以我只是遍历每个顶点并计算了相同类型的#34;#34;。如果结果为4则表示顶点位于多边形中间的某个位置。如果结果为3则表示顶点位于内角。 2意味着它处于优势地位。 1意味着它是一个外角。

private List<Vector2> GetPerimeterOfVerticeList(List<Vector2> vertices, TileType type)
{
    int neighborCount = 0;
    List<Vector2> perimeter = new List<Vector2>();

    //Check the four tiles touching this vertex
    foreach (Vector2 v in vertices)
    {
        //upper left tile
        if (v.x - 1 >= 0 && v.y <= gridHeight - 1 && grid[(int)v.x - 1, (int)v.y].type == type)
        {
            neighborCount++;
        }
        //upper right
        if (v.x <= gridWidth - 1 && v.y <= gridHeight - 1 && grid[(int)v.x, (int)v.y].type == type)
        {
            neighborCount++;
        }
        //bottom right
        if (v.y - 1 >= 0 && v.x <= gridWidth - 1 && grid[(int)v.x, (int)v.y - 1].type == type)
        {
            neighborCount++;
        }
        //bottom left
        if (v.y - 1 >= 0 && v.x - 1 >= 0 && grid[(int)v.x - 1, (int)v.y - 1].type == type)
        {
            neighborCount++;
        }


        //If we have less than 4 neighbors, it means we are on the edge. 3 is an inner corner, 2 is a side piece, 1 is an outer corner
        if (neighborCount < 4)
        {
            perimeter.Add(v);
        }

        //Reset the neighbor count back to 0 for the next vertex check.
        neighborCount = 0;
    }
    return perimeter;
}