如何使用矩阵旋转矩形并获取修改后的矩形?

时间:2018-04-17 19:09:14

标签: c# matrix rotation

我搜索了矩形旋转的所有链接,但似乎没有任何内容适用于我的问题。我有一个RectangleF结构,并希望将其提供给旋转矩阵。然后使用生成的RectangleF传递给其他函数。

想要使用矩阵的原因是因为我可能还想要执行转换,然后可能需要进行缩放,然后将结果矩形传递给其他函数,例如

RectangleF original = new RectangleF(0,0, 100, 100);
Matrix m = new Matrix();
m.Rotate(35.0f);
m.Translate(10, 20);

....   (what do I do here ?)

RectangleF modified = (How/where do I get the result?)

SomeOtherFunction(modified);

我怎样才能做到这一点?

我不想在屏幕上或其他任何地方绘制此矩形。我只需要这些值,但我读过的所有例子都使用图形类进行转换和绘制,这不是我想要的。

非常感谢

2 个答案:

答案 0 :(得分:1)

System.Drawing.Rectangle结构始终是正交的,不能旋转。您只能旋转其角点。

以下是使用Matrix执行此操作的示例:

Matrix M = new Matrix();

// just a rectangle for testing..
Rectangle R = panel1.ClientRectangle;
R.Inflate(-33,-33);

// create an array of all corner points:
var p = new PointF[] {
    R.Location,
    new PointF(R.Right, R.Top),
    new PointF(R.Right, R.Bottom),
    new PointF(R.Left, R.Bottom) };

// rotate by 15° around the center point:
M.RotateAt(15, new PointF(R.X + R.Width / 2, R.Top + R.Height / 2));
M.TransformPoints(p);

// just a quick (and dirty!) test:
using (Graphics g = panel1.CreateGraphics())
{
    g.DrawRectangle(Pens.LightBlue, R);
    g.DrawPolygon(Pens.DarkGoldenrod, p );
}

诀窍是创建一个PointPointF数组,其中包含您感兴趣的所有点,这里是四个角;然后,Matrix可以根据您要求的各种事项转换这些点,轮换围绕其中一个点。其他包括缩放剪切翻译 ..

结果如预期:

enter image description here

如果您需要反复使用,则需要创建将Rectangle转换为Point []并返回的函数。

注意,如上所述,后者实际上是不可能的,因为 Rectangle将始终是正交的,即无法旋转,所以你将不得不去角落点。或者切换到Rect命名空间中的System.Windows类,如Quergo在帖子中所示。

答案 1 :(得分:0)

如果可以/想要使用System.Windows命名空间

,请使用Rect
        var original = new Rect(0, 0, 100, 100);

        var m = new Matrix();
        m.Rotate(45.0f);
        m.Translate(0, 20);

        original.Transform(m);

        Rect transformed = Rect.Transform(original, m);