преобразование координат в повернутую систему координат

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

иллюстрация прямоугольников

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

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

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

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


person JPK    schedule 23.08.2011    source источник
comment
Вероятно, я недостаточно ясно описал известные переменные. Известны только координаты прямоугольника C и угол поворота от оси X (все в системе координат A). Координаты Б не известны. однако известно, что соотношение сторон A и B одинаково, и B является самым большим прямоугольником, который может поместиться внутри A. Прямоугольник C может фактически находиться где угодно внутри прямоугольника A и может иметь другое соотношение сторон.   -  person JPK    schedule 24.08.2011
comment
Дополнительное ограничение, которое должно облегчить вычисление B: прямоугольник B находится в центре прямоугольника A.   -  person JPK    schedule 24.08.2011


Ответы (1)


Пусть 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 тогда

Произведение матрицы вращения для q и (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) прямоугольника А также известны. Мы хотим определить максимально возможное значение параметра масштабирования 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 для учета проблем соотношения сторон.

person antonakos    schedule 23.08.2011
comment
К сожалению, это не решает всей проблемы, так как b(0) неизвестно (см. мой комментарий выше). Тем не менее это было полезно, так как теперь я понимаю, что на самом деле это две независимые проблемы, и вы ответили на последнюю. Теперь я должен узнать координаты b(0) с учетом ограничений соотношения сторон A и B, а затем я могу использовать вашу формулу для преобразования любого типа C. - person JPK; 24.08.2011
comment
@JPK Я добавил расширенное обсуждение. - person antonakos; 24.08.2011
comment
Ваш ответ, кажется, предполагает, что прямоугольник C всегда будет иметь то же соотношение сторон, что и A и B, что не всегда верно. Однако, заменив C на повернутый A, затем найдя s с помощью вашего алгоритма, я могу вычислить b(i), после чего я могу повернуть координаты C. Большое спасибо за вашу помощь! - person JPK; 25.08.2011