Как вычислить перпендикуляр к прямой?
Известны две точки прямой, например, {100, 100} и {200, 200}, и есть точка, не лежащая на прямой, например {200, 100}. Как определить, в какой точке относительно прямой будет перпендикуляр, если провести линию? Желателен ответ в коде Java.
Ответы (3 шт):
В общем виде - вот:
double x1 = 100, y1 = 100, x2 = 200, y2 = 200, x3 = 200, y3 = 100;
double x = (x1 * x1 * x3 - 2 * x1 * x2 * x3 + x2 * x2 * x3 + x2 *
(y1 - y2) * (y1 - y3) - x1 * (y1 - y2) * (y2 - y3)) / ((x1 - x2) *
(x1 - x2) + (y1 - y2) * (y1 - y2));
double y = (x2 * x2 * y1 + x1 * x1 * y2 + x2 * x3 * (y2 - y1) - x1 *
(x3 * (y2 - y1) + x2 * (y1 + y2)) + (y1 - y2) * (y1 - y2) * y3) / ((
x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
Такой ответ устраивает? Упростите уж сами, ладно?...
Update
Раз желание узнать КАК прозвучало... Все просто.
Ищем точку (x,y), которая лежит на прямой через точки (x1,y1) и (x2,y2), и прямая через точки (x,y) и (x3,y3) перпендикулярна прямой через точки (x1,y1) и (x2,y2).
Первое условие -
Ну, а второе - произведение наклонов должно давать -1 (Уравнение прямой - y = kx + b, и для перпендикулярных прямых k1*k2 = -1):
А дальше просто решаем эту систему уравнений...
Для начала нужно найти уравнение прямой, к которой требуется провести перпендикуляр:
В вашем случае оно простое: y = 1x + 0 (прямая y = ax + b)
Далее уравнение перпендикуляра к прямой через точку M(x1; y1) можно найти так:
Упрощаем и получаем y = -x + 300
Решаем систему уравнений, чтобы найти точку пересечения прямых:
y = -x + 300
y = x
x = -x + 300
x = 150
y = 150
Итоговые уравнения, на мой взгляд, будут красивее, если сделать некоторые предварительные подстановки:
double a = x2 - x1;
double b = y2 - y1;
Фактически, это координаты направляющего вектора прямой. Систему же я составлял исходя из того, что перпендикулярный вектор имеет координаты (-b, a).
И по желанию дополнительно некоторые выражения, чтоб не считать их несколько раз:
double a_sq = a * a;
double b_sq = b * b;
double ab = a * b;
double a_sq_plus_b_sq = a_sq + b_sq;
Тогда координаты искомой точки:
double x = (a_sq * x3 + ab * (y3 - y1) + b_sq * x1) / a_sq_plus_b_sq;
double y = (a_sq * y1 + ab * (x3 - x1) + b_sq * y3) / a_sq_plus_b_sq;
Стоит также отдельно обработать случай, когда a^2 + b^2 равно нулю, то есть когда точки, задающие прямую, совпадают.




