Sắp xếp một đám mây các điểm liên quan đến một mạng lưới các ô lục giác không có cấu trúc


11

Câu hỏi

Làm thế nào bạn sắp xếp một đám mây các điểm liên quan đến một mạng lưới các ô lục giác không cấu trúc?

Mỗi ô có một trung tâm và một nhãn duy nhất để thể hiện nó. Về cơ bản có hai điểm đám mây (đám mây điểm gốc và đám mây điểm của trung tâm ô), nhưng thông tin hình học ô (hộp giới hạn) có thể được sử dụng, tôi không chắc chắn.

Các kết quả

Tôi đã thực hiện một số câu hỏi xung quanh và tìm kiếm thông qua các tài liệu:

nếu lưới là hình lục giác và không có cấu trúc, vấn đề được giảm xuống thành một tìm kiếm phạm vi trực giao. Với mục đích này, cây kd thường được sử dụng nhất. Nếu lưới được tinh chỉnh dựa trên cấu trúc dữ liệu octree, thuật toán tìm kiếm phạm vi có thể được xây dựng xung quanh nó. Mục tiêu là để tránh xử lý hình học lưới trực tiếp và tập trung vào đám mây điểm A - mối quan hệ đám mây điểm B. Đám mây điểm A: điểm truy vấn, điểm đám mây B: trung tâm ô lưới.


Bạn có thể làm rõ ý của bạn khi nói "sắp xếp theo (bất kỳ loại) lưới" nào không? Bạn đang tìm kiếm một thuật toán binning, (mỗi ô có bao nhiêu điểm)?
Szabolcs

Tôi không hiểu câu hỏi của bạn khá rõ ràng, mục tiêu của việc sắp xếp các điểm là gì? Giống như làm cho lưới thường xuyên hơn?
Shuhao Cao

Có một đám mây điểm riêng biệt nằm rải rác trên lưới âm lượng không có cấu trúc. Tôi cần truyền dữ liệu từ các trung tâm tế bào đến đám mây điểm và ngược lại.
tmaric

1
@ tomislav-maric: Bạn có thể vui lòng viết giải pháp của bạn như một câu trả lời, và sau đó chấp nhận câu trả lời của riêng bạn không? Quy trình này thường là cách thực hành được chấp nhận để trả lời câu hỏi của bạn một cách hiệu quả, thay vì thêm thẻ "[GIẢI QUYẾT]" vào câu hỏi; Ngoài ra, nó sẽ mang lại cho bạn danh tiếng hơn, bởi vì mọi người có thể nâng cao câu trả lời của bạn.
Geoff Oxberry

Câu trả lời:


8

Lưu ý quan trọng: Câu trả lời này không trả lời câu hỏi thực tế, nhưng nó không bị xóa trong mỗi yêu cầu. Xấu hổ tôi bối rối lục giác và lục giác. Câu hỏi là về việc sắp xếp các điểm vào các ô lục giác tùy ý trong 3D trong khi giải pháp này sắp xếp các điểm thành các ô lục giác đều trong 2D hoặc các ô không đều tương ứng với một số tàu Voronoi theo bất kỳ chiều nào. Phương pháp này chỉ được áp dụng nếu lưới được tạo ra như là một tàu Voronoi ở nơi đầu tiên (dường như là một cách tiếp cận được sử dụng đôi khi ).


Tôi không chắc ý của bạn là gì khi sắp xếp ở đây, nhưng tôi giả sử bạn muốn sắp xếp điểm vào các thùng hình lục giác trên mặt phẳng.

Mathematica là những gì tôi biết, vì vậy tôi sẽ chỉ cho bạn cách làm điều đó trong Mathematica, nhưng phương thức này có thể được chuyển sang các hệ thống khác. Ý tưởng là một mạng lục giác là đối ngẫu của một tam giác: nó có thể được tạo ra như sơ đồ Voronoi của một điểm trong sắp xếp tam giác. Một điểm từ đám mây thuộc về một hình lục giác đã cho nếu nó ở gần trung tâm của hình lục giác đó hơn so với tâm của bất kỳ hình lục giác nào khác.

Phương pháp này cũng sẽ làm việc cho các mắt lưới có hình dạng khác nhau, miễn là chúng có thể được tạo như sơ đồ Voronoi của một số cách sắp xếp điểm. (Ví dụ, các hình lục giác không cần phải thường xuyên.)


