육면체 셀의 구조화되지 않은 메쉬를 기준으로 점 구름 정렬


11

질문

육면체 셀의 구조화되지 않은 메쉬와 관련하여 점 구름을 어떻게 정렬 하시겠습니까?

각 셀에는 센터와 셀을 나타내는 고유 한 레이블이 있습니다. 기본적으로 두 개의 구름 점 (원본 점 구름 및 셀 중심의 점 구름)이 있지만 셀 지오메트리 정보 (경계 상자)가 사용될 수 있습니다. 확실하지 않습니다.

결과

나는 몇 가지 질문을하고 문헌을 조사했다.

메시가 육면체이고 구조화되지 않은 경우 문제는 직교 범위 검색으로 줄어 듭니다. 이를 위해 kd 트리가 가장 자주 사용됩니다. 옥트리 데이터 구조를 기반으로 메쉬를 다듬 으면 범위 검색 알고리즘을 만들 수 있습니다. 목표는 직접 메시 지오메트리를 다루지 않고 점 구름 A-점 구름 관계 B에 집중하는 것입니다. 점 구름 A : 쿼리 점, 점 구름 B : 메쉬 셀 센터.


"(어떤 종류의) 메시와 관련하여 정렬"이라고 할 때의 의미를 명확히 할 수 있습니까? 비닝 알고리즘을 찾고 있습니까 (각 셀에 몇 개의 점이 있습니까)?
Szabolcs 2019

귀하의 질문을 명확하게 이해하지 못합니다. 포인트를 정렬하는 목표는 무엇입니까? 메쉬를보다 규칙적으로 만드는 것처럼?
Shuhao Cao

비정형 볼륨 메시에 별도의 점 구름이 흩어져 있습니다. 셀 센터에서 포인트 클라우드로 또는 그 반대로 데이터를 통신해야합니다.
tmaric

1
@ tomislav-maric : 솔루션을 답변으로 작성한 다음 자신의 답변을 수락 하시겠습니까? 이 절차는 일반적으로 질문에 "[SOLVED]"태그를 추가하는 대신 자신의 질문에 효과적으로 대답하기 위해 일반적으로 허용되는 방법입니다. 또한 사람들이 귀하의 답변을 공표 할 수 있기 때문에 더 많은 평판을 얻을 수 있습니다.
Geoff Oxberry

답변:


8

중요 사항 : 이 답변은 실제 질문에 대한 답변은 아니지만 요청 당 삭제되지 않은 상태로 남아 있습니다. 당황스럽게 나는 육면체와 육각형을 혼동했다. 문제는 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]

Mathematica 그래픽

이중은 우리가 관심있는 육각형입니다.

DiagramPlot[points, LabelPoints -> False]

Mathematica 그래픽

이것은 nf일부 클라우드 포인트가 가장 가까운 육각 중심의 인덱스를 찾는 함수 를 만듭니다 . 이 방법의 핵심은 다음과 같습니다.

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

이제 1000 개의 랜덤 포인트로 구성된 클라우드를 생성하고 다음과 같이 정렬 해 보겠습니다 nf.

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

indices = First /@ nf /@ cloud;

indices각 구름 점이 가장 가까운 중심의 인덱스를 포함합니다. 이것이 우리가 필요한 정보입니다. 이제 우리는 그것들로부터 히스토그램을 만들 수 있습니다 ...

Histogram[indices]

Mathematica 그래픽

... 또는 그들 각각을 색칠 ...

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

Mathematica 그래픽

... 또는 우리가 원하는 멋진 시각화를 수행하십시오.

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 - #] &)]

Mathematica 그래픽


여기서 중요한 점은 무언가에 가장 가까운 점을 찾는 함수였습니다 ( Nearest). Mathematica에는이 기능이 내장되어 있지만 시스템에 없을 가능성이 있습니다. 이 경우 그러한 함수를 효율적으로 구현하는 방법에 대한 이 질문 을 참조하십시오 (또는 처리해야 할 점이 많지 않은 경우 순진한 선형 시간 구현으로 이동하십시오).


고마워요! 기본적으로 내가 필요로하는 것은 각 지점과 호출 한대로 "bin"(3 차원 육면체 상자) 사이의 연결을 보여주는 관계입니다. 당신이 제안하는 것은 매우 흥미로워 보이지만 잠재적으로 수백만 박스와 수십만 포인트의 메시를 다루고 있습니다. 문제는 더 많은 비용이 든다는 것입니다. 검색 트리. 저는이 주제를 처음 접했기 때문에 잘못된 방향으로 가고 싶지 않습니다.
tmaric

케이

확실히 삭제하지 마십시오. 누군가 유용하다고 생각할 수도 있습니다! :) 그것은 문제에 대한 해결책으로 pout을 돌릴 수 있습니다. 그것에 대해 읽을 때까지 아직 그것을 받아 들일 수 없다는 것입니다.
tmaric

자세한 답변을 주셔서 감사합니다. 더 많은 포인트를 드릴 수 있습니다. :)
tmaric

@ tomislav-maric 투표를 보면, 내 대답이 유용한 투표권을 얻거나 오해에 기여할 가능성이 낮아 질까 걱정됩니다. 삭제하면 더 생산적이라고 생각합니다.
Szabolcs 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.