Вопрос

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

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

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

Это было полезно?

Решение

Геометрия против зернистости использует базовый метод для определения масштабирования преобразования (реализация найдена в 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 также содержит предупреждение о том, что существуют вырожденные случаи, когда это не будет работать корректно, но это может быть полезно в вашей ситуации.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top