基于MATLAB GUI的魔方三维动态还原仿真程序
Posted 嗑药的皮皮虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于MATLAB GUI的魔方三维动态还原仿真程序相关的知识,希望对你有一定的参考价值。
软件MATLAB R2019A
1、程序介绍
使用MATLAB GUI功能设计制作一个魔方三维动态还原仿真程序,点击魔方旋转按钮U\\D\\F\\B\\L\\R旋转方面相应面,逆\\顺时针按钮切换旋转方向,文字编辑框输入旋转步骤如U1B2L3再点击开始还原按钮然后魔方开始按步骤还原。
2、画三维魔方
如何画魔方的一个色块
使用patch()函数。原理:点按顺序连成封闭多边形
point_sequence=[1,2,3,4]; %点连接的顺序
square_xyz=[3,1,3;1,1,3;1,-1,3;3,-1,3]; %三维坐标4x3矩阵
patch('Faces',point_sequence,'Vertices',square_xyz,'FaceColor','blue');
axis([-3,3,-3,3,-3,3]);%坐标系范围
view(3);
程序说明:变量point_sequence为行向量,里面元素代表点连接的顺序;变量square_xyz为4x3阶矩阵,每行代表一个三维坐标;颜色为blue蓝色。
如何实现旋转
使用rotate()函数,命令行输入help rotate查看用法
>> help rotate
rotate - 以指定原点和方向旋转对象
此 MATLAB 函数 将图形对象 h 旋转 alpha 度。指定 h 为曲面、补片、线条、文本或图像对象。direction
是一个二元素或三元素向量,它与旋转轴原点共同确定旋转轴。旋转轴的默认原点是图框中心。该点未必是坐标区的原点。
rotate(h,direction,alpha)
rotate(...,origin)
注意:向量指向你逆时针旋转alpha 度,且alpha有正负。
point_sequence=[1,2,3,4]; %点连接的顺序
square_xyz=[3,1,3;1,1,3;1,-1,3;3,-1,3]; %三维坐标4x3矩阵
patch_handles=patch('Faces',point_sequence,'Vertices',square_xyz,'FaceColor','blue');
rotate(patch_handles,[1,0,0],90); %旋转画色块
程序说明:patch_handles绕向量[1,0,0]逆时针旋转90读。
%学习rotate的用法
clc;
clear;
filename = 'testrotate.gif'; % Specify the output file name
global rotate_direction
rotate_direction=struct('p_x',[1,0,0],'n_x',[-1,0,0],'p_y',[0,1,0],'n_y',[0,-1,0],'p_z',[0,0,1],'n_z',[0,0,-1]);
point_sequence=[1,2,3,4]; %点连接的顺序
square_xyz=[3,1,3;1,1,3;1,-1,3;3,-1,3]; %三维坐标4x3矩阵,行向量坐标
per_degree=10; %每次旋转10°
fig=figure;
axis([-3,3,-3,3,-3,3]);%坐标系范围
xlabel('X');
ylabel('Y');
zlabel('Z');
% view(3);%三维视角
view(130,30);%三维视角
patch_handles=patch('Faces',point_sequence,'Vertices',square_xyz,'FaceColor','blue');
for t=1:9
rotate(patch_handles,rotate_direction.('p_x'),per_degree); %画色块
pause(0.1);
%///生成GIF图
drawnow
frame = getframe(fig);
imt = frame2im(frame);
[A,map] = rgb2ind(imt,256); %将 RGB 图像转换为索引图像 A。map 最多包含 n 个颜色。
if t == 1
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.1);
else
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.1);
end
%///
end
程序运行结果:
3、利用魔方状态字符串生成魔方
3、1 什么是魔方状态字符串和解魔方步骤字符串
魔方的6个面及表示
魔方6个面分别用6个大写英文字母表示,对应颜色可以自己设定。
顶面Up | 底面Down | 前面Front | 背面Back | 左面Left | 右面Right |
U | D | F | B | L | R |
白色 | 黄色 | 绿色 | 蓝色 | 橙色 | 红色 |
魔方的中心块、棱块和角块
一个三阶魔方可分为三层,顶层、底层和中间层。有六个面,每个面9个色块,一共54个色块。总共由26个小方块组成,根据魔方每个小方块所处的位置可分为三种小方块,分别是中心块、棱块和角块。中心块有6个,每个中心块上只有一种颜色,只需用一个大写字母表示,魔方在旋转过程中中心块的相对位置都是不会变的。棱块有12个,棱块处于每条边的中间位置,每个棱块有两种颜色,用两个大写字母表示。角块有8个,每个角块3种颜色,用三个大写字母表示。
魔方状态字符串
可以用一串大写英文字母表示一个三阶魔方的状态,一个已经还原好的魔方可以用这样一串字符表示:UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR。
这种表示法是由一个叫Mike Reid的魔方爱好者首先使用的,它表示一个已经被解好的魔方。因为六个不同颜色中心块在任何旋转过程中相对位置都是不会变的,所以没有单个字符。这串标准字符中12个双字符表示魔方的12个棱块,每个棱块两种颜色。8个三字符表示魔方8个角块,每个角块三种颜色。对照这个标准字符串,一个打乱的魔方的两个中心块所夹的棱块可以表示出来,三个中心块所夹的角块可以表示出来。
cube_right_char=['UF ';'UR ';'UB ';'UL ';'DF ';'DR ';'DB ';'DL ';'FR ';'FL ';'BR ';'BL ';'UFR';'URB';'UBL';'ULF';'DRF';'DFL';'DLB';'DBR'];%正序
cube_error_char=['LU ';'LF ';'UF ';'BD ';'LB ';'RU ';'UB ';'FD ';'BR ';'RF ';'RD ';'DL ';'DBR';'BLU';'BDL';'LFU';'URB';'FLD';'FRU';'DRF'];%乱序
还原好的魔方的正序字符串cube_right_char代表位置,乱序字符串cube_error_char代表对应位置的颜色,如位置'UF'对应的颜色为'LU',即U面和F面所夹棱块颜色依次为L和U。
解魔方步骤字符串
拧魔方的动作用各个魔方面代表的字符加顺时针旋转的次数表示,如R1表示R面即右面顺时针旋转一次,R2表示R面顺时针旋转两次,R3代表R面顺时针旋转三次,也即逆时针旋转1次。
解魔方步骤字符串:U1D3F2L3B3F3U1L1D1L2U1F2R3U3B2L2U3F2U1F2L2F2D2L2B2D2L2U2F2U2
3、2 如何用魔方状态字符串生成魔方
以棱块为例:正序字符串确定棱块所在位置,乱序字符串确定棱块颜色。
根据魔方状态字符串将棱块和角块转化为patch句柄,中心块也转化为patch句柄。
patch_handles为26x3阶元胞矩阵,1到12行为棱块,13到20行为角块,21到26行为中心块。
global patch_handles %patch对象句柄
patch_handles=cell(26,3); %元胞矩阵,1到12行为棱块,13到20行为角块,21到26行为中心块,
4、旋转魔方的一个面
如何找出需要旋转的面
根据坐标找面,魔方色块边长为2,以魔方中心为原点(0,0,0),以U面为例,U面所在坐标轴为z轴正半轴,3个单位,即找出z=3的色块就找出棱块和角块和中心块。
5、GUI控件
以U按钮为例,回调函数为pushbuttonU_callback
pushbuttonU_h = uicontrol('Units','normalized','Position',[button_x,button_y,button_wide,button_high],...
'Style','pushbutton','String','U','Callback',@pushbuttonU_callback);
function pushbuttonU_callback(src,event)
global direction
pushbutton_Enable('off'); %使按钮不可按
rotation_time('U',direction); %旋转U面,direction=1时逆时针,-1时顺时针
pushbutton_Enable('on'); %使按钮可按
end
6、效果
上一篇文章画动态魔方作为本篇文章的补充
http://t.csdn.cn/LkJEGhttp://t.csdn.cn/LkJEG
程序下载链接:
以上是关于基于MATLAB GUI的魔方三维动态还原仿真程序的主要内容,如果未能解决你的问题,请参考以下文章