Collision de détection de forme personnalisée esquissée, représentée sous forme de liste de points

StackOverflow https://stackoverflow.com/questions/3090536

Question

J'ai un ensemble de points, tiré par l'utilisateur. Ils tirerez autour de certains objets.

Je dois tourner en quelque sorte cet ensemble de points en une forme, donc je peux trouver la zone pour détecter les collisions.

Une image de clarifiera:

ensemble de points représenté comme forme http://www.imagechicken.com/uploads/1277188630025178800 .jpg .

La meilleure idée que j'ai eu tellement itérer va bien au-dessus de chaque pixel de déterminer si elle est « l'intérieur » ou «en dehors de la forme, mais ce serait horriblement lent, et je ne suis même pas sûr de savoir comment faire la détermination" à l'intérieur bit '/' extérieur » ...

Les conseils? J'utilise .NET (C # et XNA) si cela vous aide me aider!

Était-ce utile?

La solution 3

Eh bien, je l'ai eu de travail grâce à aide sur un autre forum .

J'utilisé la classe GraphicsPath pour faire tout le travail pour moi.

est ce que ma méthode a fini par ressembler à:

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

Merci pour vos suggestions vous deux

Autres conseils

Vous pouvez penser à votre forme comme une union de plusieurs formes dont chacune est un simple polygone fermé.
la vérification pour chaque objet si elle est à l'intérieur un des polygones de la manière suivante:
Tous les points reliés par des lignes - Chaque ligne a une équation définissant
. Pour chaque objet - construire une équation pour une ligne passant par cet objet
. maintenant - pour chaque équation d'objet, vous devez vérifier le nombre de lignes (celles entre les points) coupe cette équation d'objet - mais ne compter que les points d'intersection qui sont rage entre les deux points (et non dans le reste de la ligne en dehors de la deux points) et seuls les points d'intersection qui sont d'un côté de l'objet (choisir un côté -. peu importe)
Si le nombre est encore - l'objet est en dehors de la forme -. Sinon il est à l'intérieur

Juste un précurseur de tout ce que je vais dire, je n'ai aucune expérience dans ce domaine, c'est à quel point j'aller sur le problème.

Beaucoup d'une tactique de jeux utiliser pour cela est connu sous le nom des boîtes Hit. Il est beaucoup plus facile de détecter si un point est à l'intérieur d'un carré que tout autre chiffre. Mais cela ne vous donne pas une collision exacte, il pourrait être juste devant votre objet désiré.

J'ai vu « Bulles » Collision utilisé avant. est un lien que j'ai trouvé pour vous. Ceci explique l'utilisation de bulles Collision dans le jeu de la console Super Smash Brothers.

Etant donné un point, la formule de la distance, et un rayon, vous pouvez facilement mettre en œuvre des bulles de collision.

Pour prendre encore un pas en avant, je l'ai fait un peu de recherche, j'ai vu un chouette petit algorithme (plus avancé que les deux principaux suggestions), le « algorithme de collision Gilbert-Johnson-Keerthi détection des objets convexes. » est un lien pour toi. La mise en œuvre prévue est écrit dans D. Si votre travail en C # il ne devrait pas être trop difficile à traduire (je suggère fortement à digérer l'algorithme trop).

Espérons que cela vous donne une certaine direction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top