我不确定哪个数学概念可以支持我的问题。^^
假设我们有一个参考点PointA。问题是查找在给定半径内(使用坐标)的PointA周围的点。我的方法是计算每个点的距离(勾股定理),然后与给定半径进行比较。我确信这将在复杂性方面很差。
你有什么算法建议吗? 非常感谢提供一个示例代码来解释。谢谢。
我不确定哪个数学概念可以支持我的问题。^^
假设我们有一个参考点PointA。问题是查找在给定半径内(使用坐标)的PointA周围的点。我的方法是计算每个点的距离(勾股定理),然后与给定半径进行比较。我确信这将在复杂性方面很差。
你有什么算法建议吗? 非常感谢提供一个示例代码来解释。谢谢。
我会从围绕圆形创建一个框开始,然后先测试是否有任何东西落在框内。这样你就可以避免一直计算平方根和平方运算。选择框的一条边(比如左侧边),并计算其x值:
xMin = xOrigin - radius
然后满足以下任何条件的内容
xTest < xMin
可以忽略。对于所有四个边重复类似的操作。如果测试失败,停止在该点上工作。不要进行不必要的计算。
这告诉你一个点是接近但不一定在半径内。接下来计算:
abs(sqr(xOrigin - xTest) - sqr(yOrigin - yTest))
如果这个值小于半径的平方(你预先计算以避免使用平方根),那么你就有一个在半径内的点。
在首先预处理数据后,这是我能想到的最好方法。
你唯一需要处理的复杂度就是距离的计算。只需筛选和简化这个计算,你就能达到最优。
如果你的“中心”是A(x,y),那么对于任何点B(x1, y1):
1/ 如果B在你所需的距离d内,则必须满足 x-x1 < d
和 y-y1 < d
。首先检查这些条件以过滤任何“低垂果实”的排除。
2/ 不要计算距离,而是计算距离的平方,并将其与允许的最大距离的平方进行比较(你应该预先计算和引用它,而不是每次重新计算)。这意味着不必为每个点计算平方根。
这些都是相当小的优化,但假设点是未排序和随机的,这是你能得到的最好结果。