确定给定半径算法中的点

时间:2010-10-15 04:06:10

标签: algorithm geometry distance area

我不确定这是什么数学概念来支持我的问题。 ^^

假设我们将PointA作为参考。问题是在给定半径内找到PointA周围的点(使用坐标)。我的方法是计算每个点(毕达哥拉斯)的距离,然后与给定的半径进行比较。我敢肯定,这会让人觉得复杂。

您建议使用什么算法? 我们非常感谢能够指出问题的示例代码。感谢。

4 个答案:

答案 0 :(得分:6)

我首先在圆圈周围创建一个盒子,然后首先测试盒子里面是否有任何东西。然后你可能总是避免一直计算sqrts和square。选择框的一个边缘(比如左边的那个)并计算其x值:

xMin = xOrigin - radius

然后任何满足的事情

xTest < xMin

可以忽略。对所有四个方面重复类似的事情。测试失败的那一刻,然后停止工作。不要做不必要的计算。

这告诉您一个点接近但不一定在半径范围内。接下来计算:

abs(sqr(xOrigin - xTest) - sqr(yOrigin - yTest))

如果这小于半径*半径(你预先计算以避免使用平方根)那么你在半径范围内有一个点。

这是我能够首先预先构建数据的最佳方法。

答案 1 :(得分:3)

如果您的积分未编入索引,那么这实际上是一种最佳算法。在没有任何其他索引的情况下,有 n个点,并且需要O( n )时间来搜索所有这些点。

一个微优化是跳过sqrt操作并将坐标增量的平方和与所需半径的平方进行比较。

如果你要对同一个数据集进行多次查询,你可以使用各种索引方案花一些时间来计算(O(n log n)),但要使查找更快(O(m + log n),其中m 是找到的点数。)

kd-trees可能是从那里开始的地方。

答案 2 :(得分:1)

这里唯一的复杂性是距离的计算。只需筛选并简化计算,您就是最佳选择。

如果你的'中心'是A(x,y),那么对于任何一点B(x1,y1),考虑:

1 /如果B在B点所需的距离d内,那么x-x1 < dy-y1 < d都是如此。首先检查这些条件,以过滤任何“低悬果实”排除。

2 /而不是计算距离,计算距离的平方并将其与最大允许距离的平方进行比较(您应该明确地预先估算和参考,而不是每次重新计算)。这意味着不必为每个点计算平方根。

这些都是非常小的优化,但假设这些点是未分类和随机的,这是你得到的最好。

答案 3 :(得分:0)

最佳答案取决于尺寸的数量。我假设你在2D或3D空间工作。

一种简单的方法是制作一个均匀的单元格网格,比如r。然后将所有点分配到各自的单元格。

每个查询点只与少数单元格相交,比如9.你需要只检查相交的单元格。

更有效的方法是构造一个四叉树或KD树(还有很多其他选项,但对于2D,四元组或KD树都可以。)

检查圆形 - 矩形交叉是否需要层次结构,但这在KD-Tree最近邻居算法中描述(您只需稍微修改它)。

如果您真的关心性能,可以构建多个网格(移位或旋转)并始终选择最靠近该点居中的单元格,以便搜索限制为最少的单元格数。 / p>