我在2D网格(x,y)上有一些观点,我需要找到距离该点n个距离的所有点。我测量距离的方法是使用两点之间的距离公式。有谁知道怎么做?
编辑:仅供参考,我要做的是编写一些AI路径查找,它将与使用基于网格的位置的系统中的目标保持一定距离。目前我正在使用A *路径查找,但我不确定这是否重要或有所不同,因为我对这些东西不熟悉。
答案 0 :(得分:2)
这就是我要做的事情:
首先过滤掉x或y上比D更远的所有点。这些肯定在半径D的圆外。这是一个更简单的计算,它可以很快消除大量的工作。这是一个外部边界框优化。
您还可以使用内部边界框优化。如果这些点在x或y上比D * sqrt(2)/ 2更接近,那么它们肯定在半径D的圆内。这也比计算距离公式便宜。
然后你有一个较小数量的候选点可能在半径D的圆内。对于这些,使用距离公式。请记住,如果D = sqrt(Δx 2 +Δy 2 ),那么D 2 =Δx 2 +Δy 2 。
因此,您可以跳过计算平方根的成本。
因此,在伪代码中,您可以执行以下操作:
for each point
begin
if test 1 indicates the point is outside the outer bounding box,
then skip this point
if test 2 indicates the point is inside the inner bounding box,
then keep this point
if test 3 indicates the point is inside the radius of the circle,
then keep this point
end
答案 1 :(得分:0)
此问题称为范围查询。蛮力解决方案与您所描述的一样:计算所有点距参考点的距离,并返回距离小于所需范围值的点。
强力算法是O(N ^ 2)。然而,有更高效的算法使用spatial indexes来降低算法复杂度和距离计算的数量。例如,您可以使用R-Tree索引积分。
答案 2 :(得分:0)
它被称为最近邻搜索。更多http://en.wikipedia.org/wiki/Nearest_neighbor_search
有开放的库。我使用过为C编写的一个并推荐它:http://www.cs.umd.edu/~mount/ANN/。 ANN代表近似最近邻,但是,您可以关闭近似值并找到确切的最近邻居。
答案 3 :(得分:0)
这不会使用距离公式,但是如果你正在寻找距离恰好很近的点,也许你可以使用sin / cos?
在伪代码中:
for degrees in range(360):
x = cos(degrees) * n
y = sin(degrees) * n
print x, y
这将以360度的增量打印每个点n。
答案 4 :(得分:0)
Java实现:
public static Set<Point> findNearbyPoints(Set<Point> pts, Point centerPt, double radius) {
Set<Point> nearbyPtsSet = new HashSet<Point>();
double innerBound = radius * (Math.sqrt(2.0) / 2.0);
double radiusSq = radius * radius;
for (Point pt : pts) {
double xDist = Math.abs(centerPt.x - pt.x);
double yDist = Math.abs(centerPt.y - pt.y);
if (xDist > radius || yDist > radius)
continue;
if (xDist > innerBound || yDist > innerBound)
continue;
if (distSq(centerPt, pt) < radiusSq)
nearbyPtsSet.add(pt);
}
return nearbyPtsSet;
}