преобразование координат в повернутую систему координат - PullRequest
2 голосов
/ 23 августа 2011

Я пытаюсь преобразовать параметры поворота и обрезки прямоугольника старого графического редактора в новый редактор, который использует другую систему координат, чем старая. Следующая картина иллюстрирует проблему:

rectangles illustration

Все прямоугольники имеют одинаковое соотношение сторон (например, 3: 2), и все координаты нормализованы по краям (то есть от 0 до 1 как в направлении X, так и в направлении Y).

Старая программа сохраняет координаты углов синего прямоугольника C, заданные в системе координат, выровненной по зеленому прямоугольнику (с началом в A), и угол поворота желтого прямоугольника.

Новая программа нуждается в координатах углов синего прямоугольника в системе координат, выровненной по желтому прямоугольнику (с началом в B). Как мне сделать преобразование из старого в новое?

Это похоже на простую математическую задачу, но прошло столько лет с математических классов, что я не мог понять это ни с помощью ручки, ни с помощью бумаги, ни поиска по этому сайту (много похожих вопросов, но я не мог найти довольно соответствующий ...)

1 Ответ

2 голосов
/ 23 августа 2011

Пусть c(0), c(1), c(2), c(3) будет четырьмя углами C, и пусть b(0) будет углом B, в котором расположена система координат B. Пусть q будет углом поворота оси x B. Все эти углы и точки должны быть заданы в одной системе координат.

Чтобы найти координаты c(i) в B, поверните вектор c(i) - b(0) на угол q (или -q в зависимости от того, как измеряются вещи). Вы можете использовать матрицу вращения для этого. Пусть cq = cos(q), sq = sin(q) и (dx, dy) = c(i) - b(0). Тогда координаты c(i) в B равны

Product of the rotation matrix for q and (dx, dy)


Пусть c = (c(0) + c(2)) / 2 будет центром C. Пусть S(s) будет матрицей, которая масштабируется на s, и пусть R(q) будет матрицей, которая вращается на q. Углы B задаются как

b(i) = c + S(s) * R(q) * (c(i) - c)

Углы a(0), a(1), a(2), a(3) прямоугольника A также известны. Мы хотим определить максимально возможное значение параметра масштабирования s, чтобы все точки b(i) из B находились в прямоугольнике A.

Я думаю, что самый безопасный и простой подход здесь - рассмотреть соответствующие пары b(i) и a(i), и для таких пар вычислить наибольшее значение s(i, j), так что если s = s(i, j), то b(i) находится в угловой области a(j).

Пусть a(0) и a(2) будут противоположными углами A, и пусть c(0) и c(1) будут смежными углами C. Пусть r(j) = a(j) - c и d(i) = R(q) * (c(i) - c).

Каждая диагональ i может быть масштабирована на

s(i, j) = min (|r(j).x| / |d(i).x|, |r(j).y| / |d(i).y|)

до того, как B выйдет за пределы области, определенной r(j). Вычислите s(i, j) для i = 0, 1 и j = 0, 2 и пусть s будет минимумом из этих 4 значений.


В зависимости от того, как измеряется q, может потребоваться применить преобразование q' = atan2(kx * sin(q), ky * cos(q)) к q, чтобы учесть проблемы с соотношением сторон.

...