gpt4 book ai didi

c# - 使用 Vector2 系列创建形状 - XNA

转载 作者:行者123 更新时间:2023-11-30 17:23:04 27 4
gpt4 key购买 nike

在我的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com