Tính toán sơ đồ Voronoi của một vùng trong hộp


8

Tôi đang đối mặt với một vấn đề như sau: Tôi có một hộp chứa đầy điểm với một phân phối chưa biết nhất định và tôi muốn tính toán Biểu đồ Voronoï của nó. Vấn đề là số lượng điểm rất lớn đến mức điều này có thể không thể thực hiện được cho phân phối đầy đủ.

Do đó, tôi đã lên kế hoạch để làm điều đó chỉ cho một khu vực bên trong hộp, nơi số điểm không lớn. Để làm như vậy tôi cần biết cách tính vùng tối thiểu có thể ảnh hưởng đến sơ đồ Voronoi của một vùng nhỏ hơn trong hộp đó.

Nói cách khác, tôi muốn tính toán sơ đồ Voronoï của các điểm bên trong khối lập phương nhỏ của hình bên dưới phù hợp với sơ đồ Voronoï có các điểm của hộp đầy đủ lưu trữ sơ đồ Voronoï nhỏ nhất có thể có trong bộ nhớ.

Giải thích vấn đề.


3
Tôi đã thấy mọi người, đặc biệt là trong vật lý thiên văn, tính toán toronoi của các tập hợp điểm lớn. Xem công việc của Volker Springel. Ví dụ: thậm chí còn có một mã nguồn mở ở đây github.com/rebzar/paravt có thể hữu ích cho bạn. Đồng thời xem arxiv.org/abs/1601,06429
cfdlab

Tôi vẫn sẽ cần một số cách để làm điều đó bằng cách sử dụng chiến lược của khối lập phương nhỏ, nhưng cảm ơn bạn rất nhiều. Tôi sẽ xem qua nó.
ccorbella

1
Xin lỗi, tôi gặp vấn đề khi cố gắng hiểu câu này "Tôi muốn tính sơ đồ Voronoï của các điểm bên trong khối lập phương nhỏ của hình bên dưới phù hợp với sơ đồ Voronoï có các điểm của hộp đầy đủ lưu trữ sơ đồ Voronoï nhỏ nhất có thể trên bộ nhớ. "
nicoguaro

Xin lỗi, tôi chỉ có nghĩa là tôi muốn tính toán sơ đồ Voronoï của khối lập phương nhỏ, có tính đến việc nó sẽ giống với khu vực mà sơ đồ tôi sẽ có được nếu tôi tính bằng cách sử dụng tất cả các điểm của hộp. Để làm như vậy, tôi hy vọng sẽ cần nhiều điểm hơn những điểm bên trong hộp (nếu không, tôi không tin rằng nó có thể phù hợp với khối khác nếu tôi theo chiến lược tương tự ở đó) nhưng tôi muốn lưu trữ càng ít càng tốt điểm.
ccorbella

@ccorbella Không phải là một câu trả lời nhưng với công cụ nào bạn đã cung cấp con số đẹp này xin vui lòng? Có thể thêm vào một chú thích công cụ.
Jan Hackenberg

Câu trả lời:


2

Để tính toán sơ đồ Voronoi của các tập hợp điểm lớn (> 100 triệu), bạn có thể sử dụng thuật toán sau:

1) create a kd-tree with all the points
2) for each point p [in parallel optionally]
     N = 10
     while not finished
       compute the N nearest neighbors of the point p
       compute the intersection of the N half-spaces defined by p 
       and the neighbors
       if there is a neighbor further away than 
         twice the radius of the ball centered on p and 
         bounding the intersection, finished = true
       N = N * 1.5
  // when exiting the loop, the computed intersection 
  // corresponds to the Voronoi cell of p, because no other bisector
  // can contribute to the Voronoi cell.

Thuật toán được giải thích với các chi tiết khác trong bài viết của tôi . Nó có thể bị đóng băng song song (chỉ cần thêm "#pragma ompallel cho" trước vòng lặp chính), vì không có phụ thuộc dữ liệu. Nó được triển khai trong thư viện lập trình GEOGRAM C ++ của tôi (cùng với Kd-Tree hiệu quả bộ nhớ có quy mô lên tới hơn 100 triệu điểm). Lưu ý rằng trong GEOGRAM cũng có triển khai Delaunay / Voronoi tiêu chuẩn song song hoạt động tốt với tối đa 100 triệu trang web.

Liên quan đến việc triển khai song song thuật toán cổ điển (Boywer-Watson), việc triển khai GEOGRAM được ghi lại ở đây (xem thêm tệp nguồn c ++ có liên quan có nhiều nhận xét). Tôi không có bài báo được xuất bản về nó, tôi sẽ viết một bài nếu thời gian cho phép. Ý tưởng chính là sử dụng spinlocks liên kết với tứ diện để đảm bảo rằng chỉ một luồng riêng lẻ có thể sửa đổi một tứ diện.


