径向扫描的实现

时间:2017-01-20 04:23:38

标签: algorithm math geometry

你在2D平面上给出了N个点,我需要找出包含至少M个点的圆的最小半径。

我正在使用的方法: -

我将在圆的半径上进行二分搜索。

从给定集合中选择一个任意点P.我们使用P作为“旋转轴”(按照惯例,在逆时针方向上)旋转半径为R的圆C,即在旋转期间随时保持C触摸P.当C旋转时,我们维持一个计数器来计算C所包含的点数。

请注意,此计数器仅在某些点Q进入(或离开)圆C的区域时发生变化。我们的目标是提出一种算法,只要某个其他点Q≠,该算法将递增(或递减)此计数器P进入(或离开)C区域。

(旋转)圆C的状态可以用单个参数θθ来描述,其中(r,θ)是圆C的中心的极坐标,如果我们选择P作为极点的固定点坐标系。使用该系统,旋转C意味着增加θ。

对于每个其他点Q(≠P),我们实际上可以计算出C覆盖Q的θ的范围。更正式地说,C只要(iff)θ∈[α,β]就包含Q.

所以,到目前为止,原来的问题已经减少到:

θ的最佳值是多少[α,β]区间?

减少的问题可以通过非常标准的O(NlogN)算法来解决。[3]这个减少的问题必须解决N次(每个点P一个),因此时间复杂度为O(N2logN)。

我能够了解如何执行此步骤:

对于每个其他点Q(≠P),我们实际上可以计算C覆盖Q的θ的范围。更正式地说,C每当(iff)θ∈[α,β]包含Q. 所以,到目前为止,最初的问题已经减少到: θ的最佳值是多少[α,β]区间?

您能否建议如何实施该部分。

1 个答案:

答案 0 :(得分:1)

当Q进入或离开圆C(半径为R)时:

  • P和C中心之间的距离是R(因为它总是如此);以及

  • Q和C中心之间的距离也是R

所以,如果你在Q周围绘制一个半径为R的圆,在圆周上绘制一个半径为R的圆。当Q进入或离开时,它们相交的两个点是C的中心。

设±θ是C和线PQ的中心之间的角度。如果你绘制它,你可以很容易地看到| PQ | / 2R = cos(θ),这使你很容易找到你正在寻找的角度。