3D グリッド (ボクセル) があり、ボクセルの一部が塗りつぶされ、一部が塗りつぶされていません。3D グリッドはまばらに塗りつぶされているためfilledVoxels
、塗りつぶされたボクセルの座標 (x、y、z) のセットを取得しました。私がやろうとしているのは、塗りつぶされたボクセルごとに、隣接するボクセルがいくつも塗りつぶされているかを調べることです。
次に例を示します。
- 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 つの隣接ボクセルを持つすべてのボクセルのリストを取得したいと考えています。