【问题标题】:Polygon to Polygon Collision Detection Issue多边形到多边形碰撞检测问题
【发布时间】:2010-06-22 12:40:57
【问题描述】:

我在实施窄相碰撞检测时遇到了一些问题。 Broadphase 运行良好。

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

我从 here 借用了以下 Point in Polygon 测试,并使用我的 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 测试,我是否应该按特定顺序展示我的观点?

【问题讨论】:

  • 您对多边形内点的测试不会检测到多边形重叠,该重叠在任何一个多边形内都没有点(想想两个三角形排列得像大卫之星)。您也可以测试一个多边形的每个边缘与另一个多边形的每个边缘相交,以确保我认为。但听起来好像越来越贵了……
  • 您应该将std::vector &lt;Point&gt; polygon1 替换为const std::vector &lt;Point&gt; &amp; polygon1 以提高性能。哪些输入数据会给出 1 作为结果?
  • @Sam Holder,是的,我已经想到了,在我完成这项工作后,下一步将进行边缘检测测试。 @Alexey Malistov,到目前为止,我输入的任何输入都将导致返回 1。x 和 y 值可以在 -100 到 100 之间的任何位置。感谢您的优化。

标签: c++ 2d collision-detection


【解决方案1】:

您可能需要考虑将trying to draw a line between polygons 作为另一种碰撞检测方法。

[edit] 糟糕,我错过了你也有非凸多边形的事实。也许“Determining if a point lies on the interior of a polygon”会更好?要么这样,要么您可以先将非凸多边形分解为凸多边形。

另外,StackOverflow 上至少有 one similar question。

【讨论】:

  • 我正在考虑做一个中间步骤并将它们分成凸面,我看过分离轴定理,但我不太了解。
  • @Cetra SAT 并不难,我之前在 SO 上见过它——但非凸位仍然是一个问题。
【解决方案2】:

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

不应忽视将顶点转换到世界空间并旋转它们的重要性,尤其是在碰撞它们时。

【讨论】:

    猜你喜欢
    • 2015-07-24
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多