Algorithme pour rechercher les segments de ligne qui se chevauchent
-
07-07-2019 - |
Question
n4------------------n3--------------------n2--n1 | | | | | | | P1 | | | | | | | n6--n5 | | | | n11--n10 | n17 P4 | | P2 | | | P3 | n7 | n12---n9 | | | n8 | | | n16------------n15---------n14------------n13
Dans la technique ASCII ci-dessus, il existe quatre polygones (P1, P2, P3, P4) avec des segments de ligne se chevauchant exactement. Par exemple, le polygone P2 (formé de segments de droite entre les nœuds n3, 10, 9, 12, 15, 14, 13, 8, 7, 6 et 2) et P1 (n1, 2, 5 et 6) se chevauchent à la segment de ligne entre n2 et n6.
Quel est le moyen le plus rapide de rechercher des segments de ligne qui se chevauchent exactement?
La solution
Si chaque forme est une liste d'arêtes, alors:
initialize map<edge, list of shapes> map
for each Shape s
for each Edge e in s
list l = map.get(e)
if(l == null)
l = new list()
l.add(s)
map.put(e, l)
for each <edge, list> in map.entries
if(list.size > 1)
do something with this common edge
c'est O (bords), et tu ne vas pas faire mieux que ça. cette solution peut ne pas être satisfaisante en fonction de ce que vous voulez faire spécifiquement.
Autres conseils
Soit N segments de ligne, dans le pire des cas, il peut y avoir O (n ^ 2) intersections. Pensons au cas où vous avez N polygones où chaque polygone partage le même bord. À moins d’une contrainte supplémentaire pour empêcher cette situation de se produire (que vous n’ayez pas ajouté), le meilleur algorithme que vous pouvez trouver sera O (N ^ 2) dans le pire des cas, car la liste des intersections est simplement O (N ^ 2).
En pratique, les algorithmes les plus efficaces en géométrie de calcul pour rechercher les intersections de segments de ligne sont les algorithmes de ligne balayée. Leur pire temps de parcours pour trouver toutes les intersections est O (k log n) où k est le nombre d'intersections (ce peut être N ^ 2, mais c'est rarement le cas.)
Vous trouverez une description exacte de l'algorithme dont vous avez besoin dans Introduction aux algorithmes de Thomas H Cormen dans la section relative à la géométrie informatique.