Сбросить масштаб в матрице преобразования GDI + - PullRequest
3 голосов
/ 11 мая 2009

Я пишу функцию для рисования маркеров пользовательского интерфейса (поворот, изменение размера и т. Д.) В моей клиентской области в приложении Windows Forms. Функция вызывается при выделении объекта.

Вызывающий отправляет мне графический объект, правильно повернутый, масштабированный и переведенный в соответствии с более широкой схемой вещей (выбранный объект имеет свое собственное вращение / перемещение / масштаб, а дескриптор пользовательского интерфейса имеет относительный перевод и вращение относительно выбранного объекта ). Теперь я хочу, чтобы мои дескрипторы пользовательского интерфейса были одинакового размера независимо от масштаба родительского элемента (выделенного объекта).

Как мне устранить / сбросить масштабный коэффициент в матрице преобразования? Как мне сбросить масштаб до 1, сохранив ценные значения перевода и вращения?

Ответы [ 2 ]

1 голос
/ 05 июня 2009

Антизерновая геометрия использует базовый метод определения масштабирования преобразования (реализация находится в agg_trans_affine.cpp) Это делается путем:

  1. Расчет вращения преобразования
  2. Дублирование преобразования и применение противоположного вращения
  3. Преобразование двух известных точек и вычисление масштаба из результата

В переводе на C # это выглядит так:

Matrix transform = (Matrix)graphics.Transform.Clone();

PointF[] rotationPoints = new PointF[] { new PointF(0, 0), new PointF(1, 0) };
transform.TransformPoints(rotationPoints);

double rotationRadians = Math.Atan2(rotationPoints[1].Y - rotationPoints[0].Y, rotationPoints[1].X - rotationPoints[0].X);
transform.Rotate((float)(-rotationRadians * (180.0 / Math.PI)));

PointF[] scalePoints = new PointF[] { new PointF(0, 0), new PointF(1, 1) };
transform.TransformPoints(scalePoints);

float xScale = scalePoints[1].X - scalePoints[0].X;
float yScale = scalePoints[1].Y - scalePoints[0].Y;

Код AGG также содержит предупреждение о том, что существуют вырожденные случаи, когда это не будет работать правильно, но это может быть полезно для вашей ситуации.

1 голос
/ 11 мая 2009

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

Может быть, просто вести учет примененной шкалы (назовем это currentscale) и добавить шкалу 1/currentscale к вашим преобразованиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...