Hãy tạo lưới. Đây là một mạng tam giác:

pts = Join @@ Table[{x, Sqrt[3] y}, {x, 0, 4}, {y, 0, 2}];

points = Join[pts, TranslationTransform[{1/2, Sqrt[3]/2}] /@ pts];

Needs["ComputationalGeometry`"]
PlanarGraphPlot[points, LabelPoints -> False]

Đồ họa toán học

Bộ đôi của nó là hình lục giác mà chúng ta quan tâm:

DiagramPlot[points, LabelPoints -> False]

Đồ họa toán học

Điều này xây dựng một hàm nftìm chỉ mục của tâm hình lục giác mà một số điểm đám mây gần nhất. Đây là chìa khóa của phương pháp:

nf = Nearest[N[points] -> Range@Length[points]];

Bây giờ, hãy tạo ra một đám mây 1000 điểm ngẫu nhiên và sắp xếp chúng với nf:

cloud = RandomReal[{-1/2, 5}, {1000, 2}];

indices = First /@ nf /@ cloud;

indiceschứa các chỉ số của các trung tâm mà mỗi điểm đám mây gần nhất. Đây là thông tin chúng tôi cần. Bây giờ chúng ta có thể tạo một biểu đồ từ chúng ...

Histogram[indices]

Đồ họa toán học

... hoặc tô màu mỗi người trong số họ ...

Show[
 DiagramPlot[points, LabelPoints -> False],
 Graphics@MapThread[{ColorData[3][#1], Point[#2]} &, {indices, cloud}],
 PlotRange -> All, AspectRatio -> Automatic
 ]

Đồ họa toán học

... Hoặc thực hiện bất kỳ loại hình ảnh trực quan nào chúng ta muốn.

tally = Tally[indices];

ListDensityPlot[Join[points, List /@ Sort[tally][[All, 2]], 2], 
 InterpolationOrder -> 0, 
 Epilog -> (Text[#2, points[[#1]]] & @@@ tally), 
 PlotRange -> {{-.5, 5}, {-.5, 5}}, Mesh -> All, 
 ColorFunction -> (ColorData["BeachColors"][1 - #] &)]

Đồ họa toán học


Điểm mấu chốt ở đây là hàm tìm điểm gần nhất với thứ gì đó ( Nearest). Mathematica đã tích hợp sẵn tính năng này, nhưng có khả năng hệ thống của bạn không có. Nếu đây là trường hợp, xin vui lòng xem câu hỏi này về cách thực hiện hiệu quả một chức năng như vậy (hoặc chỉ đi với việc thực hiện thời gian tuyến tính ngây thơ nếu bạn không có một số lượng lớn điểm để xử lý).


Cảm ơn rất nhiều! Về cơ bản những gì tôi cần là một mối quan hệ cho thấy một kết nối giữa mỗi điểm và một "thùng" như bạn đã gọi nó (hộp lục giác 3 chiều). Những gì bạn đề xuất có vẻ rất thú vị, nhưng tôi đang xử lý các lưới hàng triệu hộp và hàng trăm nghìn điểm có thể xảy ra .. Câu hỏi đặt ra là chi phí cao hơn: tạo lưới kép hoặc làm việc với các hộp giới hạn của "thùng" và sử dụng kd cây để tìm kiếm. Tôi rất mới với chủ đề này, vì vậy tôi thực sự không muốn đi sai hướng.
tmaric

k

Đừng chắc chắn xóa nó, ai đó có thể thấy nó hữu ích! :) Nó có thể biến bĩu môi là giải pháp cho vấn đề, chỉ là tôi chưa thể chấp nhận nó cho đến khi tôi đọc về nó.
tmaric

Và cảm ơn vì một câu trả lời chi tiết như vậy, nếu tôi có thể tôi sẽ cho bạn nhiều điểm hơn! :)
tmaric

@ tomislav-maric Nhìn vào các phiếu bầu, tôi lo lắng rằng câu trả lời của tôi sẽ làm giảm cơ hội bạn sẽ nhận được một câu hỏi hữu ích, hoặc sẽ góp phần vào sự hiểu lầm. Tôi nghĩ rằng nó hiệu quả hơn nếu tôi xóa.
Szabolcs
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.