Отражение точки над линией - PullRequest
       10

Отражение точки над линией

1 голос
/ 05 августа 2011

Я смотрел на то, как отразить точку на линии, и нашел этот вопрос , который, кажется, делает свое дело, давая эту формулу для вычисления отраженной точки:

Учитывая (x, y) и линию y = ax + c, мы хотим, чтобы точка (x ', y') отразилась на линии.

Установите d: = (x + (y - c) * a) / (1 + a ^ 2)

Тогда х '= 2 * д - х

и y '= 2 * d * a - y + 2c

Однако есть две проблемы с этой реализацией для моих нужд:

  1. Моя строка не описана в форме y = ax + c (поэтому мне пришлось бы перевести ее, что легко сделать, но это означает, что процесс идет медленнее).
  2. Что если a - это бесконечность, т.е. вертикальная линия?

Есть ли простой способ вычислить (x', y'), отражение точки (x, y) в линии, где линия описывается двумя точками (x1, y1) и (x2, y2)?

Edit:

Я нашел формулу, которая делает это, но кажется, что она не работает со строками, которые выглядят так, как будто они имеют уравнение y = x.

Вот это в actioncript:

public static function reflect(p:Point, l:Line):Point
    {
                    // (l.sx, l.sy) = start of line
                    // (l.ex, l.ey) = end of line
        var dx:Number = l.ex - l.sx;
        var dy:Number = l.ey - l.sy;

        if ((dx == 0) && (dy == 0))
        {
            return new Point(2 * l.sx - p.x, 2 * l.sy - p.y);
        }
        else
        {
            var t:Number = ((p.x - l.sx) * dx + (p.y - l.sy) * dy) / (dx * dx + dy * dy);
            var x:Number = 2 * (l.sx + t * dx) - p.x;
            var y:Number = 2 * (l.sy + t * dy) - p.y;
            return new Point(x, y);
        }
    }

Кто-нибудь знает, где эта формула идет не так? Я все еще рад принять другие решения, кроме приведенной выше формулы - все, что будет работать!

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Найдите вектор нормали из точки на линию и дважды добавьте его к точке. См. википедию для формулы.

Если вы выразите все в векторах, у вас не будет проблем с бесконечным наклоном.

;; line defined by ax+by+c=0
;; normal (a b) and distance from origin -c
(defun reflect-point-on-line (a b c px py)
  (/ (+ (* a px)
    (* b py)
    c)
     (sqrt (+ (expt a 2) (expt b 2)))))
#+nil ;; y-axis to (2 1)
(reflect-point-on-line 1 0 0 2 1) ;; => 2
#+nil ;; x-axis to (4 5)
(reflect-point-on-line 0 1 0 4 5) ;; => 5
0 голосов
/ 06 августа 2011

Если ваша линия 45 градусов ... y = x ..., тогда ваша точка (x1, y1) - это один угол квадрата, на вашей линии есть две точки, которые соответствуют вашей точке (x1 + расстояние доline, y1) и (x1, y1 плюс расстояние до линии), а искомая точка находится в противоположном углу, нет?

Если вы найдете свое расстояние, вы сможете добавить их в свойкоординаты и получить новую точку.

...