在我的 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
。
但是我找不到合适的解决方案来实现它。请帮忙。谢谢。
最佳答案
有几种不同的方法可以实现您想要做的事情。您提到碰撞检测:您是要确定一个点是否与形状相交,还是要确定两个多边形是否相交?
如果你想要一个点,你正在寻找的东西被称为“多边形测试中的点”。有许多不同的方法,但最快和最直接的方法之一是射线测试。您从您的点创建一条射线并计算它穿过边缘的次数。如果数字是偶数,则该点在外面。如果它是奇数,则点在里面。
您可以在这里找到一篇关于此的好文章: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;
}
确定两个多边形是否相交更为复杂,但并非完全不同。许多游戏实际上只是使用 point-in-poly 检查多边形的角,因为它既简单又便宜,但也可以检查完整的交叉点。
您可以采用的一种方法是将每条边视为分割平面/半空间。半空间的交集决定了两个多边形是否相交。
尝试搜索“分离轴定理”。
关于c# - 使用 Vector2 系列创建形状 - XNA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2378010/