【问题标题】:Matrix Transform of Rectangle after changing its bounds更改边界后矩形的矩阵变换
【发布时间】:2014-03-29 15:58:13
【问题描述】:

我有一个形状,例如一个具有以下边界的矩形:

X = 100
Y = 100
Width = 100
Height = 100

我使用新的Matrix 对该矩形应用以下旋转:

X = 100
Y = 100
Angle = 45

var transform = new Matrix();
transform.RotateAt(angle, point);

所以新的矩阵有以下值:

0.7071068, 0.7071067, -0.7071067, 0.7071068, 150, -62.13202

我在用Graphic 绘制矩形时使用这个矩阵:

protected override void OnPaint(PaintEventArgs e)
{
    ...
    e.Graphic.Transform = transform;
    g.DrawRectangle(Pen, bounds.X, bounds.Y, bounds.Width, bounds.Height);
}

问题如下:在某个点我需要绘制相同的 Rectangle 但偏移了某个偏移量,例如 (50, 50)。我已经存储了矩阵变换和矩形边界。如果我只更改边界(添加偏移量),新的 Rectangle 将被绘制在错误的位置,可能是由于之前的旋转点。

我必须如何更改矩阵才能在“正确”位置绘制我的矩形?也就是说,我怎样才能找回正确的旋转点和旧的旋转角度?

【问题讨论】:

    标签: c# winforms graphics matrix transform


    【解决方案1】:

    尝试使用MatrixOrder.Prepend向矩阵添加平移。
    对于偏移量(50, 50),它将是:

    transform.Translate(50, 50, MatrixOrder.Prepend);
    

    或者为这种情况创建一个单独的矩阵:

    var transformWithOffset = new Matrix();
    transformWithOffset.Translate(50, 50);
    transformWithOffset.RotateAt(angle, point);
    

    【讨论】:

    • 因为如果我的矩阵存储了 45 度的旋转,例如,平移就会出错。矩形将沿 X 轴平移,X 轴也旋转 45°。
    • 我既没有角度也没有点,我只有矩阵和矩形边界...
    • 我已经更新了我的初始答案,添加了MatrixOrder.Prepend 作为Translate 方法的第三个参数。请修改。
    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2022-01-17
    • 2018-02-21
    相关资源
    最近更新 更多