Tìm điểm tam giác nào trong


16

Giả sử tôi có một lưới 2D bao gồm các tam giác không chồng chéo và một tập hợp các điểm . Cách tốt nhất để xác định tam giác mà mỗi điểm nằm trong là gì? { p i } M i = 1N k = 1 T K{Tk}k=1N{pi}i=1Mk=1NTK

Ví dụ: trong hình ảnh sau đây, chúng tôi có , , , vì vậy tôi muốn một hàm trả về danh sách .p 2T 4 p 3T 2 f f ( p 1 , p 2 , p 3 ) = [ 2 , 4 , 2 ]p1T2p2T4p3T2ff(p1,p2,p3)= =[2,4,2]

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

Matlab có chức năng pointlocation mà làm những gì tôi muốn cho mắt lưới Delaunay, nhưng nó không cho mắt lưới chung.

Suy nghĩ đầu tiên (ngu ngốc) của tôi là, đối với tất cả các nút , hãy lặp qua tất cả các tam giác để tìm ra tam giác nằm trong. Tuy nhiên, điều này cực kỳ không hiệu quả - bạn có thể phải lặp qua mọi tam giác cho mọi điểm, vì vậy nó có thể làm việc .p i O ( N M )pTôipTôiÔi(NM)

Suy nghĩ tiếp theo của tôi là, đối với tất cả các điểm , hãy tìm nút lưới gần nhất thông qua tìm kiếm lân cận gần nhất, sau đó xem qua các hình tam giác được gắn vào nút gần nhất đó. Trong trường hợp này, công việc sẽ là , trong đó là số lượng tam giác tối đa được gắn vào bất kỳ nút nào trong lưới. Có một vài vấn đề có thể giải quyết được nhưng gây phiền nhiễu với phương pháp này, O ( a M l o g ( N ) ) apTôiÔi(mộtMtôiog(N))một

  • Nó đòi hỏi phải thực hiện một tìm kiếm hàng xóm gần nhất hiệu quả (hoặc tìm một thư viện có nó), đó có thể là một nhiệm vụ không cần thiết.
  • Nó yêu cầu lưu trữ một danh sách các tam giác được gắn vào mỗi nút, mà mã của tôi hiện không được thiết lập - ngay bây giờ chỉ có một danh sách tọa độ nút và danh sách các phần tử.

Nhìn chung, nó có vẻ không phù hợp, và tôi nghĩ nên có một cách tốt hơn. Đây phải là một vấn đề phát sinh rất nhiều, vì vậy tôi đã tự hỏi liệu có ai có thể đề xuất cách tốt nhất để tiếp cận việc tìm ra các tam giác của các nút trong lý thuyết hoặc về mặt thư viện có sẵn hay không.

Cảm ơn!

Câu trả lời:


16

Phương pháp nhảy cạnh ngẫu nhiên thông thường sẽ hoạt động. Về cơ bản, bắt đầu với bất kỳ tam giác nào của lưới, sau đó xác định cạnh nào của điểm mục tiêu nằm ở phía đối diện. Nghĩa là, xác định cạnh nào, khi mở rộng ra một đường thẳng, tách điểm khỏi phần bên trong của tam giác. Khi có hai khả năng, chọn ngẫu nhiên một và xem xét tam giác liền kề với cạnh được chia sẻ đó và lặp lại. Sự ngẫu nhiên sẽ làm cho phương pháp này hội tụ với xác suất 1 cho các tam giác Delaunay và tôi không thể nghĩ ra một lý do nào nó không hoạt động cho các tam giác tùy ý.