Trước hết, cảm ơn bạn đã trả lời. Tôi rất tiếc phải nói với bạn rằng bài viết của bạn dường như không được tải lên nữa (ít nhất là phiên bản đầy đủ từ web bạn liên kết). Dù sao, bạn có thể giải thích cho tôi cách bạn thực hiện song song thuật toán sơ đồ Voronoi đó không?
ccorbella

Cảm ơn bạn đã thông báo rằng, tôi đã sửa liên kết (liên kết mới có PDF, nhấp vào biểu tượng PDF để lấy nó). Tôi cũng đã thêm giải thích / liên kết ngắn để thực hiện Delaunay song song.
BrunoLevy

Lưu ý: nó sẽ hoạt động tốt với điều kiện là các điểm được phân phối đồng đều (hiệu suất có thể giảm nếu bạn có mật độ điểm thay đổi cao).
BrunoLevy

2

Có vẻ như các chuyên gia không trả lời câu hỏi của bạn nên tôi sẽ cố gắng cung cấp một ý tưởng. Nhưng trước khi tôi làm điều đó, tôi thực sự khuyên bạn nên tìm kiếm trong tài liệu về một số phương pháp tinh vi đã được phát triển. Tuy nhiên, không đảm bảo rằng đây là một đề xuất tốt hay nhanh hay hiệu quả, tôi đề xuất phương pháp sau. Hãy nhớ rằng, tôi có thể đã phạm một số sai lầm, vì vậy tôi không đảm bảo rằng mọi thứ đều hoàn toàn chính xác, nhưng tôi hy vọng ý tưởng về phương pháp này cung cấp cho bạn một số phương pháp sẽ giúp bạn giải quyết vấn đề của mình.

Đặt là tập hợp các điểm của bạn trong toàn bộ khối "lớn". Fix "nhỏ" cube của bạn C ở đâu đó trong khối lập phương lớn và để cho V C là tập hợp các điểm được chứa trong C , tức là V C = V C . Ban đầu bộ V ' C = V C .VCVCCVC=VC.VC=VC

Bước 1: Tạo sơ đồ Voronoi . Với mỗi điểm v V C biểu thị bằng V o r ( v ) ô Voronoi của nó, là một khối đa diện lồi trong ba không gian. Hơn nữa, biểu thị bởi W ( v ) các đỉnh của tế bào Voronoi tập trung ở v V ' CW ( V ' C ) = v V 'Vor(VC)vVCVor(v)W(v)vVCcác đỉnh của tất cả các ô Voronoi từ sơ đồ VoronoiVor(VC).W(VC)=vVCW(v)Vor(VC)

Bước 2: Tô màu tất cả các điểm từ và tất cả các đỉnh Voronoi W ( V C ) màu trắng.VCW(VC)

Bước 3: Với mỗi đỉnh Voronoi vẽ hình cầu Delaunay có tâm tại w , đó là hình cầu có tâm w và bán kính khoảng cách giữa w và một trong các điểm từ V C có ô Voronoi có w như một đỉnh (không quan trọng là điểm nào, có một số nhưng kết quả luôn giống nhau).wW(VC)wwwVCw

Trường hợp 3.1. Nếu hình cầu Delaunay của được chứa trong khối C , màu w màu đen.wCw

Trường hợp 3.2. Nếu hình cầu Delaunay không được chứa trong khối nhưng nó không chứa bất kỳ điểm nào từ V trong phần bên trong (mở) của nó, tô màu điểm w màu đen.CVw

Trường hợp 3.3. Nếu hình cầu Delaunay của chứa các điểm từ V trong phần bên trong (mở) của nó, (1) thêm các điểm từ V chứa trong phần bên trong của hình cầu vào tập V C và (2) giữ màu của điểm w trắng . wVVVCw

Bước 4: Đối với mỗi điểm kiểm tra nếu tất cả các đỉnh Voronoi W ( v ) của tế bào Vornoi của nó là màu đen. Nếu không phải tất cả chúng đều màu đen, hãy giữ màu của v trắng. Nếu chúng màu đen, màu v đen.vVCW(v)vv

Bước 5: Kiểm tra xem tất cả các điểm của bộ ban đầu có màu đen không.VC

Trường hợp 5.1. Nếu họ là tất cả màu đen, Voronoi sơ đồ giới hạn trong khối C là phần cục bộ của toàn cầu Voronoi sơ đồ V o r ( V ) giới hạn C . Kết thúc.Vor(VC)CVor(V)C

