2010-03-04 3 views
3

Dans mon jeu XNA, j'avais besoin de définir une forme irrégulière basée sur plusieurs coordonnées Vector2 dans l'espace 2D. La raison était de faire une vérification de collision (comme Rectangle.Intersects()).Création d'une forme à l'aide de séries de Vector2 - XNA

Par exemple:

Vector2 point1 = new Vector(20,30); 
Vector2 point2 = new Vector(60,30); 
Vector2 point3 = new Vector(60,80); 
Vector2 point4 = new Vector(40,90); 
Vector2 point5 = new Vector(20,80); 

créerait une forme qui a des chemins qui va de point1 ->point2 ->point3 ->point4 ->point5 puis retour à point1.

Cependant, je n'ai pas trouvé de solution appropriée pour l'implémenter. S'il vous plaît aider. Merci.

Répondre

2

Il existe plusieurs approches différentes de ce que vous voulez faire. Vous avez mentionné la détection de collision: voulez-vous déterminer si un point croise la forme, ou voulez-vous déterminer si deux polygones se croisent?

Si vous voulez un point, ce que vous cherchez s'appelle un "point dans un test polygonal". Il existe un certain nombre d'approches différentes, mais l'une des approches les plus rapides et les plus simples est un test de rayon. Vous créez un rayon à partir de votre point et comptez le nombre de fois qu'il traverse les bords. Si le nombre est pair, le point est dehors. Si c'est bizarre, le point est à l'intérieur.

Vous pouvez trouver un bon article sur ce ici: http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

La mise en œuvre du code de l'article ressemble à ceci:

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy) 
{ 
    int i, j, c = 0; 
    for (i = 0, j = nvert-1; i < nvert; j = i++) { 
    if (((verty[i]>testy) != (verty[j]>testy)) && 
    (testx < (vertx[j]-vertx[i]) * (testy-verty[i])/(verty[j]-verty[i]) + vertx[i])) 
     c = !c; 
    } 
    return c; 
} 

Déterminer si deux polygones se croisent est plus complexe, mais pas tout à fait dissemblables. Un grand nombre de jeux vérifient simplement les coins des polygones avec point-in-poly car c'est facile et pas cher, mais il est également possible de vérifier l'intersection complète. Une façon de l'approcher est de traiter chaque arête comme un plan de division/demi-espace. L'intersection des demi-espaces détermine si les deux polygones se croisent.

Essayez de chercher "Théorème de l'axe de séparation".

0

ZiggyWare (anciennement www.ziggyware.com) propose un tutoriel sur la détection de collision de polygones 2D mais il semble que ZW est en train de déménager dans une nouvelle maison. Here's a video cependant, de la façon dont le tutoriel ressemble.