Chỉnh sửa : Tôi nên thêm bước nhảy cạnh đó phải là với hằng số hợp lý cho một điểm duy nhất, vì vậy nó sẽ là cho điểmTuy nhiên, nếu bạn sắp xếp các điểm của mình theo địa phương (như sử dụng thứ tự đường cong Hilbert trước), bạn có thể khởi tạo từng truy vấn mới bằng tam giác của truy vấn trước đó, để giảm thêm thời gian chạy (Tôi không phải là nhà lý thuyết CS để tôi có thể ' t cho bạn biết big-O sẽ ở đó).O ( M log N ) MÔi(đăng nhậpN)Ôi(Mđăng nhậpN)M

Edit2 : Tìm thấy bản PDF này mô tả sơ đồ "đi bộ" như vậy được đảm bảo để chấm dứt và xem xét các cách tiếp cận ngây thơ hơn.

Một cách khác để sử dụng tứ giác là sử dụng Phân cấp tam giác. Xem Olivier Devillers. Cải thiện tam giác Delaunay ngẫu nhiên gia tăng. Trong Proc. Năm thứ 14 Hội nghị chuyên đề ACM. Tính toán. Geom., Trang 106-115, 1998. Nó hoạt động tốt nhất cho các tam giác Delaunay, nhưng cũng có thể hoạt động cho không phải Delaunay.

Về cơ bản bất cứ điều gì bạn làm để tăng tốc vị trí điểm sẽ yêu cầu xây dựng cấu trúc dữ liệu phụ trợ. Trong trường hợp của tứ giác hoặc một số phân khu không gian khác, bạn cần xây dựng cây phân khu. Trong trường hợp nhảy cạnh, bạn cần xây dựng cấu trúc tôpô liền kề tam giác. Hệ thống phân cấp tam giác cũng yêu cầu xây dựng một cây tam giác thô hơn.


Victor - bạn có biết bất kỳ mã nguồn mở nào thực hiện cách tiếp cận nhảy cạnh không? CNTT trông giống như nó là một giải pháp rất tốt cho trường hợp của tôi. (mô hình theo dõi hạt được điều khiển bởi các trường hiện tại trong lưới lưới traingualr) -Cảm ơn
Chris Barker

Tôi có mã cho điều này và tôi có thể gửi nó cho bạn; đó là trong C / C ++. Chưa có thời gian để dọn dẹp và đăng nó lên Github. Tôi đã phải viết điều này ít nhất hai lần trong đời, một lần với cấu trúc dữ liệu nửa vòng, một lần nữa với một hình tứ giác, nhưng nó có thể dễ dàng được sử dụng khi chúng không có sẵn và bạn cần phải tự xây dựng cấu trúc tôpô. Nhìn vào trang hồ sơ của tôi cho trang web của tôi, nơi bạn có thể tìm thấy thông tin liên lạc. Chúng ta có thể thảo luận thêm về điều này nhé.
Victor Liu

Tôi sắp hoàn thành việc này trong MATLAB bằng cách sử dụng thứ tự đường cong Hilbert và đi bộ tam giác ngẫu nhiên. Đó là mã nghiên cứu: không được tối ưu hóa, không được ghi lại, v.v., nhưng vẫn khá nhanh - tôi có thể cung cấp cho bạn mã nếu bạn quan tâm.
Nick Alger

2
Giới thiệu: "" "nhảy cạnh phải là O (logN)" "" Tôi không thấy điều đó. Ví dụ, trong trường hợp bệnh lý của một dải tam giác dài lớn (như kênh hẹp chỉ rộng trên tam giác), trong trường hợp xấu nhất, bạn cần phải nhảy từ một tam giác này sang đường tiếp theo cho đến hết. Trong trường hợp trung bình, một nửa. Vì vậy, nếu bạn nhân đôi số lượng hình tam giác, nó sẽ là O (N) Trong trường hợp bình thường hơn về cách sắp xếp các hình tam giác vuông, tôi mong đợi O (sqrt (N)). Hay tôi đang thiếu một cái gì đó? -Chris
Chris Barker

@Chris - Chào mừng bạn đến với scicomp! Là một phần của dịch vụ dọn phòng của scicomp, tôi đã chuyển câu trả lời của bạn và cuộc trò chuyện tiếp theo dưới dạng nhận xét về câu trả lời của Victor. Chúng tôi đang mong chờ sự tham gia của bạn trên trang web.
Aron Ahmadia

8

Tôi không tin rằng giải pháp của bạn là thực sự chính xác. Hãy xem xét tình huống mà bạn có các nút này:

  • A: (-3, 1)
  • B: (0, 2)
  • C: (3, 1)
  • D: (0, -5)

Có các tam giác ABC và ACD. Bây giờ B là điểm gần nhất với điểm gốc, nhưng điểm gốc nằm trong tam giác ACD, không chứa B.

Ôi(NM)

Tôi sẽ xem xét tùy chọn xây dựng một hình tứ giác có chứa các hình tam giác. Tức là bạn có một cây bậc bốn lưu trữ trong mỗi nút (tương ứng với một hộp giới hạn):

  • Các tọa độ tại đó hộp được phân chia, hoặc cách khác, các hộp giới hạn của bốn cây con;
  • Con trỏ đến các cây con;
  • Tập hợp các hình tam giác nằm hoàn toàn trong hộp giới hạn của hình chữ nhật này, nhưng không hoàn toàn nằm trong bất kỳ trong bốn phụ. Nói cách khác, các tam giác giao nhau với bất kỳ hai đoạn đường phân chia của tứ giác.

nnđăng nhậpnÔi(NM)


Hmm bạn nói đúng. Mặt khác, nếu tam giác là Delaunay, tôi nghĩ người hàng xóm gần nhất sẽ làm việc. Điều này quá hạn chế đối với những gì tôi đang cố gắng thực hiện, nhưng trong trường hợp Delaunay, hãy xem xét sơ đồ Voronoi kép - các ô Voronoi là tập hợp các điểm gần nhất với một nút và các cạnh của tam giác delaunay đều gặp các cạnh của Voronoi các ô ở góc bên phải, vì vậy bất kỳ điểm nào cũng phải nằm trong một tam giác được nối với nút gần nhất của nó. Tôi tự hỏi nếu đây là cách chức năng pointLocation của matlab hoạt động dưới mui xe ..?
Nick Alger

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.