Поворот 2D вектора с соотношением сторон

Многие из нас знакомы с подходом к вращению 2D вектора вокруг начала координат с учетом угла theta:

newX = x * cos(theta) - y * sin(theta);
newY = x * sin(theta) + y * cos(theta);

Я сейчас пытаюсь повернуть координаты в изображении УФ-пространства, которое выглядит так:

UV Space

(Изображение заимствовано из этот ТАК вопрос.)

Здесь единицы u оси шире, чем у v ось, поэтому подход выше приводит к координатам, вращающимся вокруг эллипса, а не круга. Мне нужно, чтобы вектор вращался так, как если бы координаты были квадратными, то есть необходимо учитывать соотношение сторон. Я думал, что это будет так же просто, как растянуть координаты в квадратное пространство, вращать, а затем растягивать назад, хотя кажется, что векторы вращаются эллиптически:

newX = (x * cos(theta) * Aspect - y * sin(theta)) / Aspect;
newY = x * sin(theta) * Aspect + y * cos(theta);

Любая помощь приветствуется, спасибо заранее!

2

Решение

Общая версия для вращения и соотношения сторон:

(center_c, center_y) является центром вращения

(aspect_x, aspect_y) является аспектом

tmp_x = (x-center_x)/aspect_x
tmp_y = (y-center_y)/aspect_y
tmp_x = tmp_x * cos(theta) - tmp_y * sin(theta)
tmp_x = tmp_x * sin(theta) + tmp_y * cos(theta)
new_x = aspect_x*tmp_x-center_x
new_y = aspect_y*tmp_x-center_y

Надеюсь, это поможет.

0

Другие решения

Других решений пока нет …