У меня есть 2D-координаты геометрической формы в виде массивов x
и y
. Используя комбинацию переноса и вращения, я могу повернуть фигуру вокруг своего геометрического центра на заданный угол alpha
(см. ниже минимальный пример).
Как показано в приведенном ниже коде, этого можно достичь, сначала сдвинув геометрический центр фигуры к началу координат, затем применив поворот (умножив его на матрицу двумерного поворота), а затем переместив его обратно в исходное положение.
В этом примере предположим, что фигура представляет собой прямоугольник:
import numpy as np
from numpy import cos, sin, linspace, concatenate
import matplotlib.pyplot as plt
def rotate(x, y, alpha):
"""
Rotate the shape by an angle alpha (given in degrees)
"""
# Get the center of the shape
x_center = (x.max() + x.min()) / 2.0
y_center = (y.max() + y.min()) / 2.0
# Shifting the center of the shape to the origin of coordinates
x0 = x - x_center
y0 = y - y_center
angle_rad = np.deg2rad(alpha)
rot_mat = np.array([
[cos(angle_rad), -sin(angle_rad)],
[sin(angle_rad), cos(angle_rad)]
])
xy = np.vstack((x0, y0))
xnew, ynew = rot_mat @ xy
# translate it back to its original location
xnew += x_center
ynew += y_center
return xnew, ynew
z0, z1, z2, z3 = 4 + 0.6*1j, 4 + 0.8*1j, 8 + 0.8*1j, 8 + 0.6*1j
xy = concatenate((
linspace(z0, z1, 10, endpoint=False),
linspace(z1, z2, 10, endpoint=False),
linspace(z2, z3, 10, endpoint=False),
linspace(z3, z0, 10, endpoint=True)
))
x = xy.real
y = xy.imag
xrot, yrot = rotate(x, y, alpha=-45.0)
# The x and y limits
xlow, xup = 0, 10
ylow, yup = -1.5, 3.0
plt.plot(x, y, label='original shape')
plt.plot(xrot, yrot, label='rotated shape')
plt.xlim((xlow, xup))
plt.ylim((ylow, yup))
plt.legend()
plt.show()
Получаем следующий сюжет:
Как вы можете видеть, фигура поворачивается, но также растягивается/искажается, потому что аспект не был установлен на equal
. мы могли бы проверить это, установив:
plt.gca().set_aspect('equal')
И это показывает повернутую форму без перекоса:
Проблема в том, что я строю эту фигуру с другими данными, у которых диапазон x
намного больше, чем диапазон y
. Таким образом, установка равного аспекта не является решением в этом случае.
Чтобы быть более точным, я хочу, чтобы повернутая форма (оранжевый цвет) на первом рисунке отображалась правильно, как на втором рисунке. Мой подход заключается в том, чтобы найти матрицу обратного перекоса на первом рисунке (результат разницы между пределами x и y) и умножить ее на повернутую форму, чтобы получить ожидаемый результат.
К сожалению, методом проб и ошибок я не смог получить правильную косую матрицу.
Любая помощь приветствуется.
РЕДАКТИРОВАТЬ С точки зрения линейной алгебры, как выразить эту деформацию повернутой фигуры на первом рисунке с помощью преобразований наклона и масштабирования?
xlim
иylim
. - person s.ouchene   schedule 16.01.2020theta
в ссылке). Эта матрица будет иметь 4 значения, которые варьируются в зависимости от полярного угла и радиального расстояния до каждой точки, но в компонентеx
больше, чем в компонентеy
. Создать такую матрицу на лету можно, но это будет.... сложно - person William Miller   schedule 16.01.2020