преобразование равномерно расположенного прямоугольника angular набор точек - PullRequest
0 голосов
/ 04 августа 2020

У меня есть набор равномерно расположенных точек, образующих прямоугольник (извините за плохой рисунок, представьте, что все точки расположены равномерно), и, применяя угол, я хочу go от левого изображения к правому изображению. Единственная точка, которая НЕ перемещается, - это нижний левый и верхний правый.

Думаю, я могу вывести новые местоположения каждой точки, используя касательную, чтобы получить dx и dy. Но я не уверен, что получу именно то, что хочу. И может быть, к каждой точке можно применить более элегантное преобразование?

введите описание изображения здесь

1 Ответ

0 голосов
/ 04 августа 2020

Итак, мы хотим сохранить две противоположные вершины прямоугольника и диагональ между ними.

Пусть полуширина прямоугольника w, полувысота h, радиус круга r. Пусть начало координат находится в центре круга.

Угол между диагональю и OX равен

theta = atan(h/w)

После преобразования угол между диагональю и нижним краем нового прямоугольника будет

fi = alpha + theta

Таким образом, мы можем найти полуширину нового прямоугольника

nw = r * cos(fi)

И координаты смещенной вершины

2*nw*cos(alpha) - w, -h - 2*nw*sin(alpha)

Мы хотим найти аффинную трансформацию M , которая преобразует два вершины в те же точки и третью вершину в координаты выше

    |-w  w   w|   |-w  w  2*nw*cos(alpha) - w |
M * |-h  h  -h| = |-h  h  -h - 2*nw*sin(alpha)|
    |1   1   1|   |1   1                     1|

Чтобы найти M , мы делаем инверсию левой матрицы и умножаем обе стороны на эту обратную.

M = |nw*cos(alpha)/w     w/h - nw*cos(alpha)/h    0|
    |-nw*sin(alpha)/w    1 +  nw*sin(alpha)/h     0|
    |0                   0                        1|

Теперь мы можем преобразовать все координаты с помощью этой матрицы и получить повернутый прямоугольник.

Пример преобразования координат из моей Delphi программы, генерирующей картинку ниже:

  nX := Round(cx + x * cos(alpha)*nw/w + y * (w/h - cos(alpha)*nw / h));
  nY := Round(cy - x * nw/w*sin(alpha) + y * (1 + nw/h * sin(alpha)));

введите описание изображения здесь

...