矢量图形的旋转

时间:2012-01-31 13:58:11

标签: c# winforms vector rotation

我有一个在WinForms中绘制和编辑矢量图形的应用程序

我有图像,矩形,椭圆,区域等,我知道如何通过鼠标移动来调整它们的大小。但我不知道如何通过鼠标移动来旋转它们。

我将对象绘制到图形中。

我试过这个,但它不起作用。

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 个答案:

答案 0 :(得分:1)

你需要申请高中三角学。如果你谷歌“graphics.drawimage轮换”

,有很多文章

但首先,你不应该改变Graphics对象本身。您只是想获得图像的新边界框。要做到这一点:

  1. 拍摄以原点为中心的图像边界框。请记住,为了DrawImage(Image,Point [])

    的好处,这被定义为三个点
    Point[] boundingBox = { new Point(-width /2, -height/2),
                            new Point(width/2, -height/2), 
                            new Point(-width/2, height/2) };
    
  2. 使用trig旋转它。通过以下函数为每个点提供信息:

    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. 将boundind框转换为它必须去的位置。为每个点添加宽度/ 2和高度/ 2,加上你想要的额外金额。

  4. 致电DrawImage(image, boundingBox)