2016-11-09 1 views
2

Ich verwende matplotlib.path.Path, um zu prüfen, ob sich eine Menge von Punkten innerhalb einer Region befindet, die durch Polygone begrenzt ist (polygonale Region mit einem polygonalen Loch). Mein Ansatz beinhaltet zwei Überprüfungen und eine Schleife:Punkt im polygonalen Bereich mit polygonalem Loch

import numpy as np 
from matplotlib import path 

# Define coordinates of the boundaries 
xyOuter = np.array([[-5, -5], [5, -5], [5, 5], [-5, 5]]) 
xyInner = np.array([[-2, -2], [2, -2], [2, 2], [-2, 2]]) 

# Convert boundary coordinates to Path objects 
xyOuter = path.Path(xyOuter) 
xyInner = path.Path(xyInner) 

# Define coordinates of the test points 
xyPoints = np.linspace(-7, 7, 57) 
xyPoints = np.vstack([xyPoints, xyPoints]).T 

# Test whether points are inside the outer region 
insideOuter = xyOuter.contains_points(xyPoints) 

# Test whether points are inside the inner region 
insideInner = xyInner.contains_points(xyPoints) 

# Initialise boolean array for region bounded by two polygons 
insideRegion = np.zeros(insideOuter.shape, dtype=bool) 

# Flip False to True if point is inside the outer region AND outside the inner region 
for i in range(len(insideRegion)): 
    if insideOuter[i] == True: 
     if insideInner[i] == False: 
      insideRegion[i] = True 

# Print results 
for o, i, r in zip(insideOuter, insideInner, insideRegion): 
    print o, i, r 

Gibt es einen schnelleren Ansatz, der keine For-Schleife beinhaltet?

Antwort

0

Sie könnten einfach tun -

insideRegion = insideOuter & ~insideInner 
+0

super nett, vielen Dank! Ich denke, der erste Vorschlag ist für den allgemeineren Fall sicherer: "Falsch - Wahr = -1", aber "Falsch & - Wahr = 0". – mtgoncalves

+0

@ mtgoncalves Guter Punkt! Entfernt diesen. – Divakar