java二维数组添加数据_数组实现矩阵的加法和旋转操作

1. 矩阵

在数学中,矩阵是一个矩形阵列排列的复数和实数集合。是高等代数中常见的工具。在计算机科学中,一些数值分析、动画制作、游戏等方面就会用到矩阵。在编程语言中矩阵可以用一个二维数组进行模拟,如下图所示:

af28cba09571646b81a91d448c8d55e0.png

矩阵和二维数组

大多数高级语言中,都支持二维数组,用二维数组来实现矩阵是非常容易的,编程语言更多的是用来模拟矩阵的加减操作以及移动操作。

2. 矩阵的操作

在一些游戏设计中,经常会用到矩阵进行操作,例如加减操作和旋转操作就是使用频率较多的操作。下面我们列举几个常见的矩阵操作:

2.1 矩阵相加

一般情况下,两个矩阵相加,需要两个矩阵拥有相同的大小(如下图所示):

fcdbcae03727f724a5be84625f11a773.png

矩阵相加

如果在计算机中进行模拟矩阵的相加,相当于两个同等规模的二维数组相加,并进行同行同列的元素相加。相加后得到的矩阵依然是一个同等规模的矩阵数组。这个操作在编程语言中操作是非常简单的。

2.2 矩阵错位相加

矩阵错位相加时,可以让两个不同规模的矩阵相加,这个模式的相加方式,只对两个矩阵重合的部分进行相加(如下图所示)。

4bbbb2969e02ab21e487287b6001ad80.png

矩阵错位相加

2.3 矩阵旋转

矩阵旋转需要矩阵是一个规则矩阵(矩阵的长和宽相等,否则旋时丢失数据),矩阵的旋转转角为90度的倍数(如下图所示)。

c79d9f8610f7701efde07a7a424580a2.png

矩阵旋转

矩阵的旋转在游戏中的应用非常广泛,例如我们熟悉的俄罗斯方块中,就会用到矩阵的旋转。

3. Java程序模拟矩阵

在Java中,模拟矩阵需要创建一个行列平衡的二维数组(要求每行的元素个数都一样)。如果要进行旋转,必须要求二维数组的行列一致。我们可以定义类Matrix进行矩阵的模拟,它需要包含一个二维数组,以及表示二维数组的行列整型值。Matrix类的声明及构造方法如下所示:

744e359e3867c545a6bc3f9aee7904a8.png

3.1矩阵添加元素操作

为了给矩阵增加数据添加的入口,我们可以在Matrix类中增加矩阵添加数据的操作(整体矩阵随机添加元素、按行和列添加元素),以及一个打印矩阵的方法,这些方法如下所示:

8f9bf9d11c01cf9af5f08b5e043bc40d.png

这里要注意方法setforEach中的Function参数,它是一个函数式接口。它的目的在于让开发者自己定义数据的计算规则。泛型V是函数方法apply中的参数,泛型R是apply方法的返回类型。在setforEach方法内,我们将矩阵元素作为参数传递到apply方法中。在方法setRandomMatr中,我们就利用setforEach进行了随机数添加,但是我们没有使用矩阵中的元素。

这几个方法在添加到Matrix类中后,我们可以在main方法中进行一些测试(测试内容和结果如下所示):

b06b5bb142703477ed6b74e87901b7c8.png
69ba86b95abe892baf73530d4e757032.png

3.2 矩阵相加操作

矩阵的第二个功能是完成矩阵的相加和错位相加,这两种相加方式可以通过参数来完成。进行错位相加时,要判断数组中的元素是否出界。在Matrix类中,添加add方法用于进行矩阵的相加和错位相加(如下所示)。

aa335bf7182f57f129021e8eeb68fbf6.png

进行矩阵相加时,要有一个基础矩阵做为被加矩阵,被加矩阵默认为当前矩阵。进行矩阵相加时,允许偏移量小于0。下面为矩阵相加功能的测试结果:

7da97aa790c4e221a206fcec1c77ccd1.png
11a83559913f28401ad538cb9f3d2327.png

3.3 矩阵旋转操作

矩阵的旋转是矩阵操作中稍微复杂一点的操作,如果找到规律后,矩阵的旋转也不是难事。矩阵旋转的前提条件是必须保证矩阵是一个长宽相等的正方形矩阵。其次旋转时只能以90°的倍数进行旋转(向左或向右):

f805cfcd3f0895b588c64807b330dfb2.png

矩阵旋转规则

上图中左侧为顺时针旋转90°时的算法。每一种颜色表示要旋转的圈数。当矩阵的长度为基数或者偶数的时候,旋转的圈数都可以记为n/2(n为矩阵长度)。

以上图左侧为例,当矩阵旋转时,每旋转一个矩阵元素时,要同时涉及到四个矩阵元素同时旋转进行数据交换(左图各颜色线条所标识),这四个元素之间的关系如下图所示:

71ccdec517b10cdbc3e7ce87b07b816c.png

矩阵旋转中元素之间的关系

在旋转操作上,我们实际上只要操作上图6中白色标记的元素,即可完成所有元素的旋转。如果在双层循环中完成旋转操作,外层只要遍历矩阵的深度的一半,即i

1f98b0d633c7051562c50a025b03f53f.png

如果旋转的角度不是90°的整数倍,我们按照除以90取整的方式进行,并计算出旋转的角度是90,180还是270度。如果角度为负数,则说明是相反方向旋转。在leftRotate和rightRotate中都满足了上述两种情景的判断。上述方法测试情况如下:

a1643d73d7ed509855b58e337460b977.png
883e6e81f4e57060cef231f926c656d5.png

如果我们想设计一个俄罗斯方块的游戏,就可以用到数组实现矩阵的一些功能。在以后的内容中,我们会进行讲述。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值