【问题标题】:Get the perimeter of a list of verticies获取顶点列表的周长
【发布时间】:2016-10-30 02:18:55
【问题描述】:

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

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

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

【问题讨论】:

  • "Convex hull" 将是一个很好的搜索词...但是您正在寻找定义较少的东西 - 如果您提供更好的解释来说明如何定义一对点是否属于边界,您可能会得到答案在这里或者Computer Science
  • 这就是我想要找到的。我目前没有办法找到一个顶点是在一边,还是在拐角处,或者两者都没有。
  • 你必须盯着图片,弄清楚你在绘制它时使用了什么规则。还可以尝试更多有趣的图片(即用点画字母,而不是为它们找到边框)。届时,您希望能够更好地了解您想要什么,并能够澄清这个问题。
  • 我是这样做的,我想出了对每个顶点进行邻接测试的想法。如果它正好有 2 个邻居,它就是一个角,如果它正好有 3 个邻居,它就是一个边。
  • 请注意,这不是对您如何手动完成此操作的解释...它可能接近解决方案(您显然会发现内角很有趣)。

标签: c# polygon vertices collider


【解决方案1】:

这就是我最终解决问题的方式。每个顶点是四个不同图块的一部分(不包括地图边缘),所以我只是遍历每个顶点并计算有多少邻居是“相同类型的”。如果结果为 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;
}

【讨论】:

    猜你喜欢
    • 2015-09-08
    • 2013-03-21
    • 2019-01-03
    • 2021-04-20
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多