【发布时间】: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。所以我有几个问题:
我是不是把逻辑搞砸了?我应该以不同的方式编写我的 PolygonPolygon 函数吗?
PolygonPolygon 测试有没有更好的方法,多边形本身不能保证是凸的,这就是我选择多边形方法中的点的原因。我也希望确定最终碰撞的点,如果我能通过这一点。
对于 InsidePolygon 测试,我是否应该按特定顺序展示我的观点?
【问题讨论】:
-
您对多边形内点的测试不会检测到多边形重叠,该重叠在任何一个多边形内都没有点(想想两个三角形排列得像大卫之星)。您也可以测试一个多边形的每个边缘与另一个多边形的每个边缘相交,以确保我认为。但听起来好像越来越贵了……
-
您应该将
std::vector <Point> polygon1替换为const std::vector <Point> & polygon1以提高性能。哪些输入数据会给出 1 作为结果? -
@Sam Holder,是的,我已经想到了,在我完成这项工作后,下一步将进行边缘检测测试。 @Alexey Malistov,到目前为止,我输入的任何输入都将导致返回 1。x 和 y 值可以在 -100 到 100 之间的任何位置。感谢您的优化。
标签: c++ 2d collision-detection