球体上的三维向量迭代

问题描述 投票:0回答:1

我有一个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";
    }

  }
}

我的推理哪里出了问题?为什么不这样做呢?

c++ iteration distance
1个回答
1
投票

有两个检查的版本。 你可以简单地检查里面的条件。它是健壮的,你将是改变指标。

  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";
      }
    }
  }

你可以进一步使用maxmin来固定边界,所以你不需要在里面进行任何检查。但我不确定这是否值得。

© www.soinside.com 2019 - 2024. All rights reserved.