首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【愚公系列】2023年11月 WPF控件专题 Line控件详解
2
【愚公系列】2023年11月 WPF控件专题 2023秋招WPF高频面试题
3
【愚公系列】2023年11月 Winform控件专题 Label控件详解
4
【愚公系列】2023年11月 Winform控件专题 Button控件详解
5
【愚公系列】2023年11月 Winform控件专题 Form控件详解
6
【愚公系列】2023年11月 Winform控件专题 TextBox控件详解
7
【愚公系列】2023年11月 Winform控件专题 CheckBox控件详解
8
【愚公系列】2023年11月 Winform控件专题 RadioButton控件详解
9
【愚公系列】2023年11月 Winform控件专题 ComboBox控件详解
10
【愚公系列】2023年11月 Winform控件专题 RichTextBox控件详解
11
【愚公系列】2023年11月 Winform控件专题 ListBox控件详解
12
【愚公系列】2023年11月 Winform控件专题 CheckedListBox控件详解
13
【愚公系列】2023年11月 Winform控件专题 numericUpDown控件详解
14
【愚公系列】2023年11月 Winform控件专题 LinkLabel控件详解
15
【愚公系列】2023年11月 Winform控件专题 DateTimePicker控件详解
16
【愚公系列】2023年11月 Winform控件专题 NotifyIcon控件详解
17
【愚公系列】2023年11月 Winform控件专题 ContextMenuStrip控件详解
18
【愚公系列】2023年11月 Winform控件专题 Timer控件详解
19
【愚公系列】2023年11月 Winform控件专题 PictureBox控件详解
20
【愚公系列】2023年11月 Winform控件专题 Chart控件详解
21
【愚公系列】2023年11月 Winform控件专题 DataGridView控件详解
22
【愚公系列】2023年11月 Winform控件专题 TableLayoutPanel控件详解
23
【愚公系列】2023年11月 Winform控件专题 ProgressBar控件详解
24
【愚公系列】2023年11月 Winform控件专题 Panel控件详解
25
【愚公系列】2023年11月 Winform控件专题 FlowLayoutPanel控件详解
26
【愚公系列】2023年11月 Winform控件专题 GroupBox控件详解
27
【愚公系列】2023年11月 Winform控件专题 SplitContainer控件详解
28
【愚公系列】2023年11月 Winform控件专题 TabControl控件详解
29
【愚公系列】2023年11月 Winform控件专题 ToolTip控件详解
30
【愚公系列】2023年11月 Winform控件专题 MaskedTextBox控件详解
31
【愚公系列】2023年11月 Winform控件专题 MonthCalendar控件详解
32
【愚公系列】2023年11月 Winform控件专题 TreeView控件详解
33
【愚公系列】2023年11月 Winform控件专题 MenuStrip控件详解
34
【愚公系列】2023年11月 Winform控件专题 OpenFileDialog控件详解
35
【愚公系列】2023年11月 Winform控件专题 SaveFileDialog控件详解
36
【愚公系列】2023年12月 Winform控件专题 FontDialog控件详解
37
【愚公系列】2023年12月 Winform控件专题 ColorDialog控件详解
38
【愚公系列】2023年12月 Winform控件专题 FolderBrowserDialog控件详解
39
【愚公系列】2023年12月 Winform控件专题 StatusStrip控件详解
40
【愚公系列】2023年12月 Winform控件专题 ToolStrip控件详解
41
【愚公系列】2023年12月 Winform控件专题 HelpProvider控件详解
42
【愚公系列】2023年12月 Winform控件专题 ToolStripContainer控件详解
43
【愚公系列】2023年12月 Winform控件专题 BackgroundWorker控件详解
44
【愚公系列】2023年12月 GDI+绘图专题 图形图像编程基础
45
【愚公系列】2023年12月 GDI+绘图专题 图形图像的重绘
46
【愚公系列】2023年12月 GDI+绘图专题 颜色获取和图形绘制
47
【愚公系列】2023年12月 GDI+绘图专题 Point
48
【愚公系列】2023年12月 GDI+绘图专题 Rectangle
49
【愚公系列】2023年12月 GDI+绘图专题 Matrix
50
【愚公系列】2023年12月 GDI+绘图专题 Pen

【愚公系列】2023年12月 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个像素的距离:

代码语言:csharp
复制
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用于表示平移参数。通过修改这些元素,可以实现二维矩阵的变换。下面是一个示例:
代码语言:csharp
复制
Matrix matrix = new Matrix(1, 0, 0, 1, 50, 50);
float[] elements = matrix.Elements;
foreach (float element in elements)
{
    Console.WriteLine(element);
}

输出结果为:

代码语言:csharp
复制
1
0
0
1
50
50
  1. IsIdentity属性: IsIdentity属性返回一个布尔值,表示当前矩阵是否为单位矩阵。如果矩阵全为1,表示没有任何变换,则返回true,否则返回false。以下是一个示例:
代码语言:csharp
复制
Matrix matrix = new Matrix();
bool isIdentity = matrix.IsIdentity;
Console.WriteLine(isIdentity); // 输出true
  1. IsInvertible属性: IsInvertible属性返回一个布尔值,表示矩阵是否可逆。如果可逆,则返回true,否则返回false。以下是一个示例:
代码语言:csharp
复制
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轴上的平移量。以下是一个示例:
代码语言:csharp
复制
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[])构造函数

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

示例代码:

代码语言:csharp
复制
// 创建一个源矩形和目标矩形
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)构造函数

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

示例代码:

代码语言:csharp
复制
// 创建一个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度
  2. RotateAt方法:以指定的点为中心旋转指定的角度(以度为单位)。Matrix matrix = new Matrix(); Point point = new Point(100, 100); matrix.RotateAt(30, point); // 以(100, 100)为中心顺时针旋转30度
  3. Scale方法:按指定的比例缩放图形。Matrix matrix = new Matrix(); matrix.Scale(2, 2); // 横向和纵向都放大2倍
  4. 复合变换:使用Multiply方法将多个变换组合起来,并得到最终的变换结果。Matrix matrix = new Matrix(); matrix.Translate(50, 50); // 平移 matrix.Rotate(30); // 旋转 matrix.Scale(2, 2); // 缩放
  5. Shear方法:横向和纵向错切图形。Matrix matrix = new Matrix(); matrix.Shear(0.5f, 0); // 横向错切0.5
  6. 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); // 变换后的点数组
  7. 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); // 变换后的向量数组
  8. 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类进行矩阵平移、旋转、缩放的完整案例,其中绘制了一个带旋转和缩放效果的矩形:

代码语言:csharp
复制
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对象进行了旋转和缩放操作,最终得到了一个带有旋转和缩放效果的矩形。


我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

下一篇
举报
领券