Algorithm 径向扫描的实现
在二维平面上给定了N个点,我需要找出一个圆的最小半径,它至少包含M个点 我使用的方法是:- 我将对圆的半径进行二进制搜索 从给定集合中选取任意点p。我们使用P作为“旋转轴”(按照惯例,逆时针方向)旋转半径为R的圆C,即在旋转过程中保持C随时与P接触。当C旋转时,我们维护一个计数器来计算C所包含的点数 请注意,此计数器仅在某个点Q进入(或离开)圆C的区域时更改。我们的目标是提出一种算法,每当其他点Q出现时,该计数器将递增(或递减)≠ P进入(或离开)C区域 (旋转)圆C的状态可以用一个参数θ来描述,其中(r,θ)是圆C中心的极坐标,如果我们选择p作为极坐标系的固定点。在这个系统中,旋转C意味着增加θ 对于其他点Q(≠ P) 实际上,我们可以计算θ的范围,对于这个范围,C覆盖Q。更正式地说,每当(iff)θ时,C包围Q∈[α,β] 因此,到目前为止,最初的问题已简化为: θ的最佳值是多少,它位于最多的[α,β]区间内 简化后的问题可以用相当标准的O(NlogN)算法来解决。[3]这个简化后的问题必须解决N次(每个点p一次),因此时间复杂度为O(N2logN) 我能够了解如何执行此步骤: 对于每个点Q(≠ P) 实际上,我们可以计算θ的范围,对于这个范围,C覆盖Q。更正式地说,每当(iff)θ时,C包围Q∈[α,β]. 因此,到目前为止,最初的问题已简化为: [α,β]区间数最多的θ的最佳值是多少?Algorithm 径向扫描的实现,algorithm,math,geometry,Algorithm,Math,Geometry,在二维平面上给定了N个点,我需要找出一个圆的最小半径,它至少包含M个点 我使用的方法是:- 我将对圆的半径进行二进制搜索 从给定集合中选取任意点p。我们使用P作为“旋转轴”(按照惯例,逆时针方向)旋转半径为R的圆C,即在旋转过程中保持C随时与P接触。当C旋转时,我们维护一个计数器来计算C所包含的点数 请注意,此计数器仅在某个点Q进入(或离开)圆C的区域时更改。我们的目标是提出一种算法,每当其他点Q出现时,该计数器将递增(或递减)≠ P进入(或离开)C区域 (旋转)圆C的状态可以用一个参数θ来描述
您能建议如何实现该部分吗。当Q进入或离开圆C(半径为R)时:
- p和C的中心之间的距离是R(因为它总是R);及
- Q和C的中心之间的距离也是R
设±θ为C中心与线PQ之间的角度。如果你把它画出来,你可以很容易地看到| PQ |/2R=cos(θ),这使得你很容易找到你要找的角度。你自己试过什么吗?你好,先生,即使在纸和笔上,我也不知道如何得到θ。为什么这句话“更正式地说,当(iff)θ时,C包含Q?”∈[α,β]”是真的。