以原点为中心,半径为 r 的圆内/沿快速整数坐标
Posted
技术标签:
【中文标题】以原点为中心,半径为 r 的圆内/沿快速整数坐标【英文标题】:Fast Integer Coordinates Inside/along a Circle Centered at origin with radius r 【发布时间】:2017-04-06 13:28:12 【问题描述】:假设您有一个以 0,0 为中心、半径为 r 的圆。
我想获取该圆圈内所有可用的整数点。这个问题很容易解决。
一个人可能只是从x = -r to +r
和y =-r to +r
遍历一个正方形并查看if x * x + y * y <= r * r
,如果是这样,请将点添加到您的结果中。
但是,最快的方法是什么?我觉得应该有某种类型的 hack,我们可以从 (2r)^2
到 4/3 r^2
进行计算
更特别的是,我有一种感觉,我们可以计算内接正方形的长度,然后添加外部剩余分量。我不确定如何做到这一点。数学有点密集。我不会发布代码,因为我想要一个通用的算法响应,但如果有人有偏好,他可能会说明最终的基准测试,这将使用 JVM 语言。
有什么帮助吗?
注意:这类似于高斯的圆问题,但不是计算点的数量,而是想知道点是什么。
【问题讨论】:
我想指出我知道这个问题,但想知道我们是否可以做得更好。 ***.com/questions/14285358/… 【参考方案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 时间,这是你能做的最少的事情,因为它是点数。 您可以通过只做四分之一圆并通过对称获得其他计算来节省一些计算,但我什至不确定它是否更快,而且写起来肯定更长。
【讨论】:
以上是关于以原点为中心,半径为 r 的圆内/沿快速整数坐标的主要内容,如果未能解决你的问题,请参考以下文章
假设圆心在(0,0)半径为0.5的圆。现有坐标(x,y),如何判断坐标是不是在圆内或圆上?有啥好公式吗?
c_cpp 设有一半径为[R的圆及其外切四边形。向该正方形随机地投掷Ñ个点。设落入圆内的点数为ķ。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为***。所以当ñ足