XNA имеет Полигон, как Прямоугольник?

Я делаю игру, где существует только определенное пространство, которое может переместить плеер. Я хочу представить это пространство с каким-то полигоном. Основной вопрос, который я задал бы его, состоит в том, содержит ли это данную точку. (Как rect.intersect())

XNA имеет какой-либо способ сделать это?

8
задан Nick Heiner 4 March 2010 в 14:07
поделиться

1 ответ

Нет. (По крайней мере, до версии 3 включительно)

В XNA есть ограничивающие объемы, такие как frustums или boxes, но нет понятия полигонов.

Простой, быстрый и эффективный способ выполнения point in polygon в 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;
}

Класс polygon мог бы очень легко хранить просто коллекцию векторов, но я ввел класс линии, так как линии были необходимы в другом месте.

8
ответ дан 5 December 2019 в 18:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: