Tạo đa giác từ một tập hợp các đường giao nhau


10

Đây là một cách đơn giản và câu hỏi khá phổ biến mà đã được yêu cầu cho các mục đích khác nhau (xem liên kết nàynày quá , ví dụ), ở đây, tuy nhiên, chúng tôi đang tìm kiếm không phải là một gói phần mềm nhưng các thuật toán mà chúng ta có thể cố gắng thực hiện nói trong Con trăn .

Vì vậy, như được hiển thị bên dưới, một tập hợp các dòng được ánh xạ (chúng đã được cắt bớt, BTW).
Thuật toán / ý tưởng để tạo đa giác (như màu đỏ hiển thị) ?

nhập mô tả hình ảnh ở đây


Là ranh giới hình vuông bên ngoài được biết, hoặc cũng vậy, được đọc từ các dòng đầu vào?
Devdatta Tengshe

Câu trả lời:


5

Vâng, chúng tôi đặt một câu trả lời ở đây không phải là một câu trả lời hoàn chỉnh cho câu hỏi của chúng tôi, đó là, câu hỏi sẽ vẫn " mở để trả lời ". Tuy nhiên, đây là một giải pháp cho vấn đề trong câu hỏi. Đây là mẹo chúng tôi đã sử dụng:

Đầu tiên hãy xem kết quả :
nhập mô tả hình ảnh ở đây

Vì vậy, các dòng nhất định trong leftđa giác được xây dựng hiển thị trong middle. Chúng là các đa giác thực như thể hiện trong right;)

Đối với thuật toán được đưa ra dưới đây, chúng tôi đã sử dụng Shapelygói trong Python .

  • dòng ==> MultiLineString {:: M}
  • thêm một chút buffer, giả sử eps{:: MB}
  • vùng ==> Polygon {:: P} (vùng ở đây là hình vuông)
  • P.difference(MB) {kết quả đa giác}

Lưu ý rằng nó là yên tĩnh nhanh chóng trong hoạt động. Tuy nhiên, điểm còn thiếu là thuật toán không phải là phương pháp ban đầu để xây dựng đa giác từ các dòng . Tuy nhiên, nó hoạt động hoàn hảo cho vấn đề chúng tôi có trong tay.


4

JTS Topology Suite có một lớp Polygonizer, khá nhiều thứ này.

Bạn có thể xem mã nguồn, có sẵn ở đây và chuyển đổi nó thành Python.


Như mô tả mã nói rằng nó sẽ không hoạt động như mong đợi của tác giả câu hỏi: "các cạnh phải được gật đầu chính xác, nghĩa là chúng chỉ phải đáp ứng tại các điểm cuối của chúng. Đa giác sẽ chạy trên đầu vào gật đầu không chính xác nhưng sẽ không tạo thành đa giác từ không các cạnh được mã hóa "
Pablo

1
Có một hoạt động trong JTS để phân chia chính xác các Dòng tại các đỉnh. Có lẽ OP cũng có thể nhìn vào đó.
Devdatta Tengshe

3

Bạn có thể xem gói Python Shapely, đặc biệt là đa giác ()


Một lưu ý nhanh rằng đa giác trong Shapely ( from shapely.ops import polygonize) sử dụng GEOS.Polygonize từ GEOS . Vì vậy, đây là một liên kết trong đó có một liên kết đến một liên kết ...: |
Nhà phát triển

Thử nghiệm của chúng tôi polygonizekhông thành công chút nào. Tuy nhiên, cảm ơn vì đã nhắc nhở chúng tôi Shapelymà chúng tôi có thể tìm ra giải pháp (một mẹo, thực sự) như được đăng dưới dạng câu trả lời.
Nhà phát triển

2

Đây là một giải pháp khác chúng ta có thể tìm thấy.

Sử dụng DCELchúng ta có thể tạo khối từ các đường chạm.

Đối với Python có một gói {ở đây} . Đó là một thực hiện nhỏ với một số lỗi. Tuy nhiên, với một số nỗ lực, nó có thể được sử dụng cho vấn đề này. Cũng lưu ý các giai đoạn sau:

Một giai đoạn tiền xử lý mà tất cả các giao điểm giữa các dòng được tìm thấy. Sau đó, tất cả các dòng được chia thành các phân đoạn tại các điểm tương tác. Một danh sách các điểm giao nhau và một danh sách các cạnh liên quan là những điểm cần thiết cho DCEL.


Vì phương pháp này là một giải pháp ban đầu và cho hiệu suất tốt hơn nhiều so với phương pháp khác mà differencehoạt động đang được sử dụng.
Nhà phát triển
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.