基于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

UDFBLR
白色黄色绿色蓝色橙色红色

魔方的中心块、棱块和角块

一个三阶魔方可分为三层,顶层、底层和中间层。有六个面,每个面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

程序下载链接:

基于MATLABGUI的魔方三维动态还原仿真程序-其他文档类资源-CSDN下载使用MATLABGUI功能设计制作的一个魔方三维动态还原仿真程序,点击魔方旋转按钮U\\\\D\\\\F\\\\B\\\\更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_42053235/85249566

以上是关于基于MATLAB GUI的魔方三维动态还原仿真程序的主要内容,如果未能解决你的问题,请参考以下文章

基于MATLAB GUI的魔方三维动态还原仿真程序

如何写一个魔方二维动态还原MATLAB仿真程序

如何写一个魔方二维动态还原MATLAB仿真程序

如何写一个魔方二维动态还原MATLAB仿真程序

魔方二维动态还原过程MATLAB仿真/魔方二维平面展开

三维手臂手指活动动态仿真基于MATLAB+python三维手臂动态仿真