Skip to content

Commit ee8c16b

Browse files
authored
Update
1 parent 4ae2d48 commit ee8c16b

1 file changed

Lines changed: 56 additions & 60 deletions

File tree

CustomView/Advance/[09]Matrix_Basic.md

Lines changed: 56 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -269,11 +269,7 @@ y\\\\
269269
\\begin{matrix}
270270
cos(\\theta) & -sin(\\theta) & 0 \\\\
271271
sin(\\theta) & cos(\\theta) & 0 \\\\
272-
273-
```
274272
0 & 0 & 1
275-
```
276-
277273
\\end{1}
278274
\\right ]
279275
.
@@ -461,61 +457,61 @@ M‘ = T*(M*R) = T*M*R = (T*M)*R
461457
> ~~在上面例子中,计算顺序是没有问题的,先计算的缩放,然后计算的平移,而缩放影响到平移则是因为前一步缩放后的结果矩阵右乘了平移矩阵,这是符合矩阵乘法的运算规律的,也就是说缩放操作虽然在前却影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。~~
462458
>
463459
> ------
464-
>
465-
> 上面的论证是完全错误的,因为可以轻松举出反例:
466-
>
467-
> ```java
468-
> Matrix matrix = new Matrix();
469-
> matrix.preScale(0.5f, 0.8f);
470-
> matrix.preTranslate(1000, 1000);
471-
> Log.e(TAG, "MatrixTest" + matrix.toShortString());
472-
> ```
473-
>
474-
> 反例中,虽然将 `postScale` 改为了 `preScale` ,但两者结果是完全相同的,所以先后论根本就是错误的。
475-
>
476-
> 他们结果相同是因为最终化简公式是相同的,都是 S*T
477-
>
478-
> 之所以平移距离是 MTRANS\\_X = 500,MTRANS\\_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。
479-
>
480-
> ![](http://latex.codecogs.com/png.latex?$$
481-
> \\left [
482-
> \\begin{matrix}
483-
> 0.5 & 0 & 0 \\\\
484-
> 0 & 0.8 & 0 \\\\
485-
> 0 & 0 & 1
486-
> \\end{1}
487-
> \\right ]
488-
> \\cdot
489-
> \\left [
490-
> \\begin{matrix}
491-
> 1 & 0 & 1000 \\\\
492-
> 0 & 1 & 1000 \\\\
493-
> 0 & 0 & 1
494-
> \\end{1}
495-
> \\right ]
496-
> =
497-
> \\left [
498-
> \\begin{matrix}
499-
> 0.5*1+0*0+0*0 & 0.5*0+0*1+0*0 & 0.5*1000+0*1000+0*1\\\\
500-
> 0*1+0.8*0+0*0 & 0*0+0.8*1+0*1 & 0*1000+0.8*1000+0*1\\\\
501-
> 0*1+0*0+1*0 & 0*0+0*1+1*0 & 0*1000+0*1000+1*1
502-
> \\end{1}
503-
> \\right ]
504-
> $$)
505-
>
506-
> 最终结果为:
507-
>
508-
> ![](http://latex.codecogs.com/png.latex?$$
509-
> \\left [
510-
> \\begin{matrix}
511-
> 0.5 & 0 & 500\\\\
512-
> 0 & 0.8 & 800\\\\
513-
> 0 & 0 & 1
514-
> \\end{1}
515-
> \\right ]
516-
> $$)
517-
>
518-
> 当 T*S 的时候,缩放比例则不会影响到 MTRANS\\_X 和 MTRANS\\_Y ,具体可以使用矩阵乘法自己计算一遍。
460+
461+
上面的论证是完全错误的,因为可以轻松举出反例:
462+
463+
```java
464+
Matrix matrix = new Matrix();
465+
matrix.preScale(0.5f, 0.8f);
466+
matrix.preTranslate(1000, 1000);
467+
Log.e(TAG, "MatrixTest" + matrix.toShortString());
468+
```
469+
470+
反例中,虽然将 `postScale` 改为了 `preScale` ,但两者结果是完全相同的,所以先后论根本就是错误的。
471+
472+
他们结果相同是因为最终化简公式是相同的,都是 S*T
473+
474+
之所以平移距离是 MTRANS\\_X = 500,MTRANS\\_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。
475+
476+
![](http://latex.codecogs.com/png.latex?$$
477+
\\left [
478+
\\begin{matrix}
479+
0.5 & 0 & 0 \\\\
480+
0 & 0.8 & 0 \\\\
481+
0 & 0 & 1
482+
\\end{1}
483+
\\right ]
484+
\\cdot
485+
\\left [
486+
\\begin{matrix}
487+
1 & 0 & 1000 \\\\
488+
0 & 1 & 1000 \\\\
489+
0 & 0 & 1
490+
\\end{1}
491+
\\right ]
492+
=
493+
\\left [
494+
\\begin{matrix}
495+
0.5*1+0*0+0*0 & 0.5*0+0*1+0*0 & 0.5*1000+0*1000+0*1\\\\
496+
0*1+0.8*0+0*0 & 0*0+0.8*1+0*1 & 0*1000+0.8*1000+0*1\\\\
497+
0*1+0*0+1*0 & 0*0+0*1+1*0 & 0*1000+0*1000+1*1
498+
\\end{1}
499+
\\right ]
500+
$$)
501+
502+
最终结果为:
503+
504+
![](http://latex.codecogs.com/png.latex?$$
505+
\\left [
506+
\\begin{matrix}
507+
0.5 & 0 & 500\\\\
508+
0 & 0.8 & 800\\\\
509+
0 & 0 & 1
510+
\\end{1}
511+
\\right ]
512+
$$)
513+
514+
当 T*S 的时候,缩放比例则不会影响到 MTRANS\\_X 和 MTRANS\\_Y ,具体可以使用矩阵乘法自己计算一遍。
519515
520516
## 如何理解和使用 pre 和 post ?
521517
@@ -807,4 +803,4 @@ $$)
807803
[维基百科-齐次坐标](https://zh.wikipedia.org/wiki/%E9%BD%90%E6%AC%A1%E5%9D%90%E6%A0%87)<br/>
808804
[维基百科-线性映射](https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E6%98%A0%E5%B0%84)<br/>
809805
[齐次坐标系入门级思考](https://oncemore2020.github.io/blog/homogeneous/)<br/>
810-
[仿射变换与齐次坐标](https://guangchun.wordpress.com/2011/10/12/affineandhomogeneous/)<br/>
806+
[仿射变换与齐次坐标](https://guangchun.wordpress.com/2011/10/12/affineandhomogeneous/)<br/>

0 commit comments

Comments
 (0)