Матрица преобразования для просмотра 2D чертежа - PullRequest
1 голос
/ 09 октября 2011

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

Координаты окна и вида - X вправо и Y вниз.

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

Область просмотра может отображаться любым прямоугольником на экране.Это показывает рисунок в области 80% x80%, оставляя некоторые поля вокруг.

Размер чертежа имеет ширину х высоту.Программа должна показывать чертеж с одинаковым масштабным соотношением в обоих направлениях.Центр рисунка сопоставляется с центром области просмотра.чертеж можно повернуть на любой угол от 0 до 360 градусов.

Какова общая матрица преобразования для этого, учитывая следующие данные:

  1. ширина и высота чертежа
  2. Угол поворота
  3. ширина и высота зоны обзора
  4. Поля вокруг рисунков

1 Ответ

2 голосов
/ 09 октября 2011

Сначала вам понадобится ширина / высота поля, содержащего повернутое изображение

x0 = image_width/2 * cos(angle) + image_height/2 * sin(angle)
x1 = image_width/2 * cos(angle) - image_height/2 * sin(angle)
y0 = image_width/2 * sin(angle) + image_height/2 * cos(angle)
y1 = image_width/2 * sin(angle) - image_height/2 * cos(angle)
rotated_width = max(abs(x0), abs(x1)) * 2
rotated_height = max(abs(y0), abs(y1)) * 2

тогда вам нужно вычислить, какое из двух измерений будет ограничением масштабирования

sf = min((view_width - 2*border) / rotated_width,
         (view_height - 2*border) / rotated_height)

тогда вы можете вычислить матрицу преобразования 3x2

m11 = sf*cos(angle)
m12 = sf*sin(angle)
m21 = -sf*sin(angle)
m22 = sf*cos(angle)
m31 = view_width/2 - image_width/2 * m11 - image_height/2 * m21
m32 = view_height/2 - image_width/2 * m12 - image_height/2 * m22
...