중요 사항 : 이 답변은 실제 질문에 대한 답변은 아니지만 요청 당 삭제되지 않은 상태로 남아 있습니다. 당황스럽게 나는 육면체와 육각형을 혼동했다. 문제는 3D에서 임의의 육면체 셀로 점을 정렬하는 것에 관한 것입니다. 이 솔루션은 점을 2D에서 일반 육각형 셀로 정렬하거나 불규칙한 셀을 어떤 차원에서든 일부 보로 노이 테셀레이션에 대응시킵니다. 이 방법은 메쉬가 처음에 보로 노이 테셀레이션으로 생성 된 경우에만 적용됩니다 ( 때로는 사용되는 접근 방식 인 것 같습니다 ).
여기서 정렬의 의미를 잘 모르겠지만 점을 평면의 6 각형 쓰레기통으로 정렬하려고한다고 가정합니다.
Mathematica는 내가 아는 것이므로 Mathematica에서 수행하는 방법을 보여 드리지만이 방법은 다른 시스템으로 이식 될 수 있습니다. 6 각형 격자는 삼각형의 이중 체라는 아이디어는 삼각형 배열의 점에 대한 보로 노이 다이어그램으로 생성 할 수 있습니다. 구름의 점은 다른 육각형의 중심보다 육각형의 중심에 더 가까운 경우 주어진 육각형에 속합니다.
이 방법은 포인트 배열의 보로 노이 다이어그램으로 생성 될 수있는 한 다른 모양의 메시에도 적용됩니다. (예 : 육각형은 규칙적이지 않아도됩니다.)
메쉬를 생성 해 봅시다. 이것은 삼각형 격자입니다.
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]
이중은 우리가 관심있는 육각형입니다.
DiagramPlot[points, LabelPoints -> False]
이것은 nf
일부 클라우드 포인트가 가장 가까운 육각 중심의 인덱스를 찾는 함수 를 만듭니다 . 이 방법의 핵심은 다음과 같습니다.
nf = Nearest[N[points] -> Range@Length[points]];
이제 1000 개의 랜덤 포인트로 구성된 클라우드를 생성하고 다음과 같이 정렬 해 보겠습니다 nf
.
cloud = RandomReal[{-1/2, 5}, {1000, 2}];
indices = First /@ nf /@ cloud;
indices
각 구름 점이 가장 가까운 중심의 인덱스를 포함합니다. 이것이 우리가 필요한 정보입니다. 이제 우리는 그것들로부터 히스토그램을 만들 수 있습니다 ...
Histogram[indices]
... 또는 그들 각각을 색칠 ...
Show[
DiagramPlot[points, LabelPoints -> False],
Graphics@MapThread[{ColorData[3][#1], Point[#2]} &, {indices, cloud}],
PlotRange -> All, AspectRatio -> Automatic
]
... 또는 우리가 원하는 멋진 시각화를 수행하십시오.
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 - #] &)]
여기서 중요한 점은 무언가에 가장 가까운 점을 찾는 함수였습니다 ( Nearest
). Mathematica에는이 기능이 내장되어 있지만 시스템에 없을 가능성이 있습니다. 이 경우 그러한 함수를 효율적으로 구현하는 방법에 대한 이 질문 을 참조하십시오 (또는 처리해야 할 점이 많지 않은 경우 순진한 선형 시간 구현으로 이동하십시오).