【发布时间】:2016-09-21 01:03:15
【问题描述】:
我正在尝试编写一个有效的算法来计算半径为 R 和维度 D 的球体内的点数。球体始终位于原点。假设我们有一个维度为 2(圆)、半径为 5 的球体。
我的策略是在第一象限内生成所有可能的点,因此对于上面的示例,我们知道 (1,2) 在圆中,因此该点的所有 + / - 组合也必须是简单的维度平方。因此,对于在 n 维球体的单个象限中找到的每个点,我们将 2 ^ 维添加到总数中。
我不确定是否有更有效的解决方案来解决这个问题,但这是我迄今为止在实施方面所拥有的。
int count_lattice_points(const double radius, const int dimension) {
int R = static_cast<int>(radius);
int count = 0;
std::vector<int> points;
std::vector<int> point;
for(int i = 0; i <= R; i++)
points.push_back(i);
do {
for(int i = 0; i < dimension - 1; i++)
point.push_back(points.at(i));
if(isPointWithinSphere(point, radius)) count += std::pow(2,dimension);
point.clear();
}while(std::next_permutation(points.begin(), points.end()));
return count + 3;
}
在这种情况下我可以解决或改进什么?
【问题讨论】:
-
你是假设它的原点总是在 (0, 0) 还是 (0, 0, 0)?如果没有这种限制,您当前的推理似乎无法正常工作。
-
@JamesAdkison 是的,球体总是在原点
-
代码 sn -p 的输出没有给出二维的预期结果,见The On-line Encyclopedia of Integer Sequences。我看到一些问题。一个点的坐标应该是
dimension,但是第二个for循环中的i < dimension - 1会导致测试点中的坐标太少。当某些坐标为零时,添加 2^dimension 是不正确的,因为零的 +/- 只是零。它应该是 2^(正坐标的数量)。另外,如果只是置换值,我不明白如何计算像 (1,1) 这样的点。
标签: c++ algorithm geometry computational-geometry