Заметьте, что 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));
}
}