Minkowski与凹多边形的区别

时间:2016-12-06 16:25:05

标签: c# collision-detection computational-geometry

当试图计算两个凸多边形的Minkowski差异时,我可以简单地找到顶点集并使用礼品包装算法来找到凸包。 (见下文。)

然而,对于凹多边形,凸包算法并不合适,因为它会在碰撞中给出误报,有没有一种方法可以调整我的代码,以便使用已经生成的点轻松找到正确的扩展?

public List<Vector2D> MinkowskiDifference(Polygon other)
{
   List<Vector2D> vList = new List<Vector2D>();

   foreach (Vector2D vT in this.vertices)
   {
        foreach (Vector2D vO in other.vertices)
        {
            vList.Add((vT+this.position) - (vO+other.position));
        }
   }
   return vList;
}

public static Polygon ConvexHull(List<Vector2D> vList)
{
    List<Vector2D> S = vList;
    List<Vector2D> P = new List<Vector2D>();
    Vector2D endpoint;

    Vector2D pointOnHull = LeftMostPoint(S);
    int i = 0;
    do
    {
        P.Add(pointOnHull);
        endpoint = S[0];
        for (int j = 1; j < S.Count; j++)
        {
            if (endpoint == pointOnHull || RelPosition(P[i], endpoint, S[j]) == -1)
            {
                    endpoint = S[j];
            }
        }
        i++;
        pointOnHull = endpoint;
    } while (endpoint != P[0]);
    return new Polygon(P);
}

enter image description here

1 个答案:

答案 0 :(得分:1)

通常的方法是将凹多边形分解为凸片,并在每个多边形的凸片之间成对迭代以寻找碰撞。如果其中一个多边形太大而无法做到这一点(由100个凸起的peices组成),你可以将每个部分添加到一个宽的阶段。

请注意,如果您正在执行类似GJK的操作,则不会将Minkowski差异明确地构造为多边形。相反,你通过在其上找到沿给定方向最远的“支撑”顶点来隐式地走动它。因为Minkowski的差异是线性可分的,所以你可以单独为每个多边形做这个,然后找出它们的区别。

这个想法可能有点难以理解,但请参见例如:http://www.dyn4j.org/2010/04/gjk-distance-closest-points/