1. 矩阵
在数学中,矩阵是一个矩形阵列排列的复数和实数集合。是高等代数中常见的工具。在计算机科学中,一些数值分析、动画制作、游戏等方面就会用到矩阵。在编程语言中矩阵可以用一个二维数组进行模拟,如下图所示:
![af28cba09571646b81a91d448c8d55e0.png](https://i-blog.csdnimg.cn/blog_migrate/bc67cae9dbf29ac4abf558927d893529.jpeg)
矩阵和二维数组
大多数高级语言中,都支持二维数组,用二维数组来实现矩阵是非常容易的,编程语言更多的是用来模拟矩阵的加减操作以及移动操作。
2. 矩阵的操作
在一些游戏设计中,经常会用到矩阵进行操作,例如加减操作和旋转操作就是使用频率较多的操作。下面我们列举几个常见的矩阵操作:
2.1 矩阵相加
一般情况下,两个矩阵相加,需要两个矩阵拥有相同的大小(如下图所示):
![fcdbcae03727f724a5be84625f11a773.png](https://i-blog.csdnimg.cn/blog_migrate/f11c5823635ab9253efef461f52aebff.jpeg)
矩阵相加
如果在计算机中进行模拟矩阵的相加,相当于两个同等规模的二维数组相加,并进行同行同列的元素相加。相加后得到的矩阵依然是一个同等规模的矩阵数组。这个操作在编程语言中操作是非常简单的。
2.2 矩阵错位相加
矩阵错位相加时,可以让两个不同规模的矩阵相加,这个模式的相加方式,只对两个矩阵重合的部分进行相加(如下图所示)。
![4bbbb2969e02ab21e487287b6001ad80.png](https://i-blog.csdnimg.cn/blog_migrate/92fa929e3b3f3f130efb347c282691ac.jpeg)
矩阵错位相加
2.3 矩阵旋转
矩阵旋转需要矩阵是一个规则矩阵(矩阵的长和宽相等,否则旋时丢失数据),矩阵的旋转转角为90度的倍数(如下图所示)。
![c79d9f8610f7701efde07a7a424580a2.png](https://i-blog.csdnimg.cn/blog_migrate/813bdef0d76cc95637954373df8811df.jpeg)
矩阵旋转
矩阵的旋转在游戏中的应用非常广泛,例如我们熟悉的俄罗斯方块中,就会用到矩阵的旋转。
3. Java程序模拟矩阵
在Java中,模拟矩阵需要创建一个行列平衡的二维数组(要求每行的元素个数都一样)。如果要进行旋转,必须要求二维数组的行列一致。我们可以定义类Matrix进行矩阵的模拟,它需要包含一个二维数组,以及表示二维数组的行列整型值。Matrix类的声明及构造方法如下所示:
![744e359e3867c545a6bc3f9aee7904a8.png](https://i-blog.csdnimg.cn/blog_migrate/5610f6887f541d8b0d1f0af42f506e85.jpeg)
3.1矩阵添加元素操作
为了给矩阵增加数据添加的入口,我们可以在Matrix类中增加矩阵添加数据的操作(整体矩阵随机添加元素、按行和列添加元素),以及一个打印矩阵的方法,这些方法如下所示:
![8f9bf9d11c01cf9af5f08b5e043bc40d.png](https://i-blog.csdnimg.cn/blog_migrate/88ac7272d4213f177c84aba01c293e36.jpeg)
这里要注意方法setforEach中的Function参数,它是一个函数式接口。它的目的在于让开发者自己定义数据的计算规则。泛型V是函数方法apply中的参数,泛型R是apply方法的返回类型。在setforEach方法内,我们将矩阵元素作为参数传递到apply方法中。在方法setRandomMatr中,我们就利用setforEach进行了随机数添加,但是我们没有使用矩阵中的元素。
这几个方法在添加到Matrix类中后,我们可以在main方法中进行一些测试(测试内容和结果如下所示):
![b06b5bb142703477ed6b74e87901b7c8.png](https://i-blog.csdnimg.cn/blog_migrate/dd0d44869cfdd9bd8b1d93bb3229a31f.jpeg)
![69ba86b95abe892baf73530d4e757032.png](https://i-blog.csdnimg.cn/blog_migrate/bae853278d5ebf0f64088d9f60a7a17b.jpeg)
3.2 矩阵相加操作
矩阵的第二个功能是完成矩阵的相加和错位相加,这两种相加方式可以通过参数来完成。进行错位相加时,要判断数组中的元素是否出界。在Matrix类中,添加add方法用于进行矩阵的相加和错位相加(如下所示)。
![aa335bf7182f57f129021e8eeb68fbf6.png](https://i-blog.csdnimg.cn/blog_migrate/c48b7fcb7afcf0d325d6707298709f70.jpeg)
进行矩阵相加时,要有一个基础矩阵做为被加矩阵,被加矩阵默认为当前矩阵。进行矩阵相加时,允许偏移量小于0。下面为矩阵相加功能的测试结果:
![7da97aa790c4e221a206fcec1c77ccd1.png](https://i-blog.csdnimg.cn/blog_migrate/b0a2e4c94f3df1d7293d1d4f1647ce91.jpeg)
![11a83559913f28401ad538cb9f3d2327.png](https://i-blog.csdnimg.cn/blog_migrate/692dcba4d163ce158efb69c365910404.jpeg)
3.3 矩阵旋转操作
矩阵的旋转是矩阵操作中稍微复杂一点的操作,如果找到规律后,矩阵的旋转也不是难事。矩阵旋转的前提条件是必须保证矩阵是一个长宽相等的正方形矩阵。其次旋转时只能以90°的倍数进行旋转(向左或向右):
![f805cfcd3f0895b588c64807b330dfb2.png](https://i-blog.csdnimg.cn/blog_migrate/a03101fcd71528c01fa9d9169a552d2f.jpeg)
矩阵旋转规则
上图中左侧为顺时针旋转90°时的算法。每一种颜色表示要旋转的圈数。当矩阵的长度为基数或者偶数的时候,旋转的圈数都可以记为n/2(n为矩阵长度)。
以上图左侧为例,当矩阵旋转时,每旋转一个矩阵元素时,要同时涉及到四个矩阵元素同时旋转进行数据交换(左图各颜色线条所标识),这四个元素之间的关系如下图所示:
![71ccdec517b10cdbc3e7ce87b07b816c.png](https://i-blog.csdnimg.cn/blog_migrate/486686d6830bf8b12b6a41a6ee4abedc.jpeg)
矩阵旋转中元素之间的关系
在旋转操作上,我们实际上只要操作上图6中白色标记的元素,即可完成所有元素的旋转。如果在双层循环中完成旋转操作,外层只要遍历矩阵的深度的一半,即i
![1f98b0d633c7051562c50a025b03f53f.png](https://i-blog.csdnimg.cn/blog_migrate/0ba7a07b6f6d2425c959e3cecf0e7080.jpeg)
如果旋转的角度不是90°的整数倍,我们按照除以90取整的方式进行,并计算出旋转的角度是90,180还是270度。如果角度为负数,则说明是相反方向旋转。在leftRotate和rightRotate中都满足了上述两种情景的判断。上述方法测试情况如下:
![a1643d73d7ed509855b58e337460b977.png](https://i-blog.csdnimg.cn/blog_migrate/cb547121d49dfe9bc432ed080d890211.jpeg)
![883e6e81f4e57060cef231f926c656d5.png](https://i-blog.csdnimg.cn/blog_migrate/fbcb03e5668059d9edcb06d3b5ab866b.jpeg)
如果我们想设计一个俄罗斯方块的游戏,就可以用到数组实现矩阵的一些功能。在以后的内容中,我们会进行讲述。