3D 矢量在球体上迭代



我有一个 3D 向量,想要遍历到某个点(即在球上(距离有限的所有邻居。我决定使用P1而不是欧几里得距离,以使其更干净。 我的方法如下所示,但不幸的是并没有给我所有的邻居。

std::vector<std::vector<std::vector<unsigned int>>> table;
int x = 5;
int y = 1;
int z = 3;
int MAX_X = 100;
int radius = 5;
for (int neighbor_x = x - radius; neighbor_x <  x + radius; ++neighbor_x) {
for (int neighbor_y = y - (radius - neighbor_x); neighbor_y < y + radius; ++neighbor_y) {
for (int neighbor_z = z - (radius - neighbor_x - neighbor_y); neighbor_z < z + radius; ++neighbor_z) {
std::cout << table[neighbor_x][neighbor_y][neighbor_z] << "n";
}
}
}

我在推理中哪里犯了错误?为什么它不那样工作?

具有两个检查的版本。您可以简单地检查内部条件。它很强大,您将更改指标。

for (int neighbor_x = x - radius; neighbor_x <=  x + radius; ++neighbor_x) {
for (int neighbor_y = y - radius; neighbor_y <= y + radius; ++neighbor_y) {
for (int neighbor_z = z - radius; neighbor_z <= z + radius; ++neighbor_z) {
if (std::abs(x - neighbor_x) + std::abs(y - neighbor_y) + std::abs(z - neighbor_z) > radius) continue;
if (neighbor_x < 0 || neighbor_y < 0  || neighbor_z < 0 || neighbor_x >= table.size() || neighbor_y >= table[0].size() || neighbor_z >= table[0][0].size()) continue;
std::cout << neighbor_x << " " <<  neighbor_y << " " << neighbor_z << "n";
}
}
}

一次检查的版本。如果要减少迭代次数,可以修改边界,但不应采用值(位置(,而应采用步长的绝对值(从原点偏移的大小(。使用相对步骤更容易编写。

for (int step_x = - radius; step_x <= radius; ++step_x) {
for (int step_y = std::abs(step_x) - radius; step_y <= radius - std::abs(step_x); ++step_y) {
for (int step_z = - radius + std::abs(step_x) + std::abs(step_y); step_z <= radius - std::abs(step_x) - std::abs(step_y); ++step_z) {
if (step_x  + x < 0 || step_y  + y < 0  || step_z +  z < 0 || step_x  + x >= table.size() ||  || step_y + y >= table[0].size() || step_z +  z >= table[0][0].size()) continue;
std::cout << step_x + x << " " <<  step_y + y  << " " << step_z + z << "n";
}
}
}

您可以更进一步并使用最大值/最小值固定边界,因此您不需要在内部进行任何检查。但我不确定它是否值得。

最新更新