1.矩陣
在數學中,矩陣是一個矩形陣列排列的複數和實數集合。是高等代數中常見的工具。在計算機科學中,一些數值分析、動畫製作、遊戲等方面就會用到矩陣。在程式語言中矩陣可以用一個二維數組進行模擬,如下圖所示:
大多數高級語言中,都支持二維數組,用二維數組來實現矩陣是非常容易的,程式語言更多的是用來模擬矩陣的加減操作以及移動操作。
2.矩陣的操作
在一些遊戲設計中,經常會用到矩陣進行操作,例如加減操作和旋轉操作就是使用頻率較多的操作。下面我們列舉幾個常見的矩陣操作:
2.1 矩陣相加
一般情況下,兩個矩陣相加,需要兩個矩陣擁有相同的大小(如下圖所示):
如果在計算機中進行模擬矩陣的相加,相當於兩個同等規模的二維數組相加,並進行同行同列的元素相加。相加後得到的矩陣依然是一個同等規模的矩陣數組。這個操作在程式語言中操作是非常簡單的。
2.2 矩陣錯位相加
矩陣錯位相加時,可以讓兩個不同規模的矩陣相加,這個模式的相加方式,只對兩個矩陣重合的部分進行相加(如下圖所示)。
2.3 矩陣旋轉
矩陣旋轉需要矩陣是一個規則矩陣(矩陣的長和寬相等,否則旋時丟失數據),矩陣的旋轉轉角為90度的倍數(如下圖所示)。
矩陣的旋轉在遊戲中的應用非常廣泛,例如我們熟悉的俄羅斯方塊中,就會用到矩陣的旋轉。
3.Java程序模擬矩陣
在Java中,模擬矩陣需要創建一個行列平衡的二維數組(要求每行的元素個數都一樣)。如果要進行旋轉,必須要求二維數組的行列一致。我們可以定義類Matrix進行矩陣的模擬,它需要包含一個二維數組,以及表示二維數組的行列整型值。Matrix類的聲明及構造方法如下所示:
3.1 矩陣添加元素操作
為了給矩陣增加數據添加的入口,我們可以在Matrix類中增加矩陣添加數據的操作(整體矩陣隨機添加元素、按行和列添加元素),以及一個列印矩陣的方法,這些方法如下所示:
這裡要注意方法setforEach中的Function<V,R>參數,它是一個函數式接口。它的目的在於讓開發者自己定義數據的計算規則。泛型V是函數方法apply中的參數,泛型R是apply方法的返回類型。在setforEach方法內,我們將矩陣元素作為參數傳遞到apply方法中。在方法setRandomMatr中,我們就利用setforEach進行了隨機數添加,但是我們沒有使用矩陣中的元素。
這幾個方法在添加到Matrix類中後,我們可以在main方法中進行一些測試(測試內容和結果如下所示):
3.2 矩陣相加操作
矩陣的第二個功能是完成矩陣的相加和錯位相加,這兩種相加方式可以通過參數來完成。進行錯位相加時,要判斷數組中的元素是否出界。在Matrix類中,添加add方法用於進行矩陣的相加和錯位相加(如下所示)。
進行矩陣相加時,要有一個基礎矩陣作為被加矩陣,被加矩陣默認為當前矩陣。進行矩陣相加時,允許偏移量小於0。下面為矩陣相加功能的測試結果:
3.3 矩陣旋轉操作
矩陣的旋轉是矩陣操作中稍微複雜一點的操作,如果找到規律後,矩陣的旋轉也不是難事。矩陣旋轉的前提條件是必須保證矩陣是一個長寬相等的正方形矩陣。其次旋轉時只能以90°的倍數進行旋轉(向左或向右):
上圖中左側為順時針旋轉90°時的算法。每一種顏色表示要旋轉的圈數。當矩陣的長度為基數或者偶數的時候,旋轉的圈數都可以記為n/2(n為矩陣長度)。
以上圖左側為例,當矩陣旋轉時,每旋轉一個矩陣元素時,要同時涉及到四個矩陣元素同時旋轉進行數據交換(左圖各顏色線條所標識),這四個元素之間的關係如下圖所示:
在旋轉操作上,我們實際上只要操作上圖6中白色標記的元素,即可完成所有元素的旋轉。如果在雙層循環中完成旋轉操作,外層只要遍歷矩陣的深度的一半,即i<row/2,內層j起始應以i為起點開始遍歷,到row-i-1結束。在編寫矩陣旋轉方法時,我們可以添加右旋轉、左旋轉、以及多倍90度角旋轉(實現代碼如下)。
如果旋轉的角度不是90°的整數倍,我們按照除以90取整的方式進行,並計算出旋轉的角度是90,180還是270度。如果角度為負數,則說明是相反方向旋轉。在leftRotate和rightRotate中都滿足了上述兩種情景的判斷。上述方法測試情況如下:
如果我們想設計一個俄羅斯方塊的遊戲,就可以用到數組實現矩陣的一些功能。在以後的內容中,我們會進行講述。