2010-03-04 16 views
8

Estoy haciendo un juego donde solo hay un cierto espacio donde el jugador puede moverse. Quiero representar este espacio con un polígono de algún tipo. La pregunta principal que le haré es si contiene un punto dado. (Como rect.intersect())¿XNA tiene un polígono, como un rectángulo?

¿XNA tiene alguna forma de hacerlo?

Respuesta

8

No. (no hacia arriba y incluyendo la versión 3 al menos)

XNA ha delimita volúmenes tales como troncos o cajas pero no tiene noción de polígonos.

Se puede encontrar una forma simple, rápida y efectiva de realizar un punto en el polígono con XNA here. Recientemente implementé esto y fue excelente.

Conoces el punto de tu objeto, todo lo que necesitas hacer es crear un polígono que rodee este objeto, usar vectores sería el mejor y más fácil método. A continuación, realice el punto en la verificación de polígono.

Aquí está el código de ejemplo de mi implementación. Se usa la clase de punto predeterminada en XNA. Polygon es una clase simple que contiene una colección de vectores que forman el polígono.

/// <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; 
} 

La clase Polgyon es muy básico, en seudo forma semi:

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

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

La clase polígono podría muy fácilmente sólo almacenar una colección de vectores, pero introduce una clase de línea que se requerían líneas en otra parte .

+0

Este código se basa en ese artículo, excepto que utiliza C#. Además, se ha modificado mucho. Debo añadir, para entender este código. Google * "Point in Polygon" * con fundición de rayos. Esto explicará más la teoría. Wikipedia tiene un buen artículo sobre esto también. – Finglas

+0

¿Puedo ver el código de su clase de polígono? Parece difícil de creer que XNA carece de esto. –

+0

He pasado mucho tiempo las últimas semanas escribiendo mi propio punto en funciones de polígono. Probando los mejores métodos, etc. El método de lanzamiento de rayos parece ser no solo el mejor, sino el mejor para implementar. En cuanto a XNA que carecen de esta funcionalidad, sí, puede parecer un poco difícil de creer, pero la mayoría de los marcos carecen de algún tipo de punto en la detección de polígonos. – Finglas

1

modificado el bucle foreach a la siguiente para manejar todas las formas de polígono:

 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; 
         } 
        } 
     } 
Cuestiones relacionadas