前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2023年12月 GDI+绘图专题 Matrix

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

原创
作者头像
愚公搬代码
发布2023-12-27 23:59:31
1290
发布2023-12-27 23:59:31
举报
文章被收录于专栏:历史专栏历史专栏

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀前言
  • 🚀一、Matrix
    • 🔎1.属性
      • 🔎2.构造函数
        • 🔎3.方法
          • 🔎4.案例
          相关产品与服务
          云开发 CloudBase
          云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档