2010-10-04 10 views
2

J'ai passé beaucoup de temps à faire fonctionner correctement les intersections entre différentes formes 2D (cercle-cercle, cercle-tri, cercle-rect, rect-rect - un grand merci à ceux qui ont résolu de tels problèmes dont j'ai tiré mes solutions) pour un projet simple et je suis en train d'essayer de mettre en œuvre un test d'intersection triangle-AABB.Test de collision entre un triangle et un rectangle (AABB) en 2D

Je suis un peu coincé cependant. J'ai essayé de faire des recherches en ligne et d'y réfléchir, mais je n'ai pas pu trouver d'idées. La chose qui m'a donné le plus gros problème à l'heure actuelle est de vérifier si les bords du triangle (qui est un bsw isocèle) intersectent le rectangle quand aucun sommet ne se trouve dans le rectangle.

Des idées comment je pourrais obtenir ce travail?

EDIT: Pour donner un peu plus de perspicacité pour les étapes que je pense qu'ils devraient se produire:

1 - Vérifiez si les vertex se trouvent dans le rectangle avec (cette partie est facile). Si oui, collision, sinon continuez.

2 - Vérifiez si des arêtes coupent le rectangle. C'est là que je suis coincé. Je n'ai aucune idée de comment mettre en œuvre cela.

+0

Vérifiez si l'un des sommets des rectangles est dans le triangle. avec cela je pense que vous pourriez même le faire avec des boîtes non-AA – akaltar

Répondre

1

Je calculais une collection d'équations qui définissaient les 4 lignes du rectangle, puis résolvais une collection d'équations qui définissaient les lignes du triangle. Par exemple, un rectangle avec le point le plus bas (x1, y1) et un côté ayant un gradient de g, l'une des lignes du rectangle sera y = gx + y1. Trouver des équations pour représenter les 3 autres côtés du rectangle.

Les lignes qui forment les côtés du triangle seront calculées de la même manière. L'équation pour une ligne donnée deux points est

y - y1 = (x - x1) * (y2 - y1)/(x2 - x1) 

S'il y a des possibles x & valeurs y que satisy toutes les équations 7 alors vous avez une intersection. Edit: Je réalise que bien que ce soit un algorithme simple, il peut être difficile à coder; Une autre option consiste à calculer des formules pour les intervalles qui forment chaque arête (essentiellement des lignes avec une valeur min et max) et de les résoudre.

+0

Le rectangle est aligné sur l'axe (c'est-à-dire qu'il ne sera jamais pivoté). Cela simplifierait-il quelque chose? – NRaf

+0

Oui - cela signifie que les formules pour les côtés du rectangle seraient extrêmement simples, par ex. x> 5 et x < 10, y > 10 et y <20. Tout ce que vous devez faire est de montrer que l'un des bords de vos triangles contient l'un des bords du rectangle, par ex. x = 5 et 10