2015-07-21 16 views
5

Tôi đã tìm kiếm một thay thế python để inpolygon MATLAB() và tôi đã đi qua contains_points như là một lựa chọn tốt.inpolygon cho Python - Ví dụ về phương thức matplotlib.path.Path contains_points()?

Tuy nhiên, các tài liệu là một chút trần không có dấu hiệu của loại contains_points dữ liệu dự đoán:

contains_points (điểm, chuyển đổi = None, bán kính = 0,0)

Trả về một mảng bool mà là True nếu đường dẫn chứa điểm tương ứng.

Nếu biến đổi không phải là Không, đường dẫn sẽ được chuyển đổi trước khi thực hiện thử nghiệm.

bán kính cho phép đường dẫn được tạo ra lớn hơn hoặc nhỏ hơn một chút.

Tôi có đa giác được lưu trữ dưới dạng mảng n * 2 (trong đó n là khá lớn ~ 500). Theo như tôi có thể nhìn thấy tôi cần phải gọi phương thức Path() trên dữ liệu này mà dường như làm việc Ok:

poly_path = Path(poly_points) 

Tại thời điểm này tôi cũng có những điểm tôi muốn kiểm tra được lưu trữ như một n * 2 NumPy mảng (catalog_points).

Có lẽ vấn đề của tôi nằm ở đây? Như khi tôi chạy:

in_poly = poly_path.contains_points(catalog_points) 

tôi nhận lại một ndarray chứa 'False' cho mỗi giá trị không có vấn đề tập hợp các điểm tôi sử dụng (tôi đã thử nghiệm này trên mảng các điểm tốt trong đa giác).

+1

Đối với những gì nó có giá trị, điều này làm việc như mong đợi đối với tôi: 'p = Đường dẫn ([[0, 0], [0, 1], [1, 0]]); result = p.contains_points ([[0.1, 0.1], [1, 1], [0.5, 0.6], [0.5, 0.4]]) '. Tôi nhận được một mảng chứa '[True, False, False, True]', như mong đợi. Tuy nhiên, nếu tôi sử dụng 'p = Path ([[0, 0], [0, 1], [1, 0]], đóng = True)', 'result' là tất cả False. –

+0

Bạn có thể chỉnh sửa câu hỏi của mình để bao gồm một ví dụ độc lập (tức làmột cái gì đó chúng ta có thể sao chép và chạy) mà không hoạt động như mong đợi? –

Trả lời

16

Thông thường trong những tình huống này, tôi tìm ra nguồn để được chiếu sáng ...

Chúng ta có thể xem mã nguồn để path.contains_point chấp nhận một container có ít nhất 2 yếu tố. Nguồn cho contains_points khó hiểu hơn một chút vì nó gọi tới hàm C Py_points_in_path. Dường như chức năng này chấp nhận một iterable rằng sản lượng nguyên tố có chiều dài 2:

>>> from matplotlib import path 
>>> p = path.Path([(0,0), (0, 1), (1, 1), (1, 0)]) # square with legs length 1 and bottom left corner at the origin 
>>> p.contains_points([(.5, .5)]) 
array([ True], dtype=bool) 

Tất nhiên, chúng ta có thể sử dụng một mảng NumPy điểm cũng như:

>>> points = np.array([.5, .5]).reshape(1, 2) 
>>> points 
array([[ 0.5, 0.5]]) 
>>> p.contains_points(points) 
array([ True], dtype=bool) 

Và chỉ để kiểm tra xem chúng tôi không phải lúc nào cũng chỉ nhận được True:

>>> points = np.array([.5, .5, 1, 1.5]).reshape(2, 2) 
>>> points 
array([[ 0.5, 0.5], 
     [ 1. , 1.5]]) 
>>> p.contains_points(points) 
array([ True, False], dtype=bool) 
+1

Ví dụ điển hình về kiểm tra/giảng dạy đơn vị, kiểm tra dương tính và âm tính –

2

Đảm bảo rằng các đỉnh được đặt hàng như mong muốn. Các đỉnh dưới được sắp xếp theo cách vẽ hình tam giác thay vì hình chữ nhật. Vì vậy, nó không tạo ra true cho điểm bên trong hình chữ nhật nhưng bên trong tam giác.

>>> p = path.Path(np.array([bfp1,bfp2,bfp4,bfp3])) 
>>> p 
Path([[ 5.53147871 0.78330843] 
[ 1.78330843 5.46852129] 
[ 0.53147871 -3.21669157] 
[-3.21669157 1.46852129]], None) 
>>> IsPointInside=np.array([[1,2],[1,9]]) 
>>> IsPointInside 
array([[1, 2], 
     [1, 9]]) 
>>> p.contains_points(IsPointInside) 
array([False, False], dtype=bool) 
>>> 

Điểm đầu tiên sẽ là True nếu bfp3 và bfp4 được sắp xếp chính xác.