Я смотрел на то, как отразить точку на линии, и нашел этот вопрос , который, кажется, делает свое дело, давая эту формулу для вычисления отраженной точки:
Учитывая (x, y) и линию y = ax + c, мы хотим, чтобы точка (x ', y') отразилась на линии.
Установите d: = (x + (y - c) * a) / (1 + a ^ 2)
Тогда х '= 2 * д - х
и y '= 2 * d * a - y + 2c
Однако есть две проблемы с этой реализацией для моих нужд:
- Моя строка не описана в форме
y = ax + c
(поэтому мне пришлось бы перевести ее, что легко сделать, но это означает, что процесс идет медленнее).
- Что если
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);
}
}
Кто-нибудь знает, где эта формула идет не так? Я все еще рад принять другие решения, кроме приведенной выше формулы - все, что будет работать!