【愚公系列】2023年11月 GDI+绘图专题 Matrix

举报
愚公搬代码 发表于 2023/11/29 22:38:41 2023/11/29
【摘要】 🏆 作者简介,愚公搬代码🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物...

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

WinForm中的Matrix是一个矩阵类,用于表示二维矩阵。它属于System.Drawing命名空间下的Matrix类。Matrix类表示一个二维仿射变换矩阵,其中包含有关旋转、平移、缩放和倾斜的信息。这个类可以用于WinForm中的图形变换、图形绘制以及几何计算等方面。

Matrix类中提供了一些常用的操作,比如平移、旋转、缩放、倾斜等等。这些操作可以用于计算点的变换以及图形的变换。例如,可以将一个图片旋转一定角度、缩放或者平移一定距离,然后再将它绘制到画布上。

使用Matrix类时,需要首先创建一个Matrix对象,然后调用其中的方法进行操作。例如,以下代码创建了一个Matrix对象,并将它平移了10个像素的距离:

Matrix matrix = new Matrix();
matrix.Translate(10, 0);

除了平移之外,还可以使用其他方法来进行旋转、缩放和倾斜等操作。Matrix类除了提供变换操作,还提供了很多辅助方法,如GetElements()用于获取矩阵元素,Invert()用于获取矩阵的逆矩阵等等。

🚀一、Matrix

🔎1.属性

  1. Elements属性:
    Elements属性返回一个数组,包含了矩阵中的6个元素,即a、b、c、d、e和f,表示二维矩阵的变换参数。其中,a、b、c和d用于表示缩放和旋转参数,e和f用于表示平移参数。通过修改这些元素,可以实现二维矩阵的变换。下面是一个示例:
Matrix matrix = new Matrix(1, 0, 0, 1, 50, 50);
float[] elements = matrix.Elements;
foreach (float element in elements)
{
    Console.WriteLine(element);
}

输出结果为:

1
0
0
1
50
50
  1. IsIdentity属性:
    IsIdentity属性返回一个布尔值,表示当前矩阵是否为单位矩阵。如果矩阵全为1,表示没有任何变换,则返回true,否则返回false。以下是一个示例:
Matrix matrix = new Matrix();
bool isIdentity = matrix.IsIdentity;
Console.WriteLine(isIdentity); // 输出true
  1. IsInvertible属性:
    IsInvertible属性返回一个布尔值,表示矩阵是否可逆。如果可逆,则返回true,否则返回false。以下是一个示例:
Matrix matrix = new Matrix(2, 0, 0, 0, 0, 0);
bool isInvertible = matrix.IsInvertible;
Console.WriteLine(isInvertible); // 输出false
  1. OffsetX和OffsetY属性:
    OffsetX和OffsetY属性返回一个值,表示矩阵在X和Y轴上的平移量。以下是一个示例:
Matrix matrix = new Matrix(1, 0, 0, 1, 50, 60);
float offsetX = matrix.OffsetX;
float offsetY = matrix.OffsetY;
Console.WriteLine(offsetX); // 输出50
Console.WriteLine(offsetY); // 输出60

注意:Matrix类是一个值类型,因此在修改Matrix对象时,需要重新赋值给一个新的Matrix对象,而不能直接修改原来的Matrix对象。

🔎2.构造函数

Matrix是WinForm中的一个类,用于在二维平面上进行各种图形变换,例如旋转、平移、缩放等。Matrix类提供了多个构造函数,下面分别介绍Matrix(Rectangle,Point[])和Matrix(Single, Single, Single, Single, Single, Single)这两个构造函数。

  1. Matrix(Rectangle,Point[])构造函数

该构造函数用于创建一个矩阵,该矩阵定义了从一个矩形到另一个矩形的映射。其参数为一个源矩形和目标矩形以及一个可选的四个点。如果提供了四个点,则会创建一个非线性矩阵。

示例代码:

// 创建一个源矩形和目标矩形
Rectangle sourceRect = new Rectangle(0, 0, 100, 100);
Rectangle destRect = new Rectangle(100, 100, 200, 200);

// 创建一个Matrix对象
Matrix matrix = new Matrix(sourceRect, new Point[] { 
    new Point(0, 0), 
    new Point(100, 100), 
    new Point(0, 100) 
});

// 应用变换
Graphics g = this.CreateGraphics();
g.Transform = matrix;

