考虑你有一个以0,0为中心的半径为r的圆。
我想获得此圈内所有可用的整数点。这个问题很容易解决。
可以从x = -r to +r
和y =-r to +r
迭代一个正方形并看if x * x + y * y <= r * r
,如果是,请将结果添加到结果中。
但是,最快的方法是什么?我觉得应该有某种类型的黑客,我们可以从(2r)^2
到4/3 r^2
更具体地说,我有一种感觉,我们可以计算内切方块的长度,然后添加外部剩余的组件。我不确定如何做到这一点。数学有点密集。我没有发布代码,因为我想要一个通用的算法响应,但是如果有一个偏好,他可能会说明这将使用的最终基准应该使用JVM语言。
任何帮助?
注意:这类似于高斯的圆圈问题,但我不想计算点数,而是想知道这些点是什么。
答案 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时间,这是你可以做的最少,因为它是点的数量。 你可以通过只做四分之一的圆圈来保存一些计算,然后通过对称来获得其他的计算,但我甚至不能确定它更快,并且它的写入时间肯定更长。