Pregunta

I tiene un conjunto de puntos, elaborado por el usuario. Serán dibujando alrededor de algunos objetos.

Necesito convertir de alguna manera este conjunto de puntos en una forma, por lo que puedo encontrar el área para detectar colisiones.

Una imagen aclarará:

Conjunto de puntos representa como forma http://www.imagechicken.com/uploads/1277188630025178800 .jpg .

La mejor idea que he tenido hasta ahora implica iterar sobre cada píxel para determinar si se trata de 'dentro' o 'fuera' de la forma, pero eso sería terriblemente lento, y ni siquiera estoy seguro de cómo hacer la determinación ' dentro '/' fuera' de poco ...

¿Alguna pista? Estoy utilizando .NET (C # y XNA) si eso ayuda me ayudas!

¿Fue útil?

Solución 3

Bueno, tengo que gracias a de trabajo un poco de ayuda en otro foro .

I utiliza la clase GraphicsPath que hacer todo el trabajo duro para mí.

Esto es lo que mi método terminó pareciéndose a:

public bool IsColliding(Vector2 point)
{
    GraphicsPath gp = new GraphicsPath();

    Vector2 prevPoint = points[0];
    for (int i = 1; i < points.Count; i++)
    {
        Vector2 currentPoint = points[i];

        gp.AddLine(prevPoint.X, prevPoint.Y, currentPoint.X, currentPoint.Y);

        prevPoint = currentPoint;
    }
    gp.CloseFigure();   //closing line segment

    return gp.IsVisible(point.X, point.Y);
}

Gracias por sus sugerencias de que ambos

Otros consejos

Se puede pensar en su forma como una unión de varias formas cada uno de los cuales es un polígono cerrado simple.
el cheque para cada objeto si está dentro de cualquiera de los polígonos de la siguiente manera:
Todos los puntos conectados por líneas - Cada línea tiene una ecuación que define
. Para cada objeto - Construir una ecuación para una línea que pasa a través de este objeto
. ahora - para cada ecuación objeto es necesario comprobar el número de líneas (aquellos entre los puntos) se cruza con esta ecuación objeto - pero contar sólo los puntos de intersección que se encuentran en la rabia entre los dos puntos (y no en el resto de la línea de fuera de la dos puntos) y sólo los puntos de intersección que se encuentran en un lado del objeto (escoger un lado -. no importa)
Si el recuento es aún - el objeto está fuera de la forma -. De lo contrario, está dentro

Sólo un precursor de nada de lo que voy a decir, no tengo experiencia en este campo, esto es sólo cómo iba a ir sobre el problema.

A un montón de juegos de táctica utilizar para esto se conoce como cajas de Hit. Es mucho más fácil detectar si un punto está dentro de un cuadrado que cualquier otra figura. Pero esto no le da una colisión exacta, podría ser justo delante de su objeto deseado.

he visto Collision 'Bubbles' usado antes. Aquí es un enlace que he encontrado para ti. Esto explica el uso de colisión burbujas en los juegos de consola Super Smash Brothers.

Dado un punto, la fórmula de la distancia, y un radio, se puede implementar fácilmente burbujas de colisión.

Para llevarlo aún un paso hacia adelante, hice un poco de investigación, vi un algoritmo poco ingenioso (más avanzada que la parte superior dos sugerencias), el "algoritmo de detección de Gilbert-Johnson-Keerthi colisión de objetos convexos." Aquí es un enlace para ti. La implementación proporcionada está escrito en D. Si su trabajo en C # no debe ser demasiado difícil de traducir (te sugeriría altamente digerir el algoritmo también).

Espero que esto le da una cierta dirección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top