У меня есть 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 * заполненных запросов Voxels.size(), что довольно медленно.
Есть ли способ сократить количество требуемых поисков? Когда вы смотрите на приведенный выше пример, вы можете видеть, что я проверяю одни и те же voxels несколько раз, поэтому можно было бы избавиться от поиска с помощью некоторого умного кэширования.
Если это помогает в любом случае, вокселы представляют собой вокселизированную трехмерную поверхность (но в ней могут быть дыры). Я обычно хочу получить список всех вокселов, у которых есть 5 или 6 соседей.
Возможно, вы должны добавить некоторую информацию о упорядочении элементов в массиве заполненныхVoxels. Без этой информации ответ на этот вопрос может быть основан только на догадках. – PatrickvL
Он не уменьшает количество требуемых запросов, но ваша проблема выглядит сдержанно параллелизуемой. – Trillian