我正在寻找一个与地理在线游戏相关的算法,该算法可以找出指定点与由x/y坐标连接的已知路径之间的最短距离,以便我可以消除所有冗余点/节点。如果有该算法的链接或关键字,将对我很有帮助!谢谢阅读。
为了更好地理解:
我正在寻找一个与地理在线游戏相关的算法,该算法可以找出指定点与由x/y坐标连接的已知路径之间的最短距离,以便我可以消除所有冗余点/节点。如果有该算法的链接或关键字,将对我很有帮助!谢谢阅读。
为了更好地理解:
这是我对路径上最近点的Java实现
private Point getNearestPoint(Point from, List<Point> to_path) {
int count = to_path.size();
if (count == 0)
return null;
if (count == 1)
return to_path.get(0);
double nearest_dist = Double.MAX_VALUE;
Point nearest_point = null;
for (int i = 1; i < count; i++) {
Point p1 = to_path.get(i-1);
Point p2 = to_path.get(i);
Point p = getNearestPointOnSegment(from, p1, p2);
if (p != nearest_point) {
double dist = dist(from, p);
if (dist < nearest_dist) {
nearest_dist = dist;
nearest_point = p;
}
}
}
return nearest_point;
}
private Point getNearestPointOnSegment(Point from, Point p1, Point p2) {
if (dist(p1, p2) < 1e3) {
Log.d(TAG, "Points are near");
return p1;
}
double d2 = dist2(p1, p2);
double t = ((from.x - p1.x) * (p2.x - p1.x) + (from.y - p1.y) * (p2.y - p1.y)) / d2;
if (t < 0) {
//Log.d(TAG, "p1");
return p1;
}
if (t > 1) {
//Log.d(TAG, "p2");
return p2;
}
//Log.d(TAG, "t:" + t);
return new Point((int)(p1.x + t * (p2.x - p1.x)),
(int)(p1.y + t * (p2.y - p1.y)));
}
private double dist(Point p1, Point p2) {
return Math.sqrt(dist2(p1, p2));
}
private double dist2(Point p1, Point p2) {
return sqr(p1.x - p2.x) + sqr(p1.y - p2.y);
}
private double sqr(double x) {
return x * x;
}
java.awt.Point
,那么distance
和distanceSq
是内置方法。 - wchargin这是一种常用于游戏中的点对点路径查找算法:
你可能需要在你的点和路径之间多次应用它,但通常它非常快速。该算法针对地图网格(其中方块之间的距离为整数)进行了一些优化。Mickey Kawick 在 使用 MS DirectX 6.0 进行实时策略游戏编程 中有描述。
Djikstra 算法 是一种很好的通用路径查找算法,从单个源节点到图中所有其他节点。当你找到所需的内容时,可以停止算法 - 在你的情况下,这将是当算法找到路径上每个节点的最短路径时。
我不知道有特定的“从节点到路径的最短路径”算法。
A
、B
和C
)。计算A
和B
之间的角度以及B
和C
之间的角度。如果两个角度相同,则点B
位于A
和C
之间的路径上,并且是多余的。您可以使用“atan2”函数(或您所使用的语言的等效函数)进行角度计算。