对于基于地理的在线游戏我正在寻找一种算法,该算法找到指定点与由x / y坐标连接的已知路径之间的最短距离,以便我可以杀死所有冗余点/节点。这个算法的链接或关键字将帮助我很多!感谢您的阅读
为了更好地理解:
答案 0 :(得分:1)
您是否想要计算这个以便说出“如果点到路径距离为零,那么删除点”?如果是这样,那么可能有一种更简单的方法来删除冗余节点。一次取三个积分(称为A
,B
和C
)。计算A
和B
之间的角度,以及B
和C
之间的角度。如果两个角度相同,则点B
位于A
和C
之间的路径中,并且是多余的。您可以使用'atan2'功能(或您的语言等效功能)进行角度计算。
答案 1 :(得分:0)
这是一种常用于游戏的点对点路径寻找算法:
您可能需要在您的观点和路径之间多次应用它,但通常非常快。该算法对地图网格进行了一些优化(其中正方形之间的距离是整数)。 Mickey Kawick在Real-Time Strategy Game Programming using MS DirectX 6.0中对此进行了描述。
Djikstra's algorithm是一个很好的通用路径查找算法,从单个源节点到图中的所有其他节点。您可以在找到所需内容时停止算法 - 在您的情况下,算法找到路径上每个节点的最短路径时就会停止算法。
我不知道具体的“从节点到路径的最短路径”算法。
答案 2 :(得分:0)
这是我对路径上最近点的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;
}