Tìm tọa độ biên từ tập hợp tọa độ điểm đã cho?


18

Cho một tập hợp tọa độ, Làm thế nào để chúng ta tìm tọa độ biên.
tập hợp tọa độ <== Hình 1
Cho các tọa độ trong tập hợp trên, Làm cách nào tôi có thể lấy tọa độ trên ranh giới màu đỏ. Ranh giới là đa giác được hình thành bởi các tọa độ đầu vào cho các đỉnh, theo cách nó tối đa hóa diện tích.

Tôi đang làm việc trên một ứng dụng mà tìm kiếm những khách sạn thuộc 'x' dặm của một thành phố . Những gì tôi có là:

  1. Tọa độ của tất cả các thuộc tính.
  2. Một tập hợp tọa độ cho mỗi thành phố (Tôi có một tọa độ cho mỗi zip. Và vì hầu hết các thành phố có nhiều hơn một zip, Mỗi thành phố có một bộ tọa độ)

Lý do tôi yêu cầu diện tích tối đa là vì tôi không nghĩ ra một đa giác như hình dưới đây:

đa giác quanh co <== Hình 2

Điều tôi cần là thuật toán để đưa ra tập hợp tọa độ cho đường biên. Một thuật toán cho phép tôi đưa ra các tọa độ biên cho Hình 1 .



4
Không, không trùng lặp, đây là thân lồi, không lõm
Nicklas Avén

1
Bạn đang tìm kiếm mã, tài liệu tham khảo lý thuyết hoặc giải pháp trong các môi trường phần mềm cụ thể hiện có?
WolfOdrade

1
@Khaja Không, bạn không muốn tối đa hóa diện tích, bạn muốn thu nhỏ nó trong số tất cả các đa giác lồi có chứa các điểm. (Cách duy nhất để tối đa hóa khu vực là sử dụng toàn bộ thế giới làm đa giác có chứa.)
whuber

1
@whuber Vâng, bây giờ tôi hiểu ý của bạn, tôi muốn một đa giác lồi với diện tích tối thiểu. Mục tiêu cuối cùng của tôi là làm một tìm kiếm gần. Cách chúng tôi muốn tìm kiếm sự gần gũi của chúng tôi để làm việc là: Trong một thành phố nhất định (lồi thân), nếu chúng ta tìm kiếm ngôi nhà (mỗi nhà có một phối hợp) trong "x" dặm, nó sẽ cho tôi tất cả những ngôi nhà đó là một trong hai bên trong lồi thân hoặc đang ở một khoảng cách vuông góc dưới "x" dặm
Khaja Minhajuddin

Câu trả lời:


21

Có nhiều thuật toán để giải quyết vấn đề này ( Wikipedia "Convex_hull_alacticms" ):

  • Gói quà hay còn gọi là Jarvis march - O (nh): Một trong những thuật toán đơn giản nhất. Nó có độ phức tạp thời gian O (nh), trong đó n là số điểm trong tập hợp và h là số điểm trong thân tàu. Trong trường hợp xấu nhất, độ phức tạp là O (n2).
  • Graham scan - O (n log n): Thuật toán hơi phức tạp hơn, nhưng hiệu quả hơn nhiều. Nếu các điểm đã được sắp xếp theo một trong các tọa độ hoặc theo góc tới một vectơ cố định, thì thuật toán sẽ mất thời gian O (n). [ mã giả ]
  • QuickHull: Giống như thuật toán quicksort, nó có độ phức tạp thời gian dự kiến ​​là O (n log n), nhưng có thể suy biến thành O (nh) = O (n2) trong trường hợp xấu nhất. [ mô tả minh họa ]
  • Phân chia và chinh phục - O (n log n): Thuật toán này cũng có thể áp dụng cho trường hợp ba chiều.
  • Chuỗi đơn sắc - O (n log n): Một biến thể của quét Graham sắp xếp các điểm theo từ vựng theo tọa độ của chúng. Khi đầu vào đã được sắp xếp, thuật toán sẽ mất thời gian O (n).
  • Thuật toán thân lồi tăng dần - O (n log n)
  • Hôn nhân trước khi chinh phục - O (n log h): Thuật toán nhạy cảm đầu ra tối ưu.
  • Thuật toán của Chan - O (n log h): Thuật toán nhạy cảm đầu ra tối ưu hơn.

Cảm ơn bạn đã liệt kê những @underdark này ... bạn chọn cái nào?
Marin



3

Những gì bạn muốn là thân tàu lồi. Trong PostGIS có một hàm (thực sự là GEOS) cung cấp cho bạn thân Convex, ST_ConvexHull (hình học) .

Tại wikipedia có rất nhiều thông tin về thân tàu lõm.


1

Nếu bạn muốn một thuật toán thực hiện điều này (chứ không phải các gói có thể làm được) thì tôi nghĩ bạn sẽ cần phải sắp xếp dữ liệu; hoặc về cơ bản xác định một dòng từ mỗi điểm đến mọi điểm khác. Sau đó, bắt đầu từ (giả sử) điểm có giá trị Y cao nhất, theo dõi một tuyến đường xung quanh bên ngoài theo đường được kết nối với góc / ổ trục ngoài nhỏ nhất.

Bạn sẽ có thể tăng tốc độ truy tìm bằng cách vứt bỏ các đường giao nhau trước. Ranh giới bên ngoài sẽ không có giao lộ.

btw - FME cũng sẽ làm điều này với các biến áp ConvexHullAccumulator hoặc ConvexHullReplacer!


1

Nếu bạn quan tâm đến việc xem xét một thuật toán hiện có được triển khai bằng mã, NetTopologySuite có một thuật toán để thực hiện việc này

Xem ConvexHull.cs

Ngẫu nhiên NTS và một loạt các thư viện khác được gói gọn trong một dự án thú vị có tên DotSpatial, được tìm thấy ở đây

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.