Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Преобразования над объектом Graphics


Автор: marshal64 20.3.2011, 19:43
Есть примерно такой код:
Код
class DrawObject
{
      public PointF Location { get; set; } // положение верхнего левого угла без учета поворота
      public float ScaleX { get; set; }
      public float ScaleY { get; set; }
      public float Rotation { get; set; }
      public PointF RotationCenter { get; set; }
      
      public void Draw(Graphics g) { ... }
}

class Form1 : Form
{
      DrawObject drawObj;
      ...
      protected override void OnPaint(PaintEventArgs e)
      {
            Matrix matrix = new Matrix();
            matrix.Translate(drawObj.Location.X,            
                             drawObj.Location.Y);
            matrix.Scale(drawObj.ScaleX,  
                         drawObj.ScaleY);                            
            matrix.RotateAt(drawObj.Rotation, 
                            drawObj.RotationCenter);
            e.Graphics.Transform = matrix;
            drawObj.Draw(e.Graphics);
      }
}


Нужно, чтобы объект DrawObject переносился в положение Location, масштабировался на ScaleX и ScaleY относительно Location и вращался на угол Rotation относительно RotationCenter, который тоже должен автоматически масштабироваться.
Примерно так все и делается за исключением одного: когда объект начинает масштабироваться при ненулевом угле поворота, то он масштабируется не относительно Location, а как-то по осям.
Если же меняется последовательность масштабирования и поворота (сначала поворот, потом масштабирование), то уже масштабирование происходит относительно Location, а вот поворот начинает происходить, что логично, относительно немасштабированного центра.
В чем может быть моя ошибка, или необходимый мне вариант таким образом вообще нереализуем?

Автор: -Mikle- 22.3.2011, 16:42
Попробуйте в такой последовательности:
1) RotateAt
2) Scale
3) Translate

Если вы имеете ввиду что вам нужно поворачивать и масштабировать относительно другого центра (не Location), то надо завести еще одно свойство - TransformOrign (с абсолютным или относительным позиционированием, как хотите).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)