如何写一个魔方二维动态还原MATLAB仿真程序
? ? ? ? 之前文章寫過一個魔方二維動態還原MATLAB程序,寫得不怎么好,過于復雜,現在重新寫了一個,用簡單的方法編寫MATLAB程序。
?
1、基礎知識
了解魔方表示方法:魔方狀態字符串,可以看我之前的文章。
了解會用到的MATLAB基礎知識:數據類型有char、string、cell、struct,畫矩形函數rectangle
2、思路
用一個3X3矩陣存儲魔方一個面9個色塊的顏色,該面的旋轉就是矩陣的旋轉。旋轉魔方一個面即旋轉非中間層時,有5個面動了,即非中間層的21個色塊動了,用一個5X5矩陣存儲非中間層的21個色塊的顏色。
魔方二維展開坐標圖如圖所示,每個色塊都有一個對應的二維坐標(x,y),使用MATLAB自帶函數rectangle畫54個色塊。(x,y)為矩形左下頂點的坐標,w,h分別為矩形寬度和高度,'edgecolor'為矩形邊線的顏色,'k'代表黑色。'facecolor'為矩形面的顏色,'red'代表紅色。
rectangle('position',[x y w h],'edgecolor','k','facecolor','red');%畫正方形下面程序中fUxy為元胞數組,儲存了U面9個色塊的坐標,通過索引可以找到對應坐標。cubexy為結構體,儲存了所有54個色塊的坐標。
fUxy={{-1 1},{0 1},{1 1};{-1 0},{0 0},{1 0};{-1 -1},{0 -1},{1 -1}}; cubexy.('F')=fFxy;下圖為魔方每個色塊的索引圖,每個面9個色塊用3X3的矩陣表示,通過索引找到相應色塊。
下面程序中三個變量為結構體數組,如edge_block_index中字段'UF'對應的值為[3 2 1 2],其? ? 中[3 2]為U面色塊的索引,[1 2]為F面色塊的索引。
edge_block_index=struct('UF',[3 2 1 2],'UR',[2 3 2 1],'UB',[1 2 3 2],'UL',[2 1 2 3],'DF',[1 2 3 2 ],'DR',[2 3 2 3 ],...'DB',[3 2 1 2],'DL',[2 1 2 1],'FR',[2 3 3 2],'FL',[2 1 3 2],'BR',[2 3 1 2],'BL',[2 1 1 2]);%12棱塊 corner_block_index=struct('UFR',[3 3 1 3 3 1], 'URB',[1 3 1 1 3 3],'UBL',[1 1 3 1 1 3],'ULF',[3 1 3 3 1 1],...'DRF',[1 3 3 3 3 3],'DFL',[1 1 3 1 3 1],'DLB',[3 1 1 1 1 1],'DBR',[3 3 1 3 1 3]);%8角塊 centrol_block_index=struct('U',[2 2],'D',[2 2],'F',[2 2],'B',[2 2],'L',[2 2],'R',[2 2]);%中心塊?
下面程序中字符串矩陣fB存儲了B面9個色塊的顏色,fB為3X3矩陣。cube為結構體,儲存了所有54個色塊的顏色
fB=["blue","blue","blue";"blue","blue","blue";"blue","blue","blue"]; cube.('B')=fB;使用一個5X5的矩陣temp存儲要轉動的非中間層上21個色塊的顏色,轉動非中間層對應旋轉temp。MATLAB自帶的矩陣旋轉函數為rot90(),rot90(temp,1)代表矩陣temp逆時針旋轉90度。
temp =?
? 5×5 string 數組
? ? ""? ? ? ? ? ? "green" ? ? ?"yellow " ? ?"magenta" ? ?"" ? ? ??
? ? "white" ? ?"magenta" ? ?"blue" ? ? ? "blue" ? ? ? "yellow "
? ? "white" ? ?"magenta" ? ?"white" ? ? ?"white" ? ? ?"green" ?
? ? "blue"? ? ? "yellow " ? ?"magenta" ? ?"blue" ? ? ? "white" ?
? ? ""? ? ? ? ? ? ?"red" ? ? ? ?"green" ? ? ?"magenta" ? ?"" ? ? ??
特別要注意每個非中間層對應哪21個色塊。
3、程序操作
程序寫在一個.m文件中,包含多個自己寫的函數,點擊運行就行,按任意鍵開始動態還原。
right_cube為已經還原好的魔方的魔方狀態字符串,error_cube為未還原好的魔方的魔方狀態字符串,step為解魔方步驟,我網上找了一個基于TM法的C++編寫的解魔方程序,輸入的是魔方狀態字符串,輸出的是解魔方步驟字符串。
right_cube=['UF ';'UR ';'UB ';'UL ';'DF ';'DR ';'DB ';'DL ';'FR ';'FL ';'BR ';'BL ';'UFR';'URB';'UBL';'ULF';'DRF';'DFL';'DLB';'DBR'];%正序 error_cube=['LU ';'LF ';'UF ';'BD ';'LB ';'RU ';'UB ';'FD ';'BR ';'RF ';'RD ';'DL ';'DBR';'BLU';'BDL';'LFU';'URB';'FLD';'FRU';'DRF'];%亂序 step='U1D3F2L3B3F3U1L1D1L2U1F2R3U3B2L2U3F2U1F2L2F2D2L2B2D2L2U2F2U2';%解魔方步驟,自己根據解魔方算法生成的解魔方步驟修改?下圖是取魔方還原過程中的四幅圖組成一幅圖
4、總結
? ? ? ? 本程序可以用來檢驗解魔方算法生成的解魔方步驟的正確性,自己對著解魔方步驟用手擰魔方容易出錯。本程序還可以改編一下用來生成亂序魔方的魔方狀態字符串給解魔方算法生成的解魔方步驟,自己對著亂序魔方寫魔方狀態字符串是很讓人頭疼的。有了魔方動態還原程序和解魔方程序就無需一個實際的魔方來驗證解魔方程序的可靠性。
程序下載地址:(程序包括魔方二維動態還原程序和生成魔方狀態字符串程序)
(解壓密碼:pipixia)https://download.csdn.net/download/qq_42053235/74765774https://download.csdn.net/download/qq_42053235/74765774
原創不易,還請支持一下。?
總結
以上是生活随笔為你收集整理的如何写一个魔方二维动态还原MATLAB仿真程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5页面显示本地图片,h5使用Fi
- 下一篇: 把一个合数分成质数的乘积