Точка привязки к линии - PullRequest
3 голосов
/ 22 сентября 2009

У меня есть две GPS-координаты, которые связаны между собой, чтобы сделать линию. У меня также есть точка GPS, которая находится рядом с линией, но никак не на линии. У меня вопрос, как мне найти ближайшую точку вдоль линии к данной точке?

Ответы [ 3 ]

11 голосов
/ 22 сентября 2009

Game Dev имеет ответ на этот вопрос , он написан на C ++, но его легко перенести. Который CarlG любезно сделал (надеюсь, он не возражает против моего репоста):

public static Point2D nearestPointOnLine(double ax, double ay, double bx, double by, double px, double py,
        boolean clampToSegment, Point2D dest) {
    // Thanks StackOverflow!
    // /1372407/tochka-privyazki-k-linii
    if (dest == null) {
        dest = new Point2D.Double();
    }

    double apx = px - ax;
    double apy = py - ay;
    double abx = bx - ax;
    double aby = by - ay;

    double ab2 = abx * abx + aby * aby;
    double ap_ab = apx * abx + apy * aby;
    double t = ap_ab / ab2;
    if (clampToSegment) {
        if (t < 0) {
            t = 0;
        } else if (t > 1) {
            t = 1;
        }
    }
    dest.setLocation(ax + abx * t, ay + aby * t);
    return dest;
}
2 голосов
/ 22 сентября 2009

Попробуйте это:

ratio = (((x1-x0)^2+(y1-y0)^2)*((x2-x1)^2 + (y2-y1)^2) - ((x2-x1)(y1-y0) - (x1-x0)(y2-y1))^2)^0.5
        -----------------------------------------------------------------------------------------
                                            ((x2-x1)^2 + (y2-y1)^2)

xc = x1 + (x2-x1)*ratio;
yc = y1 + (y2-y1)*ratio;

Where:
    x1,y1 = point#1 on the line
    x2,y2 = point#2 on the line
    x0,y0 = Another point near the line
    xc,yx = The nearest point of x0,y0 on the line
    ratio = is the ratio of distance of x1,y1 to xc,yc and distance of x1,y1 to x2,y2
    ^2    = square
    ^0.5  = square root

Формула получается после того, как мы находим расстояние от точки x0, y0 до прямой (x1, y1 -> x2, y3). Смотри здесь

Я протестировал этот код здесь (именно этот, который я дал вам выше), но я использовал его похожим способом несколько лет назад, и он работает, так что вы можете попробовать.

0 голосов
/ 10 июля 2016

Для этого вы можете использовать JTS .

  • Создать LineSegment (ваша линия)
  • Создание Координаты (точка, которую вы хотите привязать к линии)
  • Получить точку на линии, используя closestPoint метод

Пример очень простого кода:

// create Line: P1(0,0) - P2(0,10)
LineSegment ls = new LineSegment(0, 0, 0, 10);
// create Point: P3(5,5)
Coordinate c = new Coordinate(5, 5);
// create snapped Point: P4(0,5)
Coordinate snappedPoint = ls.closestPoint(c);
...