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_Geometry_Computational Geometry - Fatal编程技术网

Algorithm 计算具有给定半径的圆内所有点的点数

Algorithm 计算具有给定半径的圆内所有点的点数,algorithm,geometry,computational-geometry,Algorithm,Geometry,Computational Geometry,我的输入将是一个x和y坐标的列表,这些坐标表示图片上的像素。我将有一个给定的半径r。对于每个像素,我需要计算半径r内圆内的其他像素数。我必须为我所有的观点这样做 我知道暴力的方法是比较所有其他点,看看x^2+y^2数学答案是圆的面积:面积=PI*r**2,尽管这包括部分像素。要仅获取完整像素的计数,需要遍历一个轴(x)并获取另一个轴(y)在每个点的高度(向下舍入)。对圆的四分之一执行此操作,然后乘以4。我假设整个圆圈都在图片中 我认为基于圆半径的复杂度是O(n)。您可以将平面划分为网格,每个单元

我的输入将是一个x和y坐标的列表,这些坐标表示图片上的像素。我将有一个给定的半径r。对于每个像素,我需要计算半径r内圆内的其他像素数。我必须为我所有的观点这样做


我知道暴力的方法是比较所有其他点,看看x^2+y^2数学答案是圆的面积:面积=PI*r**2,尽管这包括部分像素。要仅获取完整像素的计数,需要遍历一个轴(x)并获取另一个轴(y)在每个点的高度(向下舍入)。对圆的四分之一执行此操作,然后乘以4。我假设整个圆圈都在图片中


我认为基于圆半径的复杂度是O(n)。

您可以将平面划分为网格,每个单元格的宽度等于圆的直径,并为网格中的每个单元格将点分配到箱子中。您可以将其实现为hashmap/字典,其中键是网格单元格的左上角,值是单元格中的点列表。反复浏览点列表,找出它所在的网格单元,并添加到相应的列表中

半径为r的圆最多可以重叠4个网格单元。现在,您可以再次迭代点列表,对于每个点,您只需要检查网格单元中与以该点为中心的圆重叠的点

这将减少您需要进行的检查数量,但在病理情况下,如果所有点都彼此为r,则仍然是O(n^2)。为了进一步优化算法,在每个网格单元中存储一个。四叉树中的每个节点(顶部节点为网格单元)存储节点中点数,并且最多有4个子节点(不存储空节点),叶节点包含单个点。要根据点测试节点中的点,请首先检查整个节点是否在点的r范围内,如果在r范围内,则无需单独检查即可计算所有点。如果没有,则递归到与圆重叠的子节点,直到到达要测试的各个点,或者深入到完全位于圆内或圆外的子节点


这些算法的性能在很大程度上取决于点的分布。

如果问题是要计算到N个点列表中每个点的最大距离R处的点,则可以使用kD树进行加速

小心一点,您可以实现树设置的运行时间O(N logn),然后希望查询时间O(logn+K)用于计数,其中K是邻居的平均数量


这仍然是O(N对数N+KN)的总和:-(

这个问题没有意义。你能澄清一下吗?也许可以提供一些例子来说明你的意思。我会先迭代一次,跟踪最小和最大的x,y值,从而计算边界框:从纵横比中,你已经可以剔除一组不在圆内的点。我只会进行第二次遍历比较每个点到边界框中心的平方距离和平方半径(避免sqrt)。你知道这是什么吗,O(n*2)?如果你可以通过图像处理/OpenCV解决问题:我会用一个给定半径的圆形遮罩来切割点,然后在剩下的点上计算连接的组件(如果需要,可以放大)你让像素和点混淆了。如果你真的要求计算像素,每个中心的计数都是相同的,你的问题没有意义。因此我假设你实际上是指1)计算数字图像中邻域的黑色像素,或2)计算列表中点的近邻。请澄清,这是两个截然不同的问题。第二个问题:当我们不知道n是什么时,O(n²)是什么意思?