Зеркально отразить отрезок - PullRequest
1 голос
/ 10 сентября 2011

У меня есть отрезок (x1, y1), (x2, y2), который мне нужно «отразить», поэтому новая линия становится перпендикулярной первой и проходит через ее середину.

Сегмент линии (0,0), (2,2) должен возвращать новый сегмент линии (0,2), (2,0)

Может кто-нибудь помочь мне с функцией / формулой, чтобы справиться с этим?

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011

Средняя точка (mx, my) = ((x1 + x2) / 2, (y1 + y2) / 2).

Чтобы повернуть конечные точки на 90 градусов относительно середины, сначала вычислите вектор:

(dx,dy) = (x1-mx),(y1-my)

затем поверните его на 90 градусов:

dx1 = -dy
dy1 = dx

Тогда новая точка станет:

x1 = mx+dx1
y1 = my+dy1

Повторите для x2, y2.

Вы также можете комбинировать шаги, если вы осторожны.

2 голосов
/ 10 сентября 2011

Кажется, вы ищете симметрию. хорошо, хороший способ сделать это - использовать матрицу масштабирования .

scaling_matrix

vx, vy, vz - коэффициент масштабирования. px, py, pz - это координаты точки. Если вы умножите масштабную матрицу на координату точки, вы получите масштабированные координаты этой точки.

Масштабирующая матрица с vx = vy = vz = 1 является тождественным преобразованием. Для получения зеркального эффекта вы можете просто инвертировать матричный коэффициент оси, на которой вы хотите выполнить симметрию.

Например:

1  0 0|px

0 -1 0|py

0  0 1|pz

вычислит симметричную точку данного вектора относительно оси y.

...