内部/沿着圆的快速整数坐标以原点为中心,半径为r

时间:2017-04-06 13:28:12

标签: algorithm performance geometry

考虑你有一个以0,0为中心的半径为r的圆。

我想获得此圈内所有可用的整数点。这个问题很容易解决。

可以从x = -r to +ry =-r to +r迭代一个正方形并看if x * x + y * y <= r * r,如果是,请将结果添加到结果中。

但是,最快的方法是什么?我觉得应该有某种类型的黑客,我们可以从(2r)^24/3 r^2

进行计算

更具体地说,我有一种感觉,我们可以计算内切方块的长度,然后添加外部剩余的组件。我不确定如何做到这一点。数学有点密集。我没有发布代码,因为我想要一个通用的算法响应,但是如果有一个偏好,他可能会说明这将使用的最终基准应该使用JVM语言。

任何帮助?

注意:这类似于高斯的圆圈问题,但我不想计算点数,而是想知道这些点是什么。

1 个答案:

答案 0 :(得分:1)

您可以通过计算x的每个值的最大y(在(x,0)的垂直方向上圆上的点的第二个坐标)来直接获取值:

for x in [-floor(r), floor(r)]
    y_max = floor(sqrt(r^2 - x^2))    # Pythagora's theorem
    for y in [-y_max, y_max]
        # (x, y) is good !

我认为你可以做得更好(也许你可以更快地计算y_max,但这不会是一场大赢),因为无论如何你在结果中都有这些点。

修改

这是在Pi * r ^ 2时间,这是你可以做的最少,因为它是点的数量。 你可以通过只做四分之一的圆圈来保存一些计算,然后通过对称来获得其他的计算,但我甚至不能确定它更快,并且它的写入时间肯定更长。