найти точку, перпендикулярную заданной прямой

Я хочу найти точку z(x3,y3), которая перпендикулярна данной линии. В моем примере мне даны 2 координаты A(x1, y1) и B(x2, y2). Я хочу найти точку z, которая перпендикулярна (AZ) к линии AB и на расстоянии (h) от точки B. Угол ABZ равен 90. вот мой код С++.

double AB_slope = m; // know it

// находим точку z, которая перпендикулярна линии AB

double AZ_slope = - 1/m;

double x3 = x2 + prescribed_distance * dx;

double y3 = y2 + prescribed_distance * dy;

Но я не знаю, как найти dx, dy и предписанное_расстояние. пожалуйста, помогите мне.


person devan    schedule 10.07.2011    source источник
comment
Точка не может быть перпендикулярна прямой.   -  person Gedrox    schedule 10.07.2011
comment
Это математический вопрос, задайте его на math.stackexchange.com.   -  person Benjamin Lindley    schedule 10.07.2011
comment
включает ли условие задачи значение h или вы хотите просто найти любую точку линии, которая проходит через A и ортогональна AB?   -  person eugene_che    schedule 10.07.2011
comment
@devan, если вам нужна помощь, вам нужно принять участие и больше объяснить, что вы хотите.   -  person Lance Roberts    schedule 10.07.2011


Ответы (1)


Позвольте мне перефразировать ваш вопрос так, как я думаю, а затем ответить на него.

Вам начисляются баллы A = (x1, y1) и B = (x2, y2). Вы хотите найти точку Z = (x3, y3) такую, что AZ перпендикулярна AB, а BZ имеет длину h.

Вектор от A до B равен v = (x2 - x1, y2 - y1). Перпендикулярный вектор к этому легко вычислить w = (y2 - y1, x1 - x2). Линия, пересекающая A и перпендикулярная AB, представлена ​​F(s) = A + s*w = (x1 + s*(y2 - y1), y1 + s*(x1 - x2)), поскольку s находится в диапазоне действительных чисел. Итак, нам нужно выбрать значение s так, чтобы F(s) было на расстоянии h от B.

По теореме Пифагора квадрат длины от F(s) до B всегда будет квадратом расстояния от F(s) до A плюс квадрат расстояния от A до B. Из которого мы получаем беспорядочное выражение, которое нам нужно:

h**2 = s**2 * ((y2 - y1)**2 + (x1-x2)**2) + ((x1 - x2)**2 + (y1 - y2)**2))
     = s**2 * ((x1 - x2)**2 + (y1 - y2)**2)) + ((x1 - x2)**2 + (y1 - y2)**2))
     = (s**2 + 1) * ((x1 - x2)**2 + (y1 - y2)**2))

(s**2 + 1) = h**2 / ((x1 - x2)**2 + (y1 - y2)**2))

s**2  = h**2 / ((x1 - x2)**2 + (y1 - y2)**2)) - 1

s = sqrt(h**2 / ((x1 - x2)**2 + (y1 - y2)**2)) - 1)

Теперь подставьте это выражение для s обратно в F(s) = (x1 + s*(y2 - y1), y1 + s*(x1 - x2)), и вы получите свою точку зрения Z. И другой возможный ответ — такое же расстояние с другой стороны.

person btilly    schedule 10.07.2011
comment
Существует бесконечное количество точек, которые находятся на расстоянии h от точки B (при реалистичном h > AB), и линию, которую можно провести перпендикулярно AB через точку A. На самом деле множество всех этих точек описывает окружность с центром вокруг точки A. - person Lance Roberts; 11.07.2011
comment
@Lance Roberts В трех измерениях набор таких точек будет описывать круг. В 4-х измерениях он образует сферу. Но указанный код был для 2-х измерений, и тогда вы получите 2 балла. Техника, которую я дал, находит эти точки. - person btilly; 11.07.2011
comment
Хорошо, в 2D конечно, +1. (хотя мы можем никогда не узнать, чего на самом деле хочет ОП). - person Lance Roberts; 11.07.2011
comment
@btilly Пожалуйста, не могли бы вы уточнить значение ** в этом ответе? например h**2 - person Samuel Harmer; 11.06.2012
comment
@ Styne666 Styne666 Это означает возведение в степень. Во многих языках программирования, производных от C (например, C, C++, Java, Perl, Ruby, ...) ^ означает исключающее ИЛИ, поэтому ** вместо этого используется для возведения в степень. - person btilly; 11.06.2012
comment
@btilly А, но C++ , похоже, не имеет **. Вот почему я никогда не видел его! Спасибо. - person Samuel Harmer; 11.06.2012
comment
@ Styne666 ты прав. Я просто предположил, что математические операторы в Perl были взяты из C вместе с таблицей приоритетов, но я ошибался. Однако Java, Perl и Ruby используют ** для показателей степени. - person btilly; 11.06.2012