2011-05-21 5 views
8

Je cherche/essaye de développer un algorithme optimal pour rectilinear polygon intersection avec des rectangles. Les polygones que je suis en train de tester n'ont pas de trous.intersection de polygones rectiligne

réponses comme celles données here et here sont des polygones très généraux, et les solutions sont naturellement assez complexes.

Espérant que la communauté S.O. peut m'aider à documenter des algorithmes pour les cas spéciaux avec des polygones rectilignes seulement.

Je cherche le polygone rempli en vert dans l'image ci-dessous:

rectilinear polygon intersection with a rectangle

+0

sont les bords du polygone rectiligne et les rectangles parallèles aux axes? –

+0

@Andre - oui - toutes les lignes sont parallèles – jedierikb

+0

Comme première idée, stocker le polygone rectiligne dans un [arbre de segments] (pour deux dimensions) mon esprit. En supposant que les polygones rectilignes sont ceux qui ne changent pas et les rectangles varient. –

Répondre

2

Le livre Géométrie informatique: une introduction par Preparata et Shamos a un chapitre sur les polygones rectilignes.

+1

Merci. Je vais regarder les chapitres 2 et 8. Je vois que le terme que je veux, ce sont des polygones isothétiques. – jedierikb

1

Utilisez un algorithme de ligne de balayage, en utilisant le fait qu'un polygone rectiligne est défini par ses sommets.

Représentez les sommets avec le rectangle auquel ils appartiennent, par exemple (x, y, #rect). À cet ensemble de points, ajoutez les points qui résultent des intersections de tous les bords. Ces nouveaux points sont de la forme (x, y, final), puisque nous savons déjà qu'ils appartiennent à l'ensemble des points qui en résulte.

maintenant:

  • trier tous les points de leur valeur x
  • utilisent une ligne de balayage, à partir de la première coordonnée x; pour chaque nouveau point:
    • s'il s'agit d'un "point de départ", ajoutez-le à un ensemble temporaire T. Marquez-le "final" s'il s'agit d'un point du rectangle A et entre les coordonnées y et les points du rectangle B dans T (ou vice versa).
    • si elle est un « point d'extrémité », le retirer et son point de départ correspondant de T.

Après cela, tous les points qui sont marqués « final » désignent les sommets du polygone résultant.

Soit N le nombre total de points. En supposant en outre que le fait de tester si nous devons marquer un point comme étant "final" prend du temps O (log (n)) en recherchant T, cet algorithme entier est dans O (N * log (N)).

Notez que la tâche de trouver toutes les intersections peut être incorporée dans l'algorithme ci-dessus, puisque trouver toutes les intersections efficacement est lui-même un algorithme de ligne de balayage habituellement. Notez également que l'ensemble de points qui en résulte peut contenir plus d'un polygone, ce qui rend la reconstruction des polygones de solution hors des sommets "finaux" légèrement plus difficile.