Trường hợp 5.2. Nếu có các đỉnh trắng trong , thì quay lại Bước 1. Ở Bước 1, khi tạo sơ đồ Voronoi mới V o r ( V C ) , người ta giữ các ô Voronoi quanh các điểm đen từ V C như nhau, giữ tất cả các đỉnh Voronoi màu đen từ W ( V C ) và thực hiện thay đổi chỉ liên quan đến các đỉnh trắng. VCVor(VC)VCW(VC)

Tôi hi vọng cái này giúp được.


1

Cách đơn giản nhất để thực hiện việc này là bao quanh hộp mực của bạn bằng một hộp lớn hơn chứa ít nhất tất cả các điểm lân cận gần nhất của các điểm trong hộp bên trong của bạn. Lưu ý rằng sẽ có một vấn đề phát sinh khi hộp bên trong gần với cạnh của hộp dữ liệu bao gồm: bạn không có điểm bên ngoài.

Tính toán một phần tử Voronoi / Delaunay có thể tinh tế hơn bạn nghĩ. Một trong những vấn đề là làm thế nào để quyết định chính xác liệu một điểm nằm ở một bên hay bên kia của mặt phẳng / đường thẳng.

Có thư viện C ++ "CGAL" rất đầy đủ để thực hiện việc này tại http://www.cgal.org/ . Các đồng nghiệp của tôi và tôi đã sử dụng điều này trong một số bài báo được xuất bản trong vật lý thiên văn: nó dường như rất vững chắc trong việc giải quyết tất cả những cạm bẫy tiềm tàng trong việc tạo ra những điều này.


Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Sau đó, câu hỏi của tôi nên được viết lại, nếu bạn muốn như vậy, như "làm thế nào để tìm các điểm lân cận gần nhất của những điểm nằm trong khối lập phương thực hiện số phép tính ít nhất". Vấn đề của tôi về cơ bản là một. Bạn có biết cách nào để làm như vậy?
ccorbella

Làm thế nào để một người quyết định hộp bên ngoài nên lớn như thế nào? Nếu nó không đủ lớn, bạn có thể không bị giới hạn của sơ đồ đầy đủ vào hộp nhỏ ban đầu. Tôi nghĩ rằng quyết định đúng đắn vượt qua một đỉnh của một tế bào voronoi từ sơ đồ cục bộ là một đỉnh của sơ đồ toàn cầu, tức là một đỉnh sẽ không bị thay đổi bởi bất kỳ tính toán lại nào của sơ đồ voronoi trong tương lai, dựa trên phần bên trong của quả cầu delaunay tương ứng có chứa bất kỳ điểm nào trong tổng số điểm hay không. Đây chính xác là định nghĩa của một tế bào delaynay, là kép đối với một tế bào voronoi.
Futurologist

@ConradCorbellaBagot Để tính toán các lân cận gần nhất trong một tập dữ liệu n-dim lớn, tồn tại thuật toán rất hiệu quả . Có lẽ bạn muốn nói những gì bạn thực sự quan tâm.
Bort

Các phần tử Voronoi / Delaunay được xác định rõ trên cả tập hợp điểm vô hạn và tập hợp điểm bị giới hạn, nhưng không nằm trên tập hợp con các điểm của tập lớn hơn. Đối với các tập hợp con như vậy, bạn phải đưa ra quyết định thỏa hiệp tùy ý. Trong vũ trụ học nơi chúng ta có một hộp hữu hạn trong một vũ trụ vô hạn khác, chúng ta chọn các điều kiện biên định kỳ. Khi thực hiện phân tích hình ảnh trên một phần của hình ảnh, tôi "mặc" ranh giới với các lân cận gần nhất đầu tiên của các điểm xác định ranh giới (có các biến chứng cần xem xét). Tôi thấy rằng đi hàng xóm gần nhất có lợi ích tương đối ít.
JonesTheAstronomer

Có một bản trình bày chi tiết về một số điều này trong adsabs.harvard.edu/abs/2011MNRAS.416.2494P có thể tải xuống miễn phí từ cả tạp chí và arXiv. Nó cũng có một cuộc thảo luận về tái cấu trúc Kriging phi tuyến của một trường mật độ bằng cách sử dụng các điều này. Nguồn dữ liệu ở đây là thiên văn học, nhưng cuộc thảo luận khá chung chung (đối với các tập dữ liệu 3 chiều).
JonesTheAstronomer

1

