私はボクセルのいくつかが満たされている3Dグリッド(ボクセル)を持っていますが、ボクセルのいくつかは満たされていません。 3Dグリッドはまばらに塗りつぶされているので、塗りつぶしたボクセルの座標(x、y、z)を持つfilledVoxels
というセットがあります。私がしようとしていることは、各塗りつぶしボクセルがどれくらいであるか、隣り合うボクセルがどれだけ満たされているかを知ることです。ここすぐに隣接するボクセルの数を数える方法は?
は一例であり:
- filledVoxelsはボクセル(1、1、1)、(1、2、1)、及び(1、3、1)を含みます。
- したがって、隣接カウントは、次のとおり
- (1,1,1)が1、隣接
- (1,2,1)は、2つのネイバー
- (1,3,1)1を有するを有しています隣人。
voxelCount = new Map<Voxel, Integer>(); for (voxel v in filledVoxels) count = checkAllNeighbors(v, filledVoxels); voxelCount[v] = count; end
checkAllNeighbors()すべての26個の周囲のボクセルを検索します:
は、今私は、このアルゴリズムを持っています。だから、私は26 * filledVoxels.size()ルックアップを行っています。これはかなり遅いです。
必要なルックアップの数を減らす方法はありますか?上記の例を見ると、同じボクセルを何度もチェックしていることが分かります。そのため、巧妙なキャッシングでルックアップを取り除くことは可能かもしれません。
、これはどのような方法で助けている場合、ボクセルは、ボクセル化、3D表面を表す(ただし、それには穴があるかもしれません)。私は通常、5または6の隣人を持つすべてのボクセルのリストを取得したいと思います。
fillVoxels配列の要素の順序に関する情報を追加することをお勧めします。この情報がなければ、この質問に答えることは推測に基づいてのみ行うことができます。 – PatrickvL
必要なルックアップの数を減らすことはできませんが、問題は恥ずかしくて並列化可能に見えます。 – Trillian