多边形到多边形碰撞检测问题

时间:2010-06-22 12:40:57

标签: c++ 2d collision-detection

我在实现窄相位碰撞检测时遇到了一些问题。 Broadphase工作得很好。

我有一组多边形,它们的顶点按顺时针顺序有一个stl :: vector数组点。每个周期,我都会检查它们是否发生碰撞。

我从here借用了多边形测试中的以下Point,并使用我的Point数据结构对其进行了更改:

int InsidePolygon(std::vector <Point> poly, Point p) {
  int i, j, c = 0;
  int nvert = poly.size();

  for (i = 0, j = nvert-1; i < nvert; j = i++) {

    if ( ((poly[i].y> p.y) != (poly[j].y> p.y)) && (p.x < (poly[j].x-poly[i].x) * (p.y-poly[i].y) / (poly[j].y-poly[i].y) + poly[i].x) )
       c = !c;

  }
  return c;
}

我已将其扩展为包含一个PolygonPolygon函数,该函数检查1个多边形的所有点与另一个多边形,然后将其反转以检查相反的方式。

int PolygonPolygon(std::vector <Point> polygon1, std::vector <Point> polygon2) {

    for(int i=0; i<polygon1.size();i++) {    
     if(InsidePolygon(polygon2, polygon1[i])) {
         return 1;
     }
    }
    for(int j=0; j<polygon2.size();j++) {       
     if(InsidePolygon(polygon1, polygon2[j])) {
         return 1;
     }
    }

  return 0;

}

奇怪的是我的PolygonPolygon函数总是返回1.所以我有几个问题:

  1. 我搞砸了某个地方的逻辑吗?我应该以不同的方式编写PolygonPolygon函数吗?

  2. 对于PolygonPolygon测试是否有更好的方法,多边形本身不保证是凸的,这就是我在多边形方法中寻找点的原因。我也希望确定哪一点最终会发生冲突,如果我能够超越这一点。

  3. 我应该按照InsidePolygon测试的特定顺序展示我的观点吗?

2 个答案:

答案 0 :(得分:2)

您可能需要将trying to draw a line between polygons视为替代碰撞检测方法。

[edit] 哎呀,我错过了你也有非凸多边形的事实。也许“Determining if a point lies on the interior of a polygon”会更好吗?或者你可以先将非凸多边形破坏成凸多边形。

此外,StackOverflow上至少有one similar question

答案 1 :(得分:-3)

感谢您的帮助!但我已经设法自己解决了。

将顶点平移到世界空间并旋转它们的重要性不应该被忽视,特别是如果你碰撞它们的话。