Tôi hiểu câu hỏi của bạn như sau: Tôi muốn vẽ sơ đồ Voronoi cho một tập hợp con các điểm sao cho giống như điểm thu được khi xem xét tập hợp các điểm hoàn chỉnh. Các sơ đồ Voronoi được vẽ bằng cách trước tiên nối các điểm lân cận và sau đó vẽ mặt phẳng vuông góc với đường thẳng tại điểm giữa. Bạn làm điều này cho tất cả những người hàng xóm gần nhất và bạn có một sơ đồ voronoi trong vùng lân cận của một điểm. Làm điều này cho tất cả các điểm và bạn có sơ đồ voronoi cho tất cả các điểm. Bạn thấy, sơ đồ voronoi được xác định cục bộ. Không có hàng xóm thứ hai gần nhất hoặc hiệu ứng hàng xóm gần thứ ba. Chỉ có hiệu ứng hàng xóm gần nhất đầu tiên. Vì vậy, tất cả những gì bạn phải làm để có được một sơ đồ voronoi với một tập hợp điểm là xác định các điểm trong tiểu vùng quan tâm, kết nối chúng với tất cả các hàng xóm gần nhất tương ứng của chúng, và vẽ một mặt phẳng đi qua các điểm giữa của các đoạn thẳng này và vuông góc với đoạn thẳng. Sơ đồ này sẽ giống nhau cho một khu vực địa phương cho dù bạn xem xét một khu vực phụ hoặc khu vực hoàn chỉnh.


Hai câu hỏi. Trước hết, "Có hàng xóm thứ hai hoặc hiệu ứng láng giềng thứ ba gần nhất" phải là "Không có ...", phải không?
ccorbella

Đúng. Cảm ơn bạn đã chỉ ra rằng. Tôi sẽ cập nhật câu trả lời. Câu hỏi thứ hai là gì?
Kaustubh Kaluskar

Xin lỗi, tôi đã chỉnh sửa nhận xét xDD Và một người khác, tôi biết rằng sơ đồ Voronoi được xác định cục bộ (trong các điều kiện khác, câu hỏi của tôi sẽ không có câu trả lời). Câu hỏi của tôi nên được viết lại, nếu bạn muốn như vậy, như "làm thế nào để tìm các điểm lân cận gần nhất của những điểm nằm trong khối lập phương thực hiện số phép tính ít nhất". Bạn có biết cách nào để làm như vậy? Dù sao, cảm ơn rất nhiều cho thời gian của bạn.
ccorbella

1
Tôi sử dụng chức năng knnsearch trong MATLAB. Bộ dữ liệu tiêu biểu của tôi là khoảng 1,5 triệu điểm và tôi làm điều đó trên máy tính xách tay của mình. Từ trang web Mathworks: 'IDX = knnsearch (X, Y) tìm thấy hàng xóm gần nhất trong X cho mỗi điểm trong Y. IDX là một vectơ cột với các hàng của tôi. Mỗi hàng trong IDX chứa chỉ mục của hàng xóm gần nhất trong X cho hàng tương ứng trong Y. ' Ở đây X sẽ là tập dữ liệu đầy đủ của bạn và Y là các điểm bên trong khối.
Kaustubh Kaluskar

Trước hết, cảm ơn bạn rất nhiều lần nữa. Tôi sẽ cố gắng hết sức. Tôi không chắc mình có thể chạy thuật toán dưới dạng cây kd với số lượng điểm lớn như vậy không, vì nó nói rằng "Đối với kích thước lớn (20 đã lớn) không mong đợi điều này chạy nhanh hơn đáng kể so với lực lượng vũ phu. Các truy vấn lân cận gần nhất có chiều cao là một vấn đề mở đáng kể trong khoa học máy tính. "...
ccorbella

-2

Tôi đề nghị bạn nên có một cách tiếp cận trực quan và trực quan bằng cách sử dụng Grasshopper cho Rhinoceros3D. Mặc dù Rhinoceros là gói CAD thương mại và Grasshopper là một plugin cho nó, nhưng bạn có thể chạy các plugin miễn phí mà không bị giới hạn và thực hiện các thử nghiệm của mình (Rhino3D không được cấp phép chỉ giới hạn lưu tệp Rhino). Grasshopper bao gồm một số lượng lớn các hàm toán học được sử dụng trong một khung vẽ và sơ đồ 3D Voronoi là một trong số đó. một khối Voronoi được thực hiện với Grasshopper3D trong Rhino3D


2
Liên kết là thú vị nhưng điều này không trả lời câu hỏi.
BrunoLevy

Đó không phải là những gì tôi đã yêu cầu, nhưng cảm ơn bạn cho công cụ.
ccorbella
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.