Это простое объяснение решения Иль-Бхимы.Хитрость заключается в том, чтобы заметить, что вам нужно проецировать эту точку ортогонально на линию, переместить ее на столько, а затем еще раз переместить в том же направлении.
Для проблем такого типа этопроще работать с немного более избыточным представлением для строки.Вместо y = m x + b
, давайте представим линию точкой p
, которая находится на линии, и вектором d
в направлении линии.Давайте назовем эту точку p = (0, b)
, вектор d = (1, m)
, и ваша точка ввода будет p1
.Проецируемая точка на линии будет pl
, а ваша выходная точка p2
, следовательно, будет p1 + 2 * (pl - p1) = 2 * pl - p1
Формула, которая вам здесь нужна, это проекция вектора v
на линию, которая идетчерез начало координат в направлении d
.Он задается как d * <v, d> / <d, d>
, где <a, b>
- это скалярное произведение между двумя векторами.
Чтобы найти pl
, нам нужно переместить всю задачу так, чтобы линия прошла через начало координат, вычитая p
из p1
, используя приведенную выше формулу, и перемещая ее назад.Затем pl = p + (d * <p - p1, d> / <d, d>)
, так что pl_x = p_x + (b * p1_x) / (1 + m * m)
, pl_y = p_y + (m * p1_x) / (1 + m * m)
, а затем используйте p2 = 2 * pl - p1
, чтобы получить окончательные значения.