Расстояние от точки до линии (2D) и координаты пересечения - PullRequest
0 голосов
/ 05 марта 2012

Так что мне нужно знать Расстояние от точки до линии (в 2D-пространстве), учитывая две координаты линии (AB).

Вот что у меня есть:

public double pointToLineDistance(Point A, Point B, Point P)
{
    double normalLength = Math.sqrt((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y));
    return Math.abs((P.x - A.x) * (B.y - A.y) - (P.y - A.y) * (B.x - A.x)) / normalLength;
}

Но мне также нужно получить координаты точки, где перпендикулярная линия пересекается с линией AB (это нормально, если она находится за пределами этого сегмента).

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 05 марта 2012

Заметьте, что AB можно просто выразить как

ab = A + (B - A) * s

Итак, направление AB равно B - A или (B.x - A.x, B.y - A.y).Линия, направление которой (A.y - B.y, B.x - A.x), будет перпендикулярной.(Мы просто меняем местами x и y и отменяем одно из них.)

Нам особенно нужна линия, которая перпендикулярна AB и также проходит через P, поэтому мы делаем

perp = P + (A.y - B.y, B.x - A.x) * t;
perp = (P.x + A.y - B.y, P.y + B.x - A.x) * t;

Теперьпросто найдите пересечение между этой перпендикулярной линией и AB.У вас есть два уравнения (для компонентов x и y точки пересечения) и два неизвестных (s и t).Как только вы найдете s и t, подключите их к любому из уравнений линий, чтобы получить точку пересечения.

Вот некоторый рабочий код:

static Vect2 getIntersection(Vect2 A, Vect2 B, Vect2 P) {
    Vect2 abDir = B.minus(A);
    Vect2 perpDir = new Vect2(-abDir.y, abDir.x);
    Vect2 apDir = P.minus(A);
    double s = (perpDir.y * apDir.x - perpDir.x * apDir.y)
             / (abDir.x * perpDir.y - abDir.y * perpDir.x);
    return A.plus(abDir.scale(s));
}

class Vect2 {
    final double x, y;

    Vect2(double x, double y) {
        this.x = x;
        this.y = y;
    }

    Vect2 scale(double k) {
        return new Vect2(x * k, y * k);
    }

    Vect2 plus(Vect2 that) {
        return new Vect2(x + that.x, y + that.y);
    }

    Vect2 minus(Vect2 that) {
        return this.plus(that.scale(-1));
    }
}
1 голос
/ 05 марта 2012
1 голос
/ 05 марта 2012

Идея состоит в том, чтобы построить уравнение прямой, проходящей через точки A и B. Когда вы построили это уравнение, вы строите уравнение прямой, проходящей через P и перпендикулярной AB.Уравнение для перпендикуляра имеет коэффициенты, которые легко выводятся из уравнения для AB-линии.Если у вас есть два уравнения, их решение даст вам координату пересечения.

Это для домашней работы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...