2016-07-20 4 views
2

Ich versuche herauszufinden, ob zwei Polygone sich kreuzen. Durch ‚Kreuz‘ meine ich ihre Außen sind erlaubt, einander zu berühren, aber ihr Inneres nicht:Python, formschön: Wie man bestimmt, ob zwei Polygone einander kreuzen, während sich ihre Ränder überlappen lassen

Nur die beiden ganz rechts unten Lösungen sind möglich:

enter image description here

Ich habe versucht, wohlgeformt mit schneidet oder kreuzt (und einige andere), konnte aber keine eingebaute Funktion finden, die funktioniert (sie beziehen sich normalerweise sowohl auf das Innere als auch auf das Äußere).

+4

Bitte posten Sie Ihre bearbeiten als Antwort und akzeptieren! Verwenden Sie keine Änderungen, um Ihre Lösung anzuzeigen. – River

Antwort

1

Haben Sie sich die touches Methode angesehen? Es scheint zu tun, was du willst.

Wenn nicht, könnten Sie Ihre eigenen "rollen". Zum Beispiel eine gewisse Variation dieses:

def myTouches(poly1, poly2): 
    return poly1.intersects(poly2) and not poly1.crosses(poly2) and not poly1.contains(poly2) 

Oder vorausgesetzt, Ihre Formen nur Polygone sind, können Sie bei der Sammlung von intersection zurück aussehen könnte. Wenn es nur LineStrings oder eine einzelne Point enthält, dann "berühren" sie nur. Wenn es etwas anderes enthält (mehrere Points und/oder andere Polygone), dann überlappen sie sich.

Edit: Nun, da ich Ihr Bild sehen, müssen Sie wahrscheinlich auch die disjoint Verfahren zusätzlich zu touches verwenden.

2

Dies ist die Lösung, die für den OP (aus Frage) gearbeitet:

if ((pol1.intersects(pol2) == False) and (pol1.disjoint(pol2) == True)) or ((pol1.intersects(pol2) == True) and (pol1.touches(pol2) == True)): 
    allowed = True 
elif (pol1.intersects(polMe) == True) and (pol1.disjoint(polMe) == False) and (pol1.touches(polMe) == False): 
    allowed = False 
Verwandte Themen