2014-06-18 2 views
0

Imaginez que vous avez une cour avec une clôture autour d'elle, ce qui pourrait ressembler à ceci:algorithme rapide pour détecter si une forme rectangulaire croise une limite rectangulaire

______ ________ 
|  |_|  _| 
|    |_ 
|  _ ___| 
|__  |_| | 
    |   |__ 
___|  _  | 
|  | | |_ 
|________| |______| 

Don't ask why it's a weird shape, it's your yard, I didn't make it. 

..where cette petite boîte au milieu est un peu arbitraire objet carré. Si cet objet se déplaçait dans n'importe quelle direction vers le bord de votre jardin, comment le détecteriez-vous lorsque l'objet entrerait en collision avec votre clôture?

Et si votre cour était des milliers de fois plus grande et qu'il y avait beaucoup d'arêtes à surveiller? Comment pourriez-vous résoudre efficacement ce problème alors?

Répondre

1

Voir la cour comme un grand rectangle avec plusieurs carrés "négatifs" retirés de celui-ci.

Stockez les emplacements de ces carrés négatifs dans un quad tree.

Pour vérifier la collision, sonder l'arbre pour les quatre carrés adjacents à l'objet.

La complexité temporelle de l'opération de détection dépend du choix de la variante de quadrillage, mais vous pouvez vous attendre à un temps logarithmique dans le nombre de carrés négatifs.

+0

Donc, si l'un des quatre carrés de l'arbre partage une partie ou la totalité de son emplacement avec l'objet, j'ai une collision? cela pourrait juste fonctionner. – imkendal

+0

La solution simple que j'ai donnée ne fait que stocker des points (emplacements) dans l'arbre, pas des plages ou des rectangles. En tant que tel, un ou plusieurs de vos emplacements adjacents sont dans l'arbre, ou ils ne le sont pas. Il n'y a pas de "quelques" ici. Il existe des variantes plus sophistiquées qui utilisent des groupes d'emplacements pour stocker moins dans l'arbre. – phs

+0

Je vois, merci beaucoup – imkendal

Questions connexes