// 绘制一个矩形
g.DrawRectangle(Pens.Black, destRect);
  1. Matrix(Single, Single, Single, Single, Single, Single)构造函数

该构造函数用于创建一个矩阵,该矩阵定义了一组二维坐标系之间的线性映射。其参数为六个浮点数,分别表示矩阵的六个元素。

示例代码:

// 创建一个Matrix对象
Matrix matrix = new Matrix(1, 0, 0, 1, 100, 100);

// 应用变换
Graphics g = this.CreateGraphics();
g.Transform = matrix;

// 绘制一个矩形
Rectangle rect = new Rectangle(0, 0, 100, 100);
g.DrawRectangle(Pens.Black, rect);

以上示例分别创建了两个Matrix对象,然后应用了不同的变换,最终在屏幕上绘制了一个矩形。Matrix类还提供了其他常用方法,例如Rotate、Translate、Scale等,可以实现更丰富的图形变换。

🔎3.方法

WinForm中的Matrix类提供了一系列用于图形变换的方法,以下是这些方法的简介和示例:

  1. Rotate方法:旋转指定的角度(以度为单位)。
Matrix matrix = new Matrix();
matrix.Rotate(30); // 顺时针旋转30度
  1. RotateAt方法:以指定的点为中心旋转指定的角度(以度为单位)。
Matrix matrix = new Matrix();
Point point = new Point(100, 100);
matrix.RotateAt(30, point); // 以(100, 100)为中心顺时针旋转30度
  1. Scale方法:按指定的比例缩放图形。
Matrix matrix = new Matrix();
matrix.Scale(2, 2); // 横向和纵向都放大2倍
  1. 复合变换:使用Multiply方法将多个变换组合起来,并得到最终的变换结果。
Matrix matrix = new Matrix();
matrix.Translate(50, 50); // 平移
matrix.Rotate(30); // 旋转
matrix.Scale(2, 2); // 缩放
  1. Shear方法:横向和纵向错切图形。
Matrix matrix = new Matrix();
matrix.Shear(0.5f, 0); // 横向错切0.5
  1. TransformPoints方法:将给定的点数组应用于变换,并返回变换后的点数组。
Matrix matrix = new Matrix();
Point[] points = new Point[] { new Point(10, 10), new Point(20, 20) };
matrix.Scale(2, 2);
Point[] transformedPoints = matrix.TransformPoints(points); // 变换后的点数组
  1. TransformVectors方法:将给定的向量数组应用于变换,并返回变换后的向量数组。
Matrix matrix = new Matrix();
Point[] vectors = new Point[] { new Point(10, 10), new Point(20, 20) };
matrix.Scale(2, 2);
Point[] transformedVectors = matrix.TransformVectors(vectors); // 变换后的向量数组
  1. VectorTransformPoints方法:将给定的点数组作为向量应用于变换,并返回变换后的点数组。
Matrix matrix = new Matrix();
Point[] points = new Point[] { new Point(10, 10), new Point(20, 20) };
matrix.Scale(2, 2);
Point[] transformedPoints = matrix.VectorTransformPoints(points); // 变换后的点数组

🔎4.案例

下面是一个使用GDI+绘图和Matrix类进行矩阵平移、旋转、缩放的完整案例,其中绘制了一个带旋转和缩放效果的矩形:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;

    // 创建Matrix对象
    Matrix matrix = new Matrix();

    // 旋转30度
    matrix.Rotate(30);

    // 缩放2倍
    matrix.Scale(2, 2);

    // 平移300像素
    matrix.Translate(300, 0);

    // 应用变换
    g.Transform = matrix;

    // 绘制矩形
    Rectangle rect = new Rectangle(0, 0, 100, 50);
    g.DrawRectangle(Pens.Red, rect);

    // 恢复GDI+绘图对象的默认状态
    g.ResetTransform();
}

在上面的代码中,我们首先创建了一个Matrix对象,并依次调用Rotate、Scale和Translate方法进行旋转、缩放和平移变换。接着,我们将Matrix对象应用到GDI+绘图对象上,通过调用Transform属性设置绘图对象的变换矩阵。最后,我们绘制了一个矩形,并在绘制前应用了Matrix对象进行了旋转和缩放操作,最终得到了一个带有旋转和缩放效果的矩形。


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

![在这里插入图片描述](https://img-blog.csdnimg.cn/e06a317e89694a23ad89d2c59538c3a1.jpeg#pic_center =450x300)

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。