[WPF] Matrix Transform, 矩阵变换. 最最最基础的原理解释.

62 篇文章 6 订阅
35 篇文章 1 订阅

关于向量:

1. 向量的基

在计算机科学中, 向量, Vector, 通常这么表示:
[ x y ] \left[ \begin{array}{cc} x\\ y \end{array} \right] [xy]
向量有两个 “基”, i ‾ \overline{i} i, 即 1 , 0 → \overrightarrow{1, 0} 1,0 , j ‾ \overline{j} j, 即 0 , 1 → \overrightarrow{0, 1} 0,1

向量可以看作这些基乘以一组数的结果, 即: v ‾ = i ‾ × a + j ‾ × b \overline{v} = \overline{i} \times a + \overline{j} \times b v=i×a+j×b, 例如 [ 1 , 3 ] [1, 3] [1,3], 就是:
i ‾ × 1 + j ‾ × 3 = [ 1 , 0 ] × 1 + [ 0 , 1 ] × 3 = [ 1 , 0 ] + [ 0 , 3 ] = [ 1 , 3 ] \overline{i} \times 1 + \overline{j} \times 3 = [1, 0] \times 1 + [0, 1] \times 3 = [1, 0] + [0, 3] = [1, 3] i×1+j×3=[1,0]×1+[0,1]×3=[1,0]+[0,3]=[1,3]

2. 改变向量的基

当改变向量的基时, 由于向量是一组数与基的乘法, 所以向量也会随之变化.

例如我们设定两个基为它们顺时针旋转90°后的结果, 即: i ‾ = [ 0 , − 1 ] , j ‾ = [ 1 , 0 ] \overline i = [0, -1], \overline j = [1, 0] i=[0,1],j=[1,0], 那么 [1, 3] 就变成了:
i ‾ × 1 + j ‾ × 3 = [ 0 , − 1 ] × 1 + [ 1 , 0 ] × 3 = [ 0 , − 1 ] + [ 3 , 0 ] = [ 3 , − 1 ] \overline i \times 1 + \overline j \times 3 = [0, -1] \times 1 + [1, 0] \times 3 = [0, -1] + [3, 0] =[3, -1] i×1+j×3=[0,1]×1+[1,0]×3=[0,1]+[3,0]=[3,1]
你会发现, 这个向量也随之改变了, 而且恰好是顺时针旋转90°

3. 矩阵的乘法:

在计算机科学中, 向量如此表示:
[ x y ] \left[ \begin{array}{c} x\\y \end{array} \right] [xy]
如果是两个向量, 则是这样, 竖着的, 是一个向量:
[ x 1 , x 2 y 1 , y 2 ] \left[ \begin{array}{c} x_1, & x_2\\ y_1, & y_2 \end{array} \right] [x1,y1,x2y2]
而, 我们刚刚进行的乘法, 其实也是矩阵乘法, 即:
[ 0 , − 1 1 , 0 ] × [ 1 3 ] = [ 3 − 1 ] \left[ \begin{array}{c} 0, & -1\\ 1, & 0 \end{array} \right] \times \left[ \begin{array}{c} 1\\ 3 \end{array} \right]= \left[ \begin{array}{c} 3 \\ -1 \end{array} \right] [0,1,10]×[13]=[31]

矩阵变换

在 WPF 中, 一个矩阵(Matrix)有以下属性: M11, M12, M21, M22, OffsetX, OffsetY.

其中, M11, M12, M21, M22 表示缩放旋转矩阵:
[ M 11 , M 12 M 21 , M 22 ] \left[ \begin{array}{c} M11, & M12 \\ M21, & M22 \end{array} \right] [M11,M21,M12M22]
它们的默认值是:
[ 1 , 0 0 , 1 ] \left[ \begin{array}{c} 1, & 0 \\ 0, & 1 \end{array} \right] [1,0,01]
而进行矩阵变换, 也就是将源图形的每一个点, 与这个矩阵相乘, 最终得到另一些点, 构成一个新的图形.

而与默认的这个矩阵相乘, 形状不会有任何变化.

这个矩阵的 M11 和 M21 值, 可以理解为 i ‾ \overline i i, M12 和 M22 可以理解为 j ‾ \overline j j, 之前我们提到, 如果变化这两个基的值, 那么最终向量也会发生变化, 而当我们将刚刚旋转 90° 后的 i ‾ \overline i i j ‾ \overline j j 拿出来直接代入, 也可以发现, 图形直接旋转了 90°.

矩阵的基本原理就是矩阵的乘法, 但即便你不理解矩阵的乘法, 去改变 Matrix 中的两个基值, 形状也将跟随基值发生改变.

而 OffsetX 和 OffsetY, 这两个指定了这两个图形的平移, OffsetX 水平偏移量, OffsetY 垂直偏移量.

0. 参考内容:

  1. 哔哩哔哩 3Blue1Brown 线性代数
  2. 理解矩阵乘法 - 阮一峰的网络日志
  3. 矩阵乘法 - endl
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,实现WPF HelixToolkit.Wpf.SharpDX前后端点云效果的步骤如下: 1. 首先下载源码https://github.com/helix-toolkit/helix-toolkit,并打开source文件夹中的Example/WPF.SharpDX/FileLoadDemo.csproj文件。 2. 在VS中打开FileLoadDemo.csproj文件后,需要添加引用。右键Solution Explorer中的References,选择Manage Nuget Packages。在Browse中搜索Helix3DToolkit.Wpf.SharpDX和SharpDX并安装。 3. 在MainWindow.xaml中添加HelixViewport3D控件,用于显示点云效果。 4. 在MainWindow.xaml.cs中添加以下代码,用于加载点云数据: ```csharp private void LoadPointCloud() { var reader = new StreamReader("pointcloud.xyz"); var positions = new List<Vector3>(); while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(' '); var x = float.Parse(values[0], CultureInfo.InvariantCulture); var y = float.Parse(values[1], CultureInfo.InvariantCulture); var z = float.Parse(values[2], CultureInfo.InvariantCulture); positions.Add(new Vector3(x, y, z)); } reader.Close(); var builder = new MeshBuilder(); builder.AddPointCloud(positions, Colors.Red, 2); var meshGeometry = builder.ToMesh(); var geometryModel = new GeometryModel3D(meshGeometry, Materials.Red); var modelGroup = new Model3DGroup(); modelGroup.Children.Add(geometryModel); var visual3D = new ModelVisual3D(); visual3D.Content = modelGroup; viewport.Children.Add(visual3D); } ``` 该代码将从文件pointcloud.xyz中读取点云数据,并将其添加到HelixViewport3D控件中。 5. 在MainWindow.xaml.cs的构造函数中调用LoadPointCloud()方法,以加载点云数据。 ```csharp public MainWindow() { InitializeComponent(); LoadPointCloud(); } ``` 6. 运行程序,即可在HelixViewport3D控件中看到点云效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值