Je cherche un algorithme qui peut rapidement (je suis fortement contraint par la performance) trouver un point à l'intérieur d'un cercle, où ce point est en dehors de tous les rectangles d'un ensemble fourni (ces rectangles peuvent être tournés). Ou bien, pour trouver un cercle A avec son centre à l'intérieur d'un cercle B, où le cercle A ne se croise pas avec un ensemble de segments de droite.Trouver un point qui ne se trouve pas dans des rectangles tournés
La seule solution que je peux trouver est de faire simplement une boucle sur des échantillons de points et de faire ensuite une boucle dans les rectangles pour chacun d'entre eux. Mais puisque mon espace est continu, c'est assez pénible. Je suis fondamentalement satisfait d'un seul point qui ne se croise pas, mais il y aura des cas où de tels points n'existent pas. Dans ce dernier cas, j'essayerais idéalement de trouver un point avec le moins d'intersections, ou de trouver la réponse à l'absence de tel point.
Est-ce que quelqu'un connaît des algorithmes qui peuvent accomplir cela dans quelque chose de moins que O (n^2)? Tout ce qui aiderait à identifier de bons candidats serait aussi génial.
Un exemple typique de la situation est la suivante: Beaucoup de grands rectangles, avec un petit cercle dans lequel j'espère trouver un point (ici indiqué en bleu). Il est courant que beaucoup de rectangles tombent complètement à l'extérieur du cercle, et aussi commun que le cercle soit complètement couvert. Il y a seulement un petit ensemble de longueurs et de largeurs qui ont tendance à être utilisées pour les rectangles.
Pouvez-vous pré-traiter n'importe quoi? Et pourriez-vous montrer une image de ce à quoi cela ressemblerait habituellement? – harold
Ajout d'une image typique à l'OP. Je pense qu'il y a très peu de prétraitement car les rectangles fluctuent tout le temps.Les calculs lourds ne seraient pas vraiment possibles non plus – AnythingElse
Si cela brûle trop de mémoire pour garder une fine grille (ou mieux, quadtree) qui enregistre quelles cellules de la grille sont complètement libres de tout rectangle, j'approcherais le cercle par un polygone, et "clipez"-le contre tous les rectangles voisins (vous pouvez utiliser une grille beaucoup plus grossière pour trouver tous les rectangles que vous devez couper). Si une zone reste après l'écrêtage, vous pouvez choisir n'importe quel point dans son intérieur (notez que la moyenne de ses sommets n'est pas nécessairement garantie à l'intérieur, car le reste tronqué n'est pas garanti convexe, mais ce serait un bon choix quand c'est le cas). –