我正在制作一个游戏,其中只有一个空间,玩家可以四处移动。我想用某种多边形来表示这个空间。我要问的主要问题是它是否包含给定点。 (如rect.intersect()
)
XNA有没有办法做到这一点?
答案 0 :(得分:8)
没有。 (至少不包括版本3)
XNA具有绑定卷,例如 frustums 或 box ,但它没有多边形的概念。
可以找到一种使用XNA在多边形中执行点的简单,快速且有效的方法here。我最近实现了这个并且很棒。
你知道对象的关键点,你需要做的就是创建一个围绕这个对象的多边形 - 使用向量将是最好和最简单的方法。然后执行多边形检查中的点。
以下是我的实施示例代码。使用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;
}
多边形类可以非常容易地存储一组矢量,但我引入了一个线类,因为其他地方需要线。
答案 1 :(得分: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;
}
}
}