Matrix变换矩阵的探索(2)
2016-05-14 22:51
375 查看
转载请注明出处哦!
前面我已经大概的介绍了一下Matrix矩阵,下面我们来看一下
的计算过程:
⎡⎣⎢k000k0001⎤⎦⎥ ∗⎡⎣⎢x0y01⎤⎦⎥ =⎡⎣⎢kx0ky01⎤⎦⎥
\left[
\begin{matrix}
k & 0 & 0 \\
0 & k & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ *
\left[
\begin{matrix}
x_0\\
y_0\\
1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
kx_0\\
ky_0\\
1
\end{matrix}
\right]
这样,我们就把这个点成功的进行了变换。
那么矩阵是如何对图片进行变换的呢?
其实很简单,它只不过是对图片的每个像素点进行了变换,组成图片的所有像素点都变了,那么图片自然也就变了。
这样说的话,那缩放变换感觉很诡异啊,一个像素点还能变大变小吗?
图片的缩放原理相对复杂一些,但其实它就是按照一定的算法,对图片进行下采样(缩小)、上采样(放大)来对图片进行变换的。
所谓下采样,就是按照一定的规律,在原图的所有像素点中,截取符合规律的像素点(这意味着一些像素点会被丢弃掉),然后将这些像素点呈现出来,我们就可以看到一张缩小了得图片。
所谓上采样,就是按照一定的算法,在原图片的额像素群中插入一些像素点,然后再把这些像素点呈现出来,就得到一张放大的图片。
当然这个复杂的计算过程不需要我们自己去实现,我们只需要告诉系统,我要一张多大的图片,系统就会帮助我们完成这个过程,然后直接给我们一张处理好的图片。
注:下面的讲解都基于一个标准矩阵 A 来进行。
⎡⎣⎢K1000K20001⎤⎦⎥
\left[
\begin{matrix}
K_1 & 0 & 0 \\
0 & K_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
再次说明,调用
⎡⎣⎢k1000k20001⎤⎦⎥ ∗⎡⎣⎢100010001⎤⎦⎥ =⎡⎣⎢k1000k20001⎤⎦⎥
\left[
\begin{matrix}
k_1 & 0 & 0 \\
0 & k_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ *
\left[
\begin{matrix}
1 & 0 & 0 \\
0 & 1 & 0\\
0 & 0 & 1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
k_1 & 0 & 0 \\
0 & k_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
⎡⎣⎢100010001⎤⎦⎥ ∗⎡⎣⎢k1000k20001⎤⎦⎥ =⎡⎣⎢k1000k20001⎤⎦⎥
\left[
\begin{matrix}
1 & 0 & 0 \\
0 & 1 & 0\\
0 & 0 & 1
\end{matrix}
\right]\ *
\left[
\begin{matrix}
k_1 & 0 & 0 \\
0 & k_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
k_1 & 0 & 0 \\
0 & k_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
⎡⎣⎢1k20k110001⎤⎦⎥
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
⎡⎣⎢1k20k110001⎤⎦⎥∗⎡⎣⎢100010001⎤⎦⎥ =⎡⎣⎢1k20k110001⎤⎦⎥
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
*
\left[
\begin{matrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
⎡⎣⎢100010001⎤⎦⎥∗⎡⎣⎢1k20k110001⎤⎦⎥ =⎡⎣⎢1k20k110001⎤⎦⎥
\left[
\begin{matrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
*
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
⎡⎣⎢100010k1k21⎤⎦⎥
\left[
\begin{matrix}
1 & 0 & k_1 \\
0 & 1 & k_2 \\
0 & 0 & 1
\end{matrix}
\right]
preTranslate()和postTranslate()的计算原理和上述的一样的。
⎡⎣⎢cos(a)sin(a)0−sin(a)cos(a)0001⎤⎦⎥
\left[
\begin{matrix}
cos(a) & -sin(a) & 0 \\
sin(a) & cos(a) & 0 \\
0 & 0 & 1
\end{matrix}
\right]
preRotate()和postRotate()的计算过程就不在赘述了。
前面我已经大概的介绍了一下Matrix矩阵,下面我们来看一下
xxxScale(),xxxSkew(),xxxTranslate(),xxxRotate()
的计算过程:
首先我们需要先明确矩阵是如何改变坐标点的
对于一个坐标为(X0,Y0)(X_0,Y_0)的点,我希望把他变成(kx0,ky0)(kx_0,ky_0),那么我们可以给它乘上一个矩阵:⎡⎣⎢k000k0001⎤⎦⎥ ∗⎡⎣⎢x0y01⎤⎦⎥ =⎡⎣⎢kx0ky01⎤⎦⎥
\left[
\begin{matrix}
k & 0 & 0 \\
0 & k & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ *
\left[
\begin{matrix}
x_0\\
y_0\\
1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
kx_0\\
ky_0\\
1
\end{matrix}
\right]
这样,我们就把这个点成功的进行了变换。
那么矩阵是如何对图片进行变换的呢?
其实很简单,它只不过是对图片的每个像素点进行了变换,组成图片的所有像素点都变了,那么图片自然也就变了。
这样说的话,那缩放变换感觉很诡异啊,一个像素点还能变大变小吗?
图片的缩放原理相对复杂一些,但其实它就是按照一定的算法,对图片进行下采样(缩小)、上采样(放大)来对图片进行变换的。
所谓下采样,就是按照一定的规律,在原图的所有像素点中,截取符合规律的像素点(这意味着一些像素点会被丢弃掉),然后将这些像素点呈现出来,我们就可以看到一张缩小了得图片。
所谓上采样,就是按照一定的算法,在原图片的额像素群中插入一些像素点,然后再把这些像素点呈现出来,就得到一张放大的图片。
当然这个复杂的计算过程不需要我们自己去实现,我们只需要告诉系统,我要一张多大的图片,系统就会帮助我们完成这个过程,然后直接给我们一张处理好的图片。
缩放变换xxxScale()
前面我们已经知道了Scale变换是由MSACLE_X,和MSCALE_Y控制的,那么自然的,xxxScale()就是通过修改这两个值到达变换矩阵目的。
注:下面的讲解都基于一个标准矩阵 A 来进行。
setScale()
调用setScale(k1,k2)setScale(k_1,k_2),则是直接把A矩阵设置为:⎡⎣⎢K1000K20001⎤⎦⎥
\left[
\begin{matrix}
K_1 & 0 & 0 \\
0 & K_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
再次说明,调用
setXXX()是直接设置矩阵的值,不管你此前对矩阵做了什么操作,它都会被这个矩阵给覆盖掉。
preScale()
调用preScale(k1,k2)preScale(k_1,k_2),则是经过如下计算:⎡⎣⎢k1000k20001⎤⎦⎥ ∗⎡⎣⎢100010001⎤⎦⎥ =⎡⎣⎢k1000k20001⎤⎦⎥
\left[
\begin{matrix}
k_1 & 0 & 0 \\
0 & k_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ *
\left[
\begin{matrix}
1 & 0 & 0 \\
0 & 1 & 0\\
0 & 0 & 1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
k_1 & 0 & 0 \\
0 & k_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
postScale()
postScale(k1,k2)postScale(k_1,k_2)是后乘,它的计算过程如下:⎡⎣⎢100010001⎤⎦⎥ ∗⎡⎣⎢k1000k20001⎤⎦⎥ =⎡⎣⎢k1000k20001⎤⎦⎥
\left[
\begin{matrix}
1 & 0 & 0 \\
0 & 1 & 0\\
0 & 0 & 1
\end{matrix}
\right]\ *
\left[
\begin{matrix}
k_1 & 0 & 0 \\
0 & k_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
k_1 & 0 & 0 \\
0 & k_2 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
错切变换xxxSkew()
setSkew()
调用setSkew(k1,k2)setSkew(k_1,k_2),直接将A设置成:⎡⎣⎢1k20k110001⎤⎦⎥
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
preSkew()
调用preSkew(k1,k2)preSkew(k_1,k_2)的计算过程如下:⎡⎣⎢1k20k110001⎤⎦⎥∗⎡⎣⎢100010001⎤⎦⎥ =⎡⎣⎢1k20k110001⎤⎦⎥
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
*
\left[
\begin{matrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
postSkew()
调用postSkew(k1,k2)postSkew(k_1,k_2)的计算过程如下:⎡⎣⎢100010001⎤⎦⎥∗⎡⎣⎢1k20k110001⎤⎦⎥ =⎡⎣⎢1k20k110001⎤⎦⎥
\left[
\begin{matrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
*
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]\ =
\left[
\begin{matrix}
1 & k_1 & 0 \\
k_2 & 1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
平移变换xxxTranslate()
setTranslate()
调用setTranslate()setTranslate()是将矩阵直接设置为:⎡⎣⎢100010k1k21⎤⎦⎥
\left[
\begin{matrix}
1 & 0 & k_1 \\
0 & 1 & k_2 \\
0 & 0 & 1
\end{matrix}
\right]
preTranslate()和postTranslate()的计算原理和上述的一样的。
缩放变换xxxRotate()
setRotate()
调用setRotate(a)会直接把矩阵设置为:
⎡⎣⎢cos(a)sin(a)0−sin(a)cos(a)0001⎤⎦⎥
\left[
\begin{matrix}
cos(a) & -sin(a) & 0 \\
sin(a) & cos(a) & 0 \\
0 & 0 & 1
\end{matrix}
\right]
preRotate()和postRotate()的计算过程就不在赘述了。
相关文章推荐
- android开发笔记之多媒体—画画板(娱乐一下)
- Spring Mvc那点事---(6)Spring Mvc @ModelAttribute属性和@SessionAttribute属性
- BMC hang后恢复的几种方法
- 学习HTML与CSS
- 顺序表应用3:元素位置互换之移位算法
- 兼容各浏览器的iframe - onlaod事件
- Oracle 是分区表,但条件不带分区条件的SQL
- 数字在计算机中是如何存储的
- spss v21.0 使用笔记
- android.view.InflateException: Binary XML file line #异常的解决
- 顺序表应用2:多余元素删除之建表算法
- Leetcode 206. Reverse Linked List
- Linux下crontab命令详解
- JAVA I/O流
- Follow my heart!追随我心(选择自己喜欢的工作)
- 在GPDB创建只读用户
- 重写QStandardItemModel的data函数实现值替换
- JSR 303 springmvc 数据校验
- leetcode---Integer Break
- Android基础——四大组件Service