Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 径向扫描的实现_Algorithm_Math_Geometry - Fatal编程技术网

Algorithm 径向扫描的实现

Algorithm 径向扫描的实现,algorithm,math,geometry,Algorithm,Math,Geometry,在二维平面上给定了N个点,我需要找出一个圆的最小半径,它至少包含M个点 我使用的方法是:- 我将对圆的半径进行二进制搜索 从给定集合中选取任意点p。我们使用P作为“旋转轴”(按照惯例,逆时针方向)旋转半径为R的圆C,即在旋转过程中保持C随时与P接触。当C旋转时,我们维护一个计数器来计算C所包含的点数 请注意,此计数器仅在某个点Q进入(或离开)圆C的区域时更改。我们的目标是提出一种算法,每当其他点Q出现时,该计数器将递增(或递减)≠ P进入(或离开)C区域 (旋转)圆C的状态可以用一个参数θ来描述

在二维平面上给定了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∈[α,β]. 因此,到目前为止,最初的问题已简化为: [α,β]区间数最多的θ的最佳值是多少?


您能建议如何实现该部分吗。

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

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

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

所以,如果你画一个半径为R的圆围绕Q,半径为R的圆围绕p。当Q进入或离开时,它们相交的两点就是C的中心


设±θ为C中心与线PQ之间的角度。如果你把它画出来,你可以很容易地看到| PQ |/2R=cos(θ),这使得你很容易找到你要找的角度。

你自己试过什么吗?你好,先生,即使在纸和笔上,我也不知道如何得到θ。为什么这句话“更正式地说,当(iff)θ时,C包含Q?”∈[α,β]”是真的。