Matrix 类学习 (一)

Matrix 类学习 (一)

网上讲 Matrix 的文章很多, 但是 "纸上得来终觉浅", 要真想弄懂, 就要去看代码. 代码看明白了你也能写出来那种牛逼哄哄的文章.

乱七八糟的方法

isAffine()

判断是不是仿射.

An affine matrix preserves straight lines and has no perspective.

仿射矩阵保护直线并且没有透视?

仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。

说线性变换我就有点明白了.

rectStaysRect()

一种神器的判等方式: 两个矩阵完全一样, 有缩放关系, 按照 90° 的倍数旋转, 这个方法都能够判断出来.

set(Matrix src)

将目标矩阵赋值到自己的矩阵.

参数可以为空, 这样自己的矩阵变成单位阵.

Deep copy 是什么意思? 还有一个概念叫 shallow copy, 两者啥区别?

SO 答案:

  • Shallow copies duplicate as little as possible. A shallow copy of a collection is a copy of the collection structure, not the elements. With a shallow copy, two collections now share the individual elements.

  • Deep copies duplicate everything. A deep copy of a collection is two collections with all of the elements in the original collection duplicated.

翻译过来:

  • Shallow copy: 尽可能少地复制. 对集合的一个影拷贝是一个对集合结构的拷贝, 而非对元素的拷贝. Shallow copy 出来的集合跟原集合的元素是共享的.
  • Deep copy: 深拷贝是对集合以及其中的元素都拷贝一份出来.

搞明白了 😁.

set 系方法

这些方法包括:

  • setTranslate 位移
  • setScale 缩放
  • setRotate 旋转
  • setSinCos 按照 sin cos 旋转
  • setSkew 这个操作比较难以描述, 有篇文章称之为错切, 感觉不错. 想象成一个矩形一条边拉伸.

这些都是很好理解的方法:

  • 位移设上偏移量就偏移这么多
  • 缩放设上缩放因子就缩放这么多, 设置缩放中心就沿着中心缩放
  • 旋转也是一样, 参数就是角度, 还可以设置中心, 还有一种支持 sin cos 的.
  • 错切也是跟上面一样的.

set 系还有一个方法 setConcat(Matrix a, Matrix b):

  • 有两个参数是两个矩阵
  • 功能是计算两个矩阵的乘积
  • 并设置到当前矩阵中

例如:

// mB 和 mC 都是 Matrix
mA.setConcat(mB, mC);

这样 mA 就是 mB 和 mC 的乘积了.

Pre/Post

虽然我学过线性代数, 知道矩阵相乘分左乘和又乘, 硕士生涯也跟矩阵打了三年交道, 但是没学过计算机图形学, 看到这里的 pre post 还是有点懵逼 😂.

SO 答案翻译过来:

Set 系方法是不考虑当前矩阵的值而直接用新值替换当前矩阵. pre 和 post 方法将会在当前矩阵之前或者之后应用一种新的变换.

例如下面这个例子:

Matrix m = new Matrix();
m.setRotate(90);
m.setTranslate(100, 100);

上面代码的结果是 m 只包含 Translate. 中间的 Rotate 没用, 因为被替换掉了.

再看下面这个例子:

Matrix m = new Matrix();
m.setTranslate(100, 100);
m.postRotate(90);

上面代码的结果中矩阵包含了两个操作, 先 Translate 然后 Rotate.

再看下面这个例子:

Matrix m = new Matrix();
m.setTranslate(100, 100);
m.preRotate(90);

先看上面代码跟上上例有啥不一样? 原来是 postRotate 现在是 preRotate.

那作用是什么呢? 先 Rotate 再 Translate.

SO 的这个讲解很清晰, 搞明白了 😁.

至此这个类看了能有一半的内容了, 剩下的搁系列的下一篇文章再说了 (又立 flag... 😂).