3

在我的 XNA 游戏中,我需要根据 2D 空间中的多个 Vector2 坐标定义一个不规则形状。原因是进行碰撞检查(如Rectangle.Intersects())。

例如:

Vector2 point1 = new Vector(20,30);
Vector2 point2 = new Vector(60,30);
Vector2 point3 = new Vector(60,80);
Vector2 point4 = new Vector(40,90);
Vector2 point5 = new Vector(20,80);

将创建一个形状,其路径从point1-> point2-> point3-> point4->point5然后返回point1.

但是我找不到合适的解决方案来实现这一点。请帮忙。谢谢。

4

2 回答 2

2

您想要做的事情有几种不同的方法。你提到了碰撞检测:你想确定一个点是否与形状相交,还是你想确定两个多边形是否相交?

如果您想要一个点,您正在寻找的东西称为“多边形测试中的点”。有许多不同的方法,但最快和最直接的方法之一是射线测试。您从您的点创建一条射线并计算它穿过边缘的次数。如果数字是偶数,则该点在外面。如果它很奇怪,那么重点就在里面。

你可以在这里找到一篇很好的文章:http: //www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

文章中的代码实现如下所示:

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
  int i, j, c = 0;
  for (i = 0, j = nvert-1; i < nvert; j = i++) {
    if ( ((verty[i]>testy) != (verty[j]>testy)) &&
     (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
       c = !c;
  }
  return c;
}

确定两个多边形是否相交更为复杂,但并非完全不同。很多游戏实际上只是检查多边形的角点,因为它既简单又便宜,但也可以检查完整的交叉点。

您可以接近它的一种方法是将每个边缘视为分割平面/半空间。半空间的交点决定了两个多边形是否相交。

尝试搜索“分离轴定理”。

于 2010-03-04T10:44:39.313 回答
0

ZiggyWare(以前的 www.ziggyware.com)有一个关于 2D 多边形碰撞检测的教程,但 ZW 似乎正在搬到新家。不过,这里有一个视频,说明教程的外观。

于 2010-03-04T10:22:22.683 回答