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

C++ 多边形到多边形碰撞检测问题,c++,2d,collision-detection,C++,2d,Collision Detection,我在实现窄相位碰撞检测时遇到了一些问题。Broadphase工作正常 我有一组多边形,它们有一个stl::向量数组,按顺时针顺序排列顶点。每次循环,我都会检查它们是否相撞 我借用了以下多边形中的点测试,并使用我的点数据结构对其进行了更改: int InsidePolygon(std::vector <Point> poly, Point p) { int i, j, c = 0; int nvert = poly.size(); for (i = 0, j = nver

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

我有一组多边形,它们有一个stl::向量数组,按顺时针顺序排列顶点。每次循环,我都会检查它们是否相撞

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

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函数,它检查一个多边形的所有点与另一个多边形的所有点,然后将其反转以检查另一个多边形

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;

}
奇怪的是,我的多边形函数总是返回1。所以我有几个问题:

我把逻辑搞砸了吗?我应该以不同的方式编写多边形函数吗

有没有更好的多边形测试方法,多边形本身不能保证是凸的,这就是为什么我选择多边形中的点方法。我也希望确定哪一点最终会发生碰撞,如果我能越过这一点的话

我应该按照特定的顺序为InsidePolygon测试陈述我的观点吗

您可能想考虑作为另一种碰撞检测方法。< /P> [编辑]哎呀,我错过了你也有非凸多边形的事实。也许会更好?或者你可以先把非凸多边形分解成凸多边形


另外,这里至少有StackOverflow。

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


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

多边形内部点的测试不会检测到多边形重叠,多边形内部没有点,就像两个三角形排列得像大卫之星一样。您可以测试一个多边形的每条边与另一个多边形的每条边相交,以确保我认为。但这听起来似乎越来越贵了……您应该用const std::vector&polygon1替换std::vector polygon1以提高性能。什么样的输入数据会给出1作为结果?@Sam Holder,是的,我已经想到了这一点,在我完成这一点后,下一个议程就是边缘检测测试@Alexey Malistov,到目前为止我输入的任何信息都会返回1。x和y值可以在-100到100之间的任意位置。谢谢你的优化。我想做一个中间步骤,把它们分成凸的,我已经看了分离轴定理,但我不太理解它。@Cetra SAT并不难,我以前也见过它,但非凸的部分仍然是个问题。