【愚公系列】2023年11月 GDI+绘图专题 Matrix
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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.属性
- 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
- IsIdentity属性:
IsIdentity属性返回一个布尔值,表示当前矩阵是否为单位矩阵。如果矩阵全为1,表示没有任何变换,则返回true,否则返回false。以下是一个示例:
Matrix matrix = new Matrix();
bool isIdentity = matrix.IsIdentity;
Console.WriteLine(isIdentity); // 输出true
- IsInvertible属性:
IsInvertible属性返回一个布尔值,表示矩阵是否可逆。如果可逆,则返回true,否则返回false。以下是一个示例:
Matrix matrix = new Matrix(2, 0, 0, 0, 0, 0);
bool isInvertible = matrix.IsInvertible;
Console.WriteLine(isInvertible); // 输出false
- 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)这两个构造函数。
- 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);
- 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类提供了一系列用于图形变换的方法,以下是这些方法的简介和示例:
- Rotate方法:旋转指定的角度(以度为单位)。
Matrix matrix = new Matrix();
matrix.Rotate(30); // 顺时针旋转30度
- RotateAt方法:以指定的点为中心旋转指定的角度(以度为单位)。
Matrix matrix = new Matrix();
Point point = new Point(100, 100);
matrix.RotateAt(30, point); // 以(100, 100)为中心顺时针旋转30度
- Scale方法:按指定的比例缩放图形。
Matrix matrix = new Matrix();
matrix.Scale(2, 2); // 横向和纵向都放大2倍
- 复合变换:使用Multiply方法将多个变换组合起来,并得到最终的变换结果。
Matrix matrix = new Matrix();
matrix.Translate(50, 50); // 平移
matrix.Rotate(30); // 旋转
matrix.Scale(2, 2); // 缩放
- Shear方法:横向和纵向错切图形。
Matrix matrix = new Matrix();
matrix.Shear(0.5f, 0); // 横向错切0.5
- 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); // 变换后的点数组
- 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); // 变换后的向量数组
- 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)
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)