Teste si le point est dans un rectangle
J'ai une grande collection de rectangles, tous de la même taille. Je suis de la génération aléatoire des points qui ne doivent pas tomber dans ces rectangles, donc ce que je voudrais faire, c'est de tester si l'généré point se trouve dans l'un des rectangles, et si elle le fait, générer un nouveau point.
À l'aide de R-arbres semblent fonctionner, mais ils sont vraiment conçus pour les rectangles et pas des points. Je pourrais utiliser une version modifiée d'un R-tree algorithme qui fonctionne avec des points de trop, mais je préfère ne pas réinventer la roue, si il y a déjà une meilleure solution. Je ne suis pas très familier avec les données des structures, donc peut-être qu'il existe déjà une structure qui fonctionne pour mon problème?
En résumé, en gros ce que je demande, c'est si quelqu'un connaît un bon algorithme, qui fonctionne en Python, qui peut être utilisée pour vérifier si un point se trouve dans tout rectangle dans un ensemble donné de rectangles.
edit: C'est en 2D et les rectangles ne sont pas en rotation.
source d'informationauteur pafcu | 2009-12-13
Vous devez vous connecter pour publier un commentaire.
Ce thread Reddit adresses de votre problème:
J'ai un ensemble de rectangles, et de la nécessité de déterminer si un point est contenu dans l'un d'eux. Quelles sont les bonnes structures de données pour ce faire, avec la recherche rapide d'important?
Si votre univers entier, ou si le niveau de précision est bien connu et n'est pas trop élevé, vous pouvez utiliser abelssonla suggestion du fil, à l'aide de O(1) recherche à l'aide de la coloration:
Je vous recommande d'aller à ce poste, et entièrement lu ModernRonin's réponse qui est la plus acceptée. J'ai collé ici:
De nouveau, le crédit ModernRonin...
Pour les rectangles qui sont alignés avec les axes, vous avez seulement besoin de deux points (quatre numéros) pour identifier le rectangle - classiquement, en bas à gauche et en haut à droite. Pour déterminer si un point (XtestYtest) chevauche un rectangle (XBLYBLXTRYTR) par les tests à la fois:
Clairement, pour un assez grand ensemble de points de test, cela pourrait prendre un certain temps. La question est alors de savoir comment optimiser le dépistage.
Clairement, une optimisation est d'établir le minimum et le maximum des valeurs X et Y de la zone entourant tous les rectangles (de la boîte englobante): un essai swift sur cette montre s'il en est besoin de chercher plus loin.
En fonction de la proportion du total de la superficie est couverte par des rectangles, vous pourriez être en mesure de trouver le non-chevauchement des sous-zones qui contiennent des rectangles, et vous pouvez alors éviter d'effectuer des recherches dans ces sous-zones qui ne peuvent pas contenir un rectangle qui se chevauchent au point, encore sauver des comparaisons au cours de la recherche sur le coût de la pré-calcul approprié des structures de données. Si l'ensemble des rectangles sont rares, il y a peut-être pas de chevauchement, dans ce cas, il bascule dans la recherche par force brute. De même, si l'ensemble des rectangles est tellement dense qu'il n'y a pas de sous-tranches dans la boîte de contour qui peut être divisé sans casser des rectangles.
Cependant, vous pourriez aussi arbitrairement briser la zone de délimitation, disons, des quartiers (la moitié dans chaque direction). Ensuite, vous devez utiliser une liste de cases qui comporterait plus de boîtes que dans le jeu original (deux ou quatre cases pour chaque zone qui se chevauchent l'un de l'arbitraire des frontières). L'avantage de ceci est que vous pouvez ensuite éliminer trois des quatre quarts de la recherche, de la réduction de la quantité de travail de recherche à faire dans total - au détriment de l'auxiliaire de stockage.
Donc, il y a des compromis, comme toujours. Et pré-calcul rapport de recherche de compromis. Si vous êtes malchanceux, le pré-calcul ne réalise rien (par exemple, il y a deux cases seulement, et ils ne se chevauchent pas sur un axe à l'autre). D'autre part, il pourrait gagner considérablement en temps de recherche en bénéficier.
Pourquoi ne pas essayer cette. Il semble plutôt en lumière à la fois de mémoire et de calcul.
Considérer les projections de tous les rectangles sur la ligne de base de votre espace. Désigner l'ensemble de la ligne des intervalles de
Maintenant, supposons que le point (x, y), lancer une recherche à gauche de cet ensemble jusqu'à ce que vous atteindre une ligne d'intervalle qui contient le point x.
Si aucun ne, de votre point (x,y) est à l'extérieur de tous les rectangles.
Si certains le font, disent [Rlk, Rrk], ..., [Rlh, Rrh], (k <= h), puis vérifiez si y est à l'intérieur de l'étendue verticale de l'un de ces rectangles.
Fait.
Bonne chance.
Jean Doner
Je vous suggère de prendre un coup d'oeil à Les arbres BSP (et possible quadtrees ou octrees, les liens disponibles sur cette page). Ils sont utilisés pour partitionner l'ensemble de l'espace de manière récursive et vous permettent de vérifier rapidement un point de rectangles, vous devez vérifier à tous.
Au minimum, vous avez juste une énorme partition et que vous devez vérifier tous les rectangles, au maximum de vos partitions si petits, qu'ils ont à la taille de simples rectangles. Bien sûr, la plus fine de la partition, plus vous avez besoin de marcher vers le bas de l'arbre afin de trouver les rectangles que vous souhaitez vérifier.
Cependant, vous pouvez librement décider combien de rectangles sont adaptés à vérifier pour un point, puis de créer la structure correspondante.
Attention au chevauchement des rectangles. Comme le BSP de l'arbre doit être précalculées de toute façon, vous pouvez ainsi supprimer les recouvrements pendant ce temps, de sorte que vous pouvez obtenir des partitions.
Votre R-tree approche est la meilleure approche que je connais (c'est l'approche que je choisirais plus de quadtrees, B+ arbres ou des arbres BSP, en tant que R-arbres semblent commode de construire dans votre cas). Mise en garde: je ne suis pas un expert, même si je me souviens d'un certain nombre de choses de ma dernière année à l'université de la classe de algorithmiques!