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

标签 c# vector xna shapes

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

相关文章:

c++ - 默认 vector 内存大小

c# - 适用于 WP7 的 XNA 高速平滑动画

c# - XNA/MonoGame的音效和音乐减慢了我的游戏速度

c# - 创建具有频率的汽车声音

c# - 为什么我的用户控件会导致 Visual Studio 崩溃?

c# - List<T> orderby 的动态链接

javascript - 单独定义服务和工厂时,Angular 不起作用

c++ - 创建链接 vector 和列表

python - numpy中一维数组的乘法

c# - .NET 安全机制限制同一项目中两种类型之间的访问?