我将3D空间的一部分划分为一系列1x1x1立方体,并且该部分可能具有100 ^ 3到1000 ^ 3的体积,但是,我真正感兴趣的立方体/单元格很少超过5000 -20000他们的号码。
我想要做的是找到满足我的标准的所有细胞/立方体,与所选择的相邻。但是,我不确定哪种算法最适合这样的任务。我想到的第一件事是使用常规的填充算法,但会出现以下问题:我必须存储工作区中所有单元格的信息,正如我所说,可能有多达1000 ^ 3个元素,但我需要的只有5000-20000。
所以说我的问题是:
答案 0 :(得分:0)
我认为这应该说明我如何解决问题的想法。完成初始处理后,您还可以考虑将set
转移到vector
(尽管严格来说两种结构在完全迭代摊销速度方面相似)
set<pair<int, int> > getAllPointsToProcess(const pair<int, int>& initialCell) {
set<pair<int, int> > activatedCells; // these will be returned
queue<pair<int, int> > toProcess;
toProcess.push(initialCell);
activatedCells.insert(initialCell);
int adjacentOffsets[][] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
pair<int, int> currentlyProcessed;
int neighbourCell;
while (!toProcess.empty()) {
currentlyProcessed = toProcess.front();
toProcess.pop();
for (int i = 0; i < 4; i++) {
neighbourCell.first = currentlyProcessed.first + adjacentOffsets[i][0];
neighbourCell.second = currentlyProcessed.second + adjacentOffsets[i][1];
if (isActive(neighbourCell) && activatedCells.find(neighbourCell) == activatedCells.end()) {
toProcess.push(neighbourCell);
activatedCells.insert(neighbourCell);
}
}
return activatedCells;
}
答案 1 :(得分:0)
正如您所指出的, Flood-Fill算法似乎与此问题相关。您遇到的问题是存储信息关于所有多维数据集是否已经访问或不访问。
您有两种选择:
这只是时空交易。
P.S:我希望我的问题正确!答案 2 :(得分:0)
我会尝试重新考虑这个需求:你想为每个单元格存储一些数据(bool访问),对于大多数单元格,它们将是相同的(也没有访问过),所以你想节省一些内存。
最近我听说过OpenVDB:http://www.openvdb.org/documentation/doxygen/
我没有使用它,但看起来它符合要求 - 它存储稀疏的体积数据并声称是内存和时间效率。