Вращение векторной графики - PullRequest
0 голосов
/ 31 января 2012

У меня есть приложение для рисования и редактирования векторной графики в WinForms

У меня есть изображения, прямоугольники, эллипсы, области и т. Д., И я знаю, как изменить их размер движением мыши.Но я не знаю, как вращать их движением мыши.

Я рисую объекты в Graphics.

Я пробовал это, но это не сработало.

g.TranslateTransform((float)(this.Rectangle.X + this.Rectangle.Width / 2), (float)(this.Rectangle.Y + this.Rectangle.Height / 2));
g.RotateTransform(this.Rotation);
g.TranslateTransform(-(float)(this.Rectangle.X + this.Rectangle.Width / 2), -(float)(this.Rectangle.Y + this.Rectangle.Height / 2));
//g.TranslateTransform(-(float)(rect.X + rect.Width / 2), -(float)(rect.Y + rect.Height / 2));

g.DrawImage(img, rect);

g.ResetTransform();

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

1 Ответ

1 голос
/ 31 января 2012

Вам необходимо применить среднюю школьную тригонометрию. Есть много статей, если вы Google "graphics.drawimage вращение"

Но для начала вам НЕ следует преобразовывать сам объект Graphics. Вы просто хотите получить новую ограничивающую рамку вашего изображения. Для этого:

  1. Возьмите ограничивающую рамку изображения с центром в начале координат. Помните, что это определяется как три очка в пользу DrawImage (Изображение, Точка [])

    Point[] boundingBox = { new Point(-width /2, -height/2),
                            new Point(width/2, -height/2), 
                            new Point(-width/2, height/2) };
    
  2. Используйте триг, чтобы повернуть его. Пропустите каждую точку с помощью следующей функции:

    Point rotatePointAroundOrigin(Point point, float angleInDegrees) {
        float angle = angleInDegrees * Math.PI/180; // get angle in radians
        return new Point( point.X * Math.Cos(angle) - point.Y * Math.Sin(angle),
                          point.X * Math.Sin(angle) + point.Y * Math.Cos(angle));
    }
    
  3. Переведите поле привязки туда, куда оно должно идти. Добавьте ширину / 2 и высоту / 2 к каждой из его точек, плюс любую дополнительную сумму, которую вы хотите.

  4. Звоните DrawImage(image, boundingBox)

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