点和路径之间的最短距离

时间:2010-08-31 12:33:19

标签: path system distance point coordinate

对于基于地理的在线游戏我正在寻找一种算法,该算法找到指定点与由x / y坐标连接的已知路径之间的最短距离,以便我可以杀死所有冗余点/节点。这个算法的链接或关键字将帮助我很多!感谢您的阅读

为了更好地理解: alt text

3 个答案:

答案 0 :(得分:1)

您是否想要计算这个以便说出“如果点到路径距离为零,那么删除点”?如果是这样,那么可能有一种更简单的方法来删除冗余节点。一次取三个积分(称为ABC)。计算AB之间的角度,以及BC之间的角度。如果两个角度相同,则点B位于AC之间的路径中,并且是多余的。您可以使用'atan2'功能(或您的语言等效功能)进行角度计算。

答案 1 :(得分:0)

这是一种常用于游戏的点对点路径寻找算法:

A* search algorithm

您可能需要在您的观点和路径之间多次应用它,但通常非常快。该算法对地图网格进行了一些优化(其中正方形之间的距离是整数)。 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;
}