ボクセルを削除するとグループが分割されるかどうかの判断


8

私は次の状況にあります:ボクセルの3Dグリッドがあります(オン/オフ、最大サイズはおそらく128x128x128です)。グリッド内では、オンになっているすべてのボクセルが相互接続され、単一のグループを形成していることを事前に知っています。

次に、ボクセルを削除する(オフにする)と、グループを分割するかどうかを判断する必要があります。

私の最初のアイデアは、削除されたボクセルの近傍を見て、それらが他のボクセルを通じて相互接続されているかどうかを判断することでした(他の質問を参照してください2つのボクセルが相互接続されているかどうかを確認するアルゴリズム)。しかし、これを行うにはより良い/他の方法があるかもしれません。

では、ボクセルを削除すると、そのボクセルが属していたグループが分割されるかどうかを判断するための良い方法は何でしょうか。

回答:


4

これについては他のコメントで多少取り上げましたが、ここでは外部/内部分類について考えていると思います。ボクセルを削除すると、その周りのボクセルが「エッジ」ボクセルに変更されます(まだボクセルになっていない場合)。これは、3つの実際のケースに要約されます(対称性により残りのケースが取得されます)-以下の例では、番号はグループIDです-は削除されるボクセルです

11      2    
1-     1-     1-2
  • 最初のケースは簡単です-それはコーナーですが、上と左のボクセルは他のボクセルを介して完全に接続されたままです。

  • 2番目のケース:コーナーであり、削除されたボクセルが、以前に接続されていた上記のボクセルと左のボクセルを切断しました

  • 3番目のケース:これは線であり、削除されたボクセルは、以前に接続されていた左右のボクセルを切断しました。

2番目または3番目のケースが発生したことが判明した場合は、パス検索を実行して、1と2が他の隣接するボクセルを通じてまだ接続されているかどうかを確認する必要があります。

ここでもある程度の効率が得られます。ボクセルが完全にグループの内部にある場合(つまり、8つの隣接グループすべてが同じグループの一部である場合)、割引が可能です。どうして?それはトポロジーのことです。2Dケースを想像してみてください-可能性は2つだけです。ツイストやターンの方法に関係なく、ボクセルのリングを形成する単一のエッジがあります。または、2つのリングがあり、1つは1つのボクセルを含み、もう1つはもう1つのボクセルを含んでいます。例えば:

 xxx xxx
 x x-x x
 xxx xxx

または

 xxxxxxx
 x     x
 xxx xxx
   x-x 
 xxx xxx

境界リングの代わりに境界面があることを除いて、それも3Dに拡張する必要があります。したがって、最近切断された2つのボクセルがまだ接続されているかどうかを判断する場合は、すべての内部ボクセルをトラバーサルから除外できます。これは、ボクセルがグループの境界ボクセルのいずれかに接続されている場合、そのグループのすべての内部ボクセルに接続されています。

これは、他の質問への私の回答で述べたハブボクセルの逆効果のようなものです。すべてのボクセルから他のすべてのボクセルへの道を見つける必要はありません。興味深いボクセルへの道を見つけるだけです。


ありがとう、ボリュームの表面でボクセルのみを使用することは、非常に優れた最適化のようです。
Bram Vaessen 2013年

3

A *を使用している場合は、ここで使用できます。

削除されたボクセルに接続されていたボクセルのリストから始めます。リストの最初から始め、A *を使用してリストの2番目へのパスを見つけます。パスが存在する場合は、2番目から3番目、3番目から4番目などのパスを見つけます。

ボクセルが互いに隣り合うため、これらの検索のほとんどは非常に高速になります。失敗したパスがある場合、それは不連続が作成されたことを意味します。

すでにA *機能が実装されている場合、これは簡単に実装できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.