六面体セルの非構造化メッシュに関して点の雲を並べ替えます


11

質問

六面体セルの非構造化メッシュに関して、ポイントのクラウドをどのようにソートしますか?

各セルには、中心とそれを表す一意のラベルがあります。基本的に2つのクラウドポイント(元のポイントクラウド、およびセル中心のポイントクラウド)がありますが、セルジオメトリ情報(境界ボックス)が役に立つかもしれません。

結果

私はいくつかの質問をし、文献を検索しました:

メッシュが六面体で構造化されていない場合、問題は直交範囲検索に限定されます。この目的のために、kdツリーが最もよく使用されます。メッシュが八分木データ構造に基づいて洗練されている場合、範囲検索アルゴリズムを構築できます。目標は、直接的なメッシュジオメトリの処理を避け、点群A-点群の関係Bに集中することです。点群A:クエリポイント、点群B:メッシュセル中心。


「(あらゆる種類の)メッシュに関して並べ替える」と言うときの意味を明確にできますか?ビニングアルゴリズムを探していますか(各セルにいくつのポイントがあるか)。
-Szabolcs

私はあなたの質問をはっきりと理解していませんが、ポイントをソートする目的は何ですか?メッシュをより規則的にしたいですか?
シュハオカオ

非構造化ボリュームメッシュ全体に散在する個別の点群があります。セルセンターからポイントクラウドへ、またはその逆にデータを通信する必要があります。
-tmaric

1
@ tomislav-maric:ソリューションを答えとして書いて、自分の答えを受け入れてください。通常、この手順は、「[解決しよう]」タグを質問に追加するのではなく、独自の質問に効果的に回答するための一般的な方法です。また、人々があなたの答えに賛成することができるので、より多くの評判を得ます。
ジェフオックスベリー

回答:


8

重要な注意:この回答は実際の質問には答えませが、リクエストごとに削除されずに残されました。恥ずかしいことに、六面体と六角形を混同しました。問題は、ポイントを3Dの任意の六面体セルにソートすることですが、このソリューションは、ポイントを2Dの正六角形セル、または任意の次元のボロノイテッセレーションに対応する不規則な六角形セルにソートします。この方法は、そもそもメッシュがボロノイテッセレーションとして生成された場合にのみ適用されます(これは時折使用されるアプローチのようです)。


ここで並べ替えの意味がわかりませんが、ポイントを平面上の六角形のビンに並べ替えたいと思います。

Mathematicaは私が知っていることなので、Mathematicaでそれを行う方法を示しますが、このメソッドは他のシステムに移植できます。六角形の格子は三角形の格子の双対であるという考えです。三角形の配置の点のボロノイ図として生成できます。クラウドのポイントは、他の六角形の中心よりもその六角形の中心に近い場合、その六角形に属します。

この方法は、ポイント配置のボロノイ図として生成できる限り、さまざまな形状のメッシュでも機能します。(たとえば、六角形は規則的である必要はありません。)


メッシュを生成しましょう。これは三角格子です。

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にはこれが組み込まれていますが、システムに組み込まれていない可能性があります。この場合、このような関数を効率的に実装する方法に関するこの質問を参照しください(または、処理するポイントが大量にない場合は、単純な線形時間実装を使用してください)。


どうもありがとう!基本的に、私が必要とするのは、各ポイントと「ビン」と呼ばれる接続を示す関係です(3次元の6面体ボックス)。あなたが提案することは非常に興味深いように見えますが、私は潜在的に数百万の箱と数十万の点のメッシュを扱っています。検索用のツリー。私はこのトピックに非常に新しいので、本当に間違った方向に行きたくありません。
-tmaric

k

絶対に削除しないでください。誰かが役に立つかもしれません!:)それは問題の解決策になるために痛風に変わるかもしれません、それについて読むまで私はまだそれを受け入れることができないということです。
tmaric

そして、このような詳細な回答に感謝します。もしできれば、もっとポイントをあげたいと思います!:)
tmaric

@ tomislav-maric投票を見て、私の答えがあなたが有用なものを手に入れるチャンスを減らすか、誤解の一因になるのではないかと心配しています。削除すると生産性が向上すると思います。
-Szabolcs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.