Question

Je ne peux pas comprendre comment implémenter cela d'une manière performante, alors j'ai décidé de vous demander les gars.

J'ai une liste de rectangles - en fait atm seulement des carrés, mais je pourrais migrer vers des rectangles plus tard, donc collons pour eux et garder un peu plus général - dans un espace de dimension 2. Chaque rectangle est spécifié par deux points, rectangles peuvent se chevaucher et je ne se soucient pas beaucoup trop sur le temps de configuration, car les rectangles sont statiques basiquement et il y a une place pour précalculer toute stuff de configuration (comme les arbres la construction, le tri, précalculer vecteurs supplémentaires, tout etc). Oh je développe en JavaScript si cela est de toute préoccupation.

Pour ma vraie question: étant donné un point, comment puis-je obtenir un ensemble de tous les rectangles qui comprennent ce point?

linéaire approche ne pas effectuer assez bien. Je cherche donc quelque chose qui fonctionne mieux que O (n). Je lis des choses, comme sur Hiérarchies Volume englobantes et choses semblables, mais tout ce que j'ai essayé le fait que les rectangles peuvent se chevaucher (et je veux vraiment obtenir tous, si le point se trouve dans plusieurs rectangles) semble avoir toujours dans ma façon .

Y at-il des suggestions? Ai-je manqué quelque chose évidente? Sont BVH même applicable à peut-être des limites qui se chevauchent? Si oui, comment puis-je construire un tel arbre peut se chevauchent? Sinon, quoi d'autre pourrais-je utiliser? Il est sans intérêt pour moi si les frontières sont à l'intérieur, à l'extérieur ou non déterminé.

Si quelqu'un pouvait arriver à quelque chose comme un lien helpfull ou une diatribe sur la façon dont je suis stupide d'utiliser BVH et non Some_Super_Cool_Structure_Perfectly_Suited_For_My_Problem Je voudrais vraiment l'apprécier!

Modifier Ok, je joue un peu avec R-arbres et c'est exactement ce que je cherchais. J'utilise InFACT actuellement la mise en œuvre RTree http://stackulator.com/rtree/ comme suggéré par endy_c. Il effectue très bien et fullfills mes besoins tout à fait. Merci beaucoup pour vos gars de soutien!

Était-ce utile?

La solution

Vous pouvez regarder les arbres R

code Java

Il y a aussi un wiki, mais ne pouvez associer un poste; -)

Autres conseils

On peut diviser l'espace en grille, et pour chaque cellule de la grille ont une liste de rectangles (ou identificateurs rectangle) qui existent au moins partiellement dans cette grille. Recherchez des rectangles correspondant uniquement dans la cellule de grille. La complexité doit être O (sqrt (n)).

Une autre approche est de maintenir quatre tableaux triés de x1, y1, x2, les valeurs y2 et binaires recherche votre point dans ces 4 tableaux. Le résultat de chaque recherche est un ensemble de candidats rectangle, et le résultat final est l'intersection de ces 4 ensembles. Selon la façon dont l'intersection est mis en œuvre ensemble cela devrait être efficace que O (n).

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