当试图计算两个凸多边形的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);
}
答案 0 :(得分:1)
通常的方法是将凹多边形分解为凸片,并在每个多边形的凸片之间成对迭代以寻找碰撞。如果其中一个多边形太大而无法做到这一点(由100个凸起的peices组成),你可以将每个部分添加到一个宽的阶段。
请注意,如果您正在执行类似GJK的操作,则不会将Minkowski差异明确地构造为多边形。相反,你通过在其上找到沿给定方向最远的“支撑”顶点来隐式地走动它。因为Minkowski的差异是线性可分的,所以你可以单独为每个多边形做这个,然后找出它们的区别。
这个想法可能有点难以理解,但请参见例如:http://www.dyn4j.org/2010/04/gjk-distance-closest-points/