8

我正在制作一款游戏,玩家只能在一定的空间内移动。我想用某种多边形来表示这个空间。我要问的主要问题是它是否包含给定的点。(喜欢rect.intersect()

XNA 有没有办法做到这一点?

4

2 回答 2

8

不。(至少没有更新,至少包括第 3 版)

XNA 具有诸如平截头体或盒子之类的边界体,但它没有多边形的概念。

可以找到一种使用 XNA 在多边形中执行点的简单、快速和有效的方法这里. 我最近实现了这个,它非常好。

您知道对象的点,您需要做的就是围绕该对象创建一个多边形 - 使用矢量将是最好和最简单的方法。然后执行多边形检查中的点。

这是我的实现的示例代码。使用 XNA 中的默认点类。Polygon 是一个简单的类,它包含构成多边形的向量集合。

/// <summary>
/// Point in polygon check.
/// </summary>
/// <param name="point">The point.</param>
/// <param name="polygon">The polygon.</param>
/// <returns>True if point is inside, false otherwise.</returns>
/// <see cref="http://local.wasp.uwa.edu.au/~pbourke/geometry/insidepoly/"/>
public bool PointInPolygon(Point point, Polygon polygon) {

       bool inside = false;

       foreach (var side in polygon.Lines) {
            if (point.Y > Math.Min(side.Start.Y, side.End.Y))
                if (point.Y <= Math.Max(side.Start.Y, side.End.Y))
                    if (point.X <= Math.Max(side.Start.X, side.End.X)) {
                        float xIntersection = side.Start.X + ((point.Y - side.Start.Y) / (side.End.Y - side.Start.Y)) * (side.End.X - side.Start.X);
                        if (point.X <= xIntersection)
                            inside = !inside;

       }

       return inside;
}

Polgyon 类非常基础,采用半伪形式:

class Polygon 
{
    public List<Line> Lines { get; set; }
}

public class Line   
{
    public Vector2 Start;
    public Vector2 End;
}

多边形类可以很容易地存储向量的集合,但是我引入了一个线类,因为其他地方需要线。

于 2010-03-04T14:20:03.750 回答
1

将 foreach 循环修改为以下内容以处理所有多边形形状:

       foreach (var side in Lines) {
            if (point.Y > Math.Min(side.Start.Y, side.End.Y))
                if (point.Y <= Math.Max(side.Start.Y, side.End.Y))
                    if (point.X <= Math.Max(side.Start.X, side.End.X)) {
                        if (side.Start.Y != side.End.Y) {
                            float xIntersection = (point.Y - side.Start.Y) * (side.End.X - side.Start.X) / (side.End.Y - side.Start.Y) + side.Start.X;
                            if (side.Start.X == side.End.X || point.X <= xIntersection)
                                result = !result;
                        }
                    }
        }
于 2012-09-17T23:22:02.273 回答