Хорошо, я собираюсь дать вам метод поваренной книги, чтобы сделать это. Если вам интересно, как я его вывел, скажите мне, и я объясню.
Даны (x1, y1)
и прямая y = mx + c
, нам нужна точка (x2, y2)
, отраженная на прямой.
Задайте d:= (x1 + (y1 - c)*m)/(1 + m^2)
Тогда x2 = 2*d - x1
и y2 = 2*d*m - y1 + 2*c
Эта ссылка содержит алгоритм, похожий на то, что вы пытаетесь сделать:
То есть отражение луча от нормали.
Это простое объяснение решения Иль-Бхимы. Хитрость заключается в том, чтобы заметить, что вам нужно спроецировать эту точку перпендикулярно линии, переместить ее на столько, а затем переместить еще раз в том же направлении.
Для этого типа проблем легче работать с несколько более избыточным представлением строки. Вместо 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 *
, где
- скалярное произведение между двумя векторами.
Чтобы найти / pl
, мы должны переместить всю задачу так, чтобы прямая проходила через начало координат, вычитая p
из p1
, используя приведенную выше формулу , и перемещая его обратно. Тогда pl = p + (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
, чтобы получить окончательные значения. .