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]
Bộ đôi của nó là hình lục giác mà chúng ta quan tâm:
DiagramPlot[points, LabelPoints -> False]
Điều này xây dựng một hàm nf
tì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;
indices
chứ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]
... 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
]
... 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 - #] &)]
Đ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ý).