精华内容
下载资源
问答
  • MATLAB魔方

    千次阅读 2018-10-16 10:47:33
    魔方程序说明 一、运行界面 运行程序。点击下方按钮,可旋转魔方指定的一层。 二、程序GUI代码 ...function varargout = mofang6...% MOFANG6 MATLAB code for mofang6.fig % MOFANG6, by itself, creates ...

    魔方程序说明

    一、运行界面

    运行程序。点击下方按钮,可旋转魔方指定的一层。

    二、程序GUI代码

    %Author:LeiZhen
    %Date:2018-10-16
    function varargout = mofang6(varargin)
    % MOFANG6 MATLAB code for mofang6.fig
    %      MOFANG6, by itself, creates a new MOFANG6 or raises the existing
    %      singleton*.
    %
    %      H = MOFANG6 returns the handle to a new MOFANG6 or the handle to
    %      the existing singleton*.
    %
    %      MOFANG6('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in MOFANG6.M with the given input arguments.
    %
    %      MOFANG6('Property','Value',...) creates a new MOFANG6 or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before mofang6_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to mofang6_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help mofang6
    
    % Last Modified by GUIDE v2.5 19-Aug-2015 11:28:05
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @mofang6_OpeningFcn, ...
                       'gui_OutputFcn',  @mofang6_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    
    % --- Executes just before mofang6 is made visible.
    function mofang6_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to mofang6 (see VARARGIN)
    
    % Choose default command line output for mofang6
    handles.output = hObject;
    
    x = [-0.5  0.5  0.5 -0.5 -0.5 -0.5;  0.5  0.5 -0.5 -0.5  0.5  0.5;  0.5  0.5 -0.5 -0.5  0.5  0.5; -0.5  0.5  0.5 -0.5 -0.5 -0.5]; %%X轴中层[-0.5,0.5]
    y = [-0.5 -0.5  0.5 -0.5 -0.5 -0.5;-0.5  0.5  0.5  0.5 -0.5 -0.5; -0.5  0.5  0.5  0.5  0.5  0.5; -0.5 -0.5  0.5 -0.5  0.5  0.5]; %%Y轴中层[-0.5,0.5]
    z = [0 0 0 0 0 1; 0 0 0 0 0 1; 1 1 1 1 0 1; 1 1 1 1 0 1];%%Z轴中层[0,1]%%第五列Z=0的平面,第六列控制Z=1的平面
    x1 = ones(size(x))+x;%%X轴上层[0.5,1.5]
    y1 = ones(size(x))+y;%%Y轴上层[0.5,1.5]
    x2 = -1*ones(size(x))+x;%%X轴下层[-1.5,-0.5]
    y2 = -1*ones(size(x))+y;%YX轴下层[-1.5,-0.5]
    z1 = ones(size(z))+z;%%Z轴上层[1,2]
    z2 = -1*ones(size(z))+z;%%Z轴下层[-1,0]
    Orgcell1 = [1 0 1  0  1 1 ];        %决定六个面的颜色
    Orgcell2 = [0 0 0.46 1  1 1];
    Orgcell3 = [0 1 0  0  0 1 ];
    Org1(:,1) = Orgcell1;%%转置
    Org2(:,1) = Orgcell2;%%转置
    Org3(:,1) = Orgcell3;%%转置
    Org(1,:,:)=[Org1 Org2 Org3 ];%%1*6*3的三维矩阵
    %Org(2,:,:)=[Org1 Org2 Org3 ];
    %Org(3,:,:)=[Org1 Org2 Org3 ];
    %Org(4,:,:)=[Org1 Org2 Org3 ];
    %axis(handles.axes_mofang)
    figure(1);
    hold on
    %%魔方共27个小块,hn代表其中某一小块
    global h0 h1 h2 h3 h4 h5 h6 h7 h8 h10 h11 h12 h13 h14 h15 h16 h17 h18 h20 h21 h22 h23 h24 h25 h26 h27 h28
    h0= patch(x2,y1,z, Org);%%X轴下层[-1.5,0.5],Y轴上层[0.5,1.5],Z轴中层[0,1]
    h1 = patch(x,y1,z, Org);  %%X轴中层[-0.5,0.5],Y轴上层[0.5,1.5],Z轴中层[0,1]
    h2 = patch(x1,y1,z, Org);%%X轴上层[0.5,1.5],Y轴上层[0.5,1.5],Z轴中层[0,1]
    h3 = patch(x2,y,z, Org);  %%X轴下层[-1.5,0.5],Y轴中层[-0.5,0.5],Z轴中层[0,1]
    h4 = patch(x,y,z, Org);    %%X轴中层[-0.5,0.5],Y轴中层[-0.5,0.5],Z轴中层[0,1]
    h5 = patch(x1,y,z, Org);  %%X轴上层[0.5,1.5],Y轴中层[-0.5,0.5],Z轴中层[0,1]
    h6 = patch(x2,y2,z, Org);%%X轴下层[-1.5,0.5],Y轴下层[-1.5,-0.5],Z轴中层[0,1]
    h7 = patch(x,y2,z, Org);  %%X轴中层[-0.5,0.5],Y轴下层[-1.5,-0.5],Z轴中层[0,1]
    h8 = patch(x1,y2,z, Org);%%X轴上层[0.5,1.5],Y轴下层[-1.5,-0.5],Z轴中层[0,1]
     
    h10 = patch(x2,y1,z1, Org);%%X轴下层[-1.5,0.5],Y轴上层[0.5,1.5],Z轴上层[1,2]
    h11 = patch(x,y1,z1, Org);%%X轴中层[-0.5,0.5],Y轴上层[0.5,1.5],Z轴上层[1,2]
    h12 = patch(x1,y1,z1, Org);%%X轴上层[0.5,1.5],Y轴上层[0.5,1.5],Z轴上层[1,2]
    h13 = patch(x2,y,z1, Org);%%X轴下层[-1.5,0.5],Y轴中层[-0.5,0.5],Z轴上层[1,2]
    h14 = patch(x,y,z1, Org);%%X轴中层[-0.5,0.5],Y轴中层[-0.5,0.5],Z轴上层[1,2]
    h15 = patch(x1,y,z1, Org);%%X轴上层[0.5,1.5],Y轴中层[-0.5,0.5],Z轴上层[1,2]
    h16 = patch(x2,y2,z1, Org);%%X轴下层[-1.5,0.5],Y轴下层[-1.5,-0.5],Z轴上层[1,2]
    h17 = patch(x,y2,z1, Org);%%X轴中层[-0.5,0.5],Y轴下层[-1.5,-0.5],Z轴上层[1,2]
    h18 = patch(x1,y2,z1, Org);%%X轴上层[0.5,1.5],Y轴下层[-1.5,-0.5],Z轴上层[1,2]
     
    h20 = patch(x2,y1,z2, Org);%%X轴下层[-1.5,0.5],Y轴上层[0.5,1.5],Z轴下层[-1,0]
    h21 = patch(x,y1,z2, Org);%%X轴中层[-0.5,0.5],Y轴上层[0.5,1.5],Z轴下层[-1,0]
    h22 = patch(x1,y1,z2, Org);%%X轴上层[0.5,1.5],Y轴上层[0.5,1.5],Z轴下层[-1,0]
    h23 = patch(x2,y,z2, Org);%%X轴下层[-1.5,0.5],Y轴中层[-0.5,0.5],Z轴下层[-1,0]
    h24 = patch(x,y,z2, Org);%%X轴中层[-0.5,0.5],Y轴中层[-0.5,0.5],Z轴下层[-1,0]
    h25 = patch(x1,y,z2, Org);%%X轴上层[0.5,1.5],Y轴中层[-0.5,0.5],Z轴下层[-1,0]
    h26 = patch(x2,y2,z2, Org);%%X轴下层[-1.5,0.5],Y轴下层[-1.5,-0.5],Z轴下层[-1,0]
    h27 = patch(x,y2,z2, Org);%%X轴中层[-0.5,0.5],Y轴下层[-1.5,-0.5],Z轴下层[-1,0]
    h28 = patch(x1,y2,z2, Org);%%X轴上层[0.5,1.5],Y轴下层[-1.5,-0.5],Z轴下层[-1,0]
    hold off;
    axis equal tight                                %%显示的三维背景
    axis([-4 4 -4 4 -4 4]);                        %%
    title('三阶魔方');                               %%
    xlabel('Variable X');                        %%
    ylabel('Variable Y');                        %%
    zlabel('Variable Z');                         %%
    grid on                                               %%显示的三维背景
    
    
    % Update handles structure
    guidata(hObject, handles);
    % UIWAIT makes mofang6 wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = mofang6_OutputFcn(hObject, eventdata, handles) 
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get default command line output from handles structure
    varargout{1} = handles.output;
    
    
    function ssz=shunshizhen(h,direct)
    origin=[0 0 0.5]; %魔方正中心,此为旋转中心
    theta=11.25;%5.625;  %每次转动的角度
    H=h;
    for i=1:8        
        rotate(H(:),direct,theta,origin)   
        pause(0.01)   %%停顿的秒数
    end
    h11s=h(1,1);h12s=h(1,2);h13s=h(1,3);h21s=h(2,1);h22s=h(2,2);h23s=h(2,3);h31s=h(3,1);h32s=h(3,2);h33s=h(3,3);
    h(1,1)=h31s;h(1,2)=h21s;h(1,3)=h11s;h(2,1)=h32s;h(2,2)=h22s;h(2,3)=h12s;h(3,1)=h33s;h(3,2)=h23s;h(3,3)=h13s;
    ssz=h;
    
    
    function nsz=nishizhen(h,direct)
    origin=[0 0 0.5]; %魔方正中心,为旋转中心
    theta=11.25;  %每次转动的角度
    H=h;
    for i=1:8        
        rotate(H(:),direct,theta,origin)   
        pause(0.01)   %%停顿的秒数
    end
    h11s=h(1,1);h12s=h(1,2);h13s=h(1,3);h21s=h(2,1);h22s=h(2,2);h23s=h(2,3);h31s=h(3,1);h32s=h(3,2);h33s=h(3,3);
    h(1,1)=h13s;h(1,2)=h23s;h(1,3)=h33s;h(2,1)=h12s;h(2,2)=h22s;h(2,3)=h32s;h(3,1)=h11s;h(3,2)=h21s;h(3,3)=h31s;
    nsz = h;
    
    
    function tiaozheng(handles)
    global h0 h1 h2 h3 h4 h5 h6 h7 h8 h10 h11 h12 h13 h14 h15 h16 h17 h18 h20 h21 h22 h23 h24 h25 h26 h27 h28
    if get(handles. pushbutton_xup,'value')==1
        H1=[h18  h15  h12; h8 h5  h2;h28 h25  h22]; %H1为有蓝色面的九小块,X轴上层
        h=nishizhen(H1,[1,0,0]);
        h18=h(1,1);h15=h(1,2);h12=h(1,3);h8=h(2,1);h5=h(2,2);h2=h(2,3);h28=h(3,1);h25=h(3,2);h22=h(3,3);
    elseif get(handles. pushbutton_xmid,'value')==1    
        H2=[h17  h14  h11; h7 h4  h1;h27 h24  h21]; %H2为X轴中层
        h=nishizhen(H2,[1,0,0]);
        h17=h(1,1);h14=h(1,2);h11=h(1,3);h7=h(2,1);h4=h(2,2);h1=h(2,3);h27=h(3,1);h24=h(3,2);h21=h(3,3);  
    elseif get(handles. pushbutton_xdown,'value')==1    
        H3=[h16  h13  h10; h6 h3  h0;h26 h23  h20]; %H3为X轴下层
        h=nishizhen(H3,[1,0,0]);
        h16=h(1,1);h13=h(1,2);h10=h(1,3);h6=h(2,1);h3=h(2,2);h0=h(2,3);h26=h(3,1);h23=h(3,2);h20=h(3,3);  
    elseif get(handles. pushbutton_yup,'value')==1   
        H4=[ h10 h11 h12;h0  h1  h2; h20 h21 h22];  %H4为Y轴上层
        h=shunshizhen(H4,[0,1,0]);
        h10=h(1,1);h11=h(1,2);h12=h(1,3);h0=h(2,1);h1=h(2,2);h2=h(2,3);h20=h(3,1);h21=h(3,2);h22=h(3,3);    
    elseif get(handles. pushbutton_ymid,'value')==1   
        H5=[ h13 h14 h15;h3  h4  h5; h23 h24 h25];  %H5为Y轴中层
        h=shunshizhen(H5,[0,1,0]);
        h13=h(1,1);h14=h(1,2);h15=h(1,3);h3=h(2,1);h4=h(2,2);h5=h(2,3);h23=h(3,1);h24=h(3,2);h25=h(3,3);
    elseif get(handles. pushbutton_ydown,'value')==1    
        H6=[h16 h17 h18;h6 h7 h8;h26 h27 h28];  %H6为有红色面的九小块,Y轴下层
        h=shunshizhen(H6,[0,1,0]);
        h16=h(1,1);h17=h(1,2);h18=h(1,3);h6=h(2,1);h7=h(2,2);h8=h(2,3);h26=h(3,1);h27=h(3,2);h28=h(3,3);
    elseif get(handles. pushbutton_zup,'value')==1    
        H7=[h10 h11  h12; h13 h14  h15;h16 h17  h18]; %H7为Z轴上层  
        h=nishizhen(H7,[0,0,1]);
        h10=h(1,1);h11=h(1,2);h12=h(1,3);h13=h(2,1);h14=h(2,2);h15=h(2,3);h16=h(3,1);h17=h(3,2);h18=h(3,3);    
    elseif get(handles. pushbutton_zmid,'value')==1    
        H8=[h0 h1  h2; h3 h4  h5;h6 h7  h8]; %H8为Z轴中层  
        h=nishizhen(H8,[0,0,1]);
        h0=h(1,1);h1=h(1,2);h2=h(1,3);h3=h(2,1);h4=h(2,2);h5=h(2,3);h6=h(3,1);h7=h(3,2);h8=h(3,3);
    elseif get(handles. pushbutton_zdown,'value')==1
        H9=[h20 h21 h22; h23 h24 h25;h26 h27 h28];  %H9为有黄色面的九小块,Z轴下层
        h=nishizhen(H9,[0,0,1]);
        h20=h(1,1);h21=h(1,2);h22=h(1,3);h23=h(2,1);h24=h(2,2);h25=h(2,3);h26=h(3,1);h27=h(3,2);h28=h(3,3);
    end
    
    
    % --- Executes on button press in pushbutton_xup.
    function pushbutton_xup_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_xup (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    tiaozheng(handles);
    
    
    % --- Executes on button press in pushbutton_xmid.
    function pushbutton_xmid_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_xmid (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    tiaozheng(handles);
    
    
    % --- Executes on button press in pushbutton_xdown.
    function pushbutton_xdown_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_xdown (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    tiaozheng(handles);
    
    
    % --- Executes on button press in pushbutton_yup.
    function pushbutton_yup_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_yup (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    tiaozheng(handles);
    
    
    % --- Executes on button press in pushbutton_ymid.
    function pushbutton_ymid_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_ymid (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    tiaozheng(handles);
    
    
    % --- Executes on button press in pushbutton_ydown.
    function pushbutton_ydown_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_ydown (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    tiaozheng(handles);
    
    
    % --- Executes on button press in pushbutton_zup.
    function pushbutton_zup_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_zup (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    tiaozheng(handles);
    
    
    % --- Executes on button press in pushbutton_zmid.
    function pushbutton_zmid_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_zmid (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    tiaozheng(handles);
    
    
    % --- Executes on button press in pushbutton_zdown.
    function pushbutton_zdown_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton_zdown (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    tiaozheng(handles);

    三、GUI修改位置

    新建一个空的GUI,命名为mofang6并保存。添加9个按钮,并按下图方式命名,每个按钮的属性都只修改String和Tag即可。

    展开全文
  • Matlab魔方矩阵的创建及逻辑矩阵的用法前言一、魔方矩阵二、代码部分总结 前言 看书上关于n阶魔方矩阵创建的例题的时候,对逻辑矩阵的相关语句产生了些疑惑,解决以后感觉有点意思,记录一下 一、魔方矩阵 魔方矩阵...

    Matlab魔方矩阵的创建及逻辑矩阵的用法

    前言

    看书上关于n阶魔方矩阵创建的例题的时候,对逻辑矩阵的相关语句产生了些疑惑,解决以后感觉有点意思,记录一下

    一、魔方矩阵

    魔方矩阵(magic matrix),是指由1~n2n^2的正整数按照一定规则排列而成,且每行每列、每对角线的和都等于n(n2+1)2\frac{n(n^2+1)}{2}

    就生成规则而言,魔方矩阵可分为三类:1. n为奇数;2. n为不能被4整除的偶数;3. n为能被4整除的偶数。这里只讨论第三种情况。

    二、代码部分

    代码如下:

    n=4; % n为任何能被4整除的整数,这里取4使阶数不大更好阐述
    G=logical(eye(4,4)+rot90(eye(4,4))); %注意这里生成的是逻辑阵!
    m=n/4;
    K=repmat(G,m,m); %repmat以指定的行列铺放模块数组,这里得到需要“补运算”的元素位置阵
    N=n^2;
    A=reshape(1:N,n,n); %1~N个数字按顺序从列方向上一个个放过去生成一个n*n阵
    A(K)=N-A(K)+1 %最后输出的是“补运算”过的A阵,即魔方矩阵
    

    这里先列出,取n=4时,未进行第7行前G、K、A的值:

    逻辑阵G =K=
    (1001011001101001) \left( \begin{array}{cccc} 1 & 0 & 0 & 1\\ 0 & 1 & 1 & 0\\ 0 & 1 & 1 & 0\\ 1 & 0 & 0 & 1\\ \end{array} \right)

    A =
    (15913261014371115481216) \left( \begin{array}{cccc} 1 & 5 & 9 & 13\\ 2 & 6 & 10 & 14\\ 3 & 7 & 11 & 15\\ 4 & 8 & 12 & 16\\ \end{array} \right)

    解释一下第7行:由于K为逻辑阵,对于A(K)而言,先找到K中值为1元素的位置,取出A阵相应位置的元素,并按顺序排成列数组,即得到A(K)。
    未进行第7行前的A(K)=[1,4,6,7,10,11,13,16]A(K)=[1,4,6,7,10,11,13,16]',代入第7行进行加减运算,最后赋回A(K)。此时A(K)=[16,13,11,10,7,6,4,1]A(K)=[16,13,11,10,7,6,4,1]'。而matlab最后一步返回的是A的值,因为A(K)表示A相应位置上的值,A(K)变了,所以此时的A也变了

    A =
    (16594211714310615138121) \left( \begin{array}{cccc} 16 & 5 & 9 & 4\\ 2 & 11 & 7 & 14\\ 3 & 10 & 6 & 15\\ 13 & 8 & 12 & 1\\ \end{array} \right)

    即是最终得到的魔方矩阵。

    总结

    这里主要就是逻辑矩阵的应用,最后一行直接返回A的值还是挺有意思的。

    展开全文
  • 更新:添加代码链接:nkyang/MagicCube有时间的话,会陆续把之前文章的代码都整理好了传到github上去,这样个人文章里面就...易夕:MATLAB画图技巧:让魔方转起来!​zhuanlan.zhihu.com进一步地,能否拼出更复杂的...

    dd7809675631110a2a18b4f2f1becf33.png

    更新:

    添加代码链接:nkyang/MagicCube

    有时间的话,会陆续把之前文章的代码都整理好了传到github上去,这样个人文章里面就不会出现代码,文章可读性更好。


    我又回来更新了,在上一次的文章中,我写了一个可以用来玩魔方的程序,当时在文章的结尾处,我展示了一个用七阶魔方拼出心形图案的例子。

    易夕:MATLAB画图技巧:让魔方转起来!zhuanlan.zhihu.com
    86ef2649e78cef3cdaecc3a4ead2d452.png

    进一步地,能否拼出更复杂的图案?给定一张图片作为参考,能否使用高阶魔方拼出清晰的画面?这就是本文要解决的问题。

    1.高效的高阶魔方生成函数

    一个很重要的问题就是,上次的魔方构造函数的复杂度很高。一个N阶魔方,是用N^3个立方体构成,每个立方体包括7个hgtransfrom对象,6个patch对象。当N>30时,程序会慢的令人发指,光生成魔方可能就需要一个小时以上。所以我改进了程序,现在的N阶魔方,由6*N^2个patch对象构成,每个patch对象对应1个hgtransform对象。

    %% 创建一个n×n的魔方
    

    2. XYZ轴旋转函数

    以X轴为例,ids层逆时针旋转90度的函数为(ids可以是数组,这样调用起来比较方便)

    %% X轴方向进行逆时针旋转
    

    ids层顺时针旋转90度的函数如下:

    %% X轴方向进行顺时针旋转
    

    y轴,z轴的函数就不贴了,不然文章就是大段的代码了...

    3.根据输入的图像,用高阶魔方拼出来

    首先,对于N阶魔方,只有中间的(N-2)*(N-2)的范围可以用来表示图像。我们需要将输入的图像,灰度化,二值化成为一个(N-2)*(N-2)的矩阵。

    以一个70阶矩阵为例,其中要表示的图片来自于我之前的一篇文章。(裁掉了周围的空白)

    易夕:MATLAB:如何画南开大学校徽?zhuanlan.zhihu.com
    b67f3ddc9776d9561e94f579e73dee30.png

    图像预处理(读取图像,灰度化,二值化,resize图片大小)

    N 

    70阶魔方的生成。大约需要10分钟来生成如此高阶的魔方。(目前实际存在的最高阶的魔方是一个模仿爱好者用3D打印DIY的33阶魔方,花了200多个小时组装,重点是,我觉得很丑...链接在这里)

    figure

    看一看效果图,令人震撼的70阶魔方!

    085f66b6df3ede4cf9fe76b29b68ad2c.png

    按照给出的图片信息,实现魔方的旋转。

    for 

    魔方整个旋转的过程,我写入到了一个动图中,如下图所示。Gif大小超过10M,无法上传,这是压缩后的结果。(整个程序,包含写入动图在内,跑了大概10个小时。)

    6029e84980b0a05eb7d5723d44e2562b.gif
    这张图片,花了10个多小时

    从不同的角度来看最后的结果。有重影,具体不是很清楚怎么造成的。

    11219a46323e6a07bbbaf80bc25a25e0.gif
    哪位大佬知道重影是怎么回事

    最后,附送一张32阶魔方拼出的渣打银行logo图。

    95eeaed1afbae907f285e29d2f897a78.png
    搞定了!

    专栏目录

    易夕:MATLAB Tricks 专栏目录zhuanlan.zhihu.com
    展开全文
  • 更新:添加代码链接:nkyang/MagicCube有时间的话,会陆续把之前文章的代码都整理好了传到github上去,这样个人文章里面就...易夕:MATLAB画图技巧:让魔方转起来!​zhuanlan.zhihu.com进一步地,能否拼出更复杂的...

    f48fc9fe91ee537de2ef99ce48db6c47.png

    更新:

    添加代码链接:nkyang/MagicCube

    有时间的话,会陆续把之前文章的代码都整理好了传到github上去,这样个人文章里面就不会出现代码,文章可读性更好。


    我又回来更新了,在上一次的文章中,我写了一个可以用来玩魔方的程序,当时在文章的结尾处,我展示了一个用七阶魔方拼出心形图案的例子。

    易夕:MATLAB画图技巧:让魔方转起来!zhuanlan.zhihu.com
    d05a9d3ed1c5d5ee4f2c76a9e810328c.png

    进一步地,能否拼出更复杂的图案?给定一张图片作为参考,能否使用高阶魔方拼出清晰的画面?这就是本文要解决的问题。

    1.高效的高阶魔方生成函数

    一个很重要的问题就是,上次的魔方构造函数的复杂度很高。一个N阶魔方,是用N^3个立方体构成,每个立方体包括7个hgtransfrom对象,6个patch对象。当N>30时,程序会慢的令人发指,光生成魔方可能就需要一个小时以上。所以我改进了程序,现在的N阶魔方,由6*N^2个patch对象构成,每个patch对象对应1个hgtransform对象。

    %% 创建一个n×n的魔方
    function t = magicCube(n)
    x = [-1 -1  0  0];
    y = [-1  0  0 -1];
    z = [0 0 0 0];
    c = colormap(jet(6));
    t = gobjects(n,n,n); 
    % lw为线宽,对于高阶魔方,线要细
    lw = 0.25;
    for ii = 1:n
        for jj = 1:n
            for kk = 1:6
                switch kk
                    case 1
                        t(ii,jj,1) = hgtransform('Parent',gca);
                        patch(x+ii-n/2,y+jj-n/2,z-n/2,c(kk,:),'Parent',t(ii,jj,1),'LineWidth',lw);
                    case 2
                        t(ii,1,jj) = hgtransform('Parent',gca);
                        patch(x+ii-n/2,z-n/2,y+jj-n/2,c(kk,:),'Parent',t(ii,1,jj),'LineWidth',lw);
                    case 3
                        t(1,ii,jj) = hgtransform('Parent',gca);
                        patch(z-n/2,x+ii-n/2,y+jj-n/2,c(kk,:),'Parent',t(1,ii,jj),'LineWidth',lw);
                    case 4
                        t(n,ii,jj) = hgtransform('Parent',gca);
                        patch(z+n/2,x+ii-n/2,y+jj-n/2,c(kk,:),'Parent',t(n,ii,jj),'LineWidth',lw);
                    case 5
                        t(ii,n,jj) = hgtransform('Parent',gca);
                        patch(x+ii-n/2,z+n/2,y+jj-n/2,c(kk,:),'Parent',t(ii,n,jj),'LineWidth',lw);
                    case 6
                        t(ii,jj,n) = hgtransform('Parent',gca);
                        patch(x+ii-n/2,y+jj-n/2,z+n/2,c(kk,:),'Parent',t(ii,jj,n),'LineWidth',lw);
                end
            end
        end
    end
    end

    2. XYZ轴旋转函数

    以X轴为例,ids层逆时针旋转90度的函数为(ids可以是数组,这样调用起来比较方便)

    %% X轴方向进行逆时针旋转
    function t = rotX(t,ids)
    N = length(t);
    Rx = makehgtform('xrotate',pi/2);
    for x = ids
        for y = 1:N
            for z = 1:N
                if isgraphics(t(x,y,z),'hgtransform')
                    t(x,y,z).Matrix = Rx*t(x,y,z).Matrix;
                end
            end
        end
        t(x,:,:) = rot90(squeeze(t(x,:,:)));
    end

    ids层顺时针旋转90度的函数如下:

    %% X轴方向进行顺时针旋转
    function t = rotX_(t,ids)
    N = length(t);
    Rx = makehgtform('xrotate',-pi/2);
    for x = ids
        for y = 1:N
            for z = 1:N
                if isgraphics(t(x,y,z),'hgtransform')
                    t(x,y,z).Matrix = Rx*t(x,y,z).Matrix;
                end
            end
        end
        t(x,:,:) = rot90(squeeze(t(x,:,:)),3);
    end

    y轴,z轴的函数就不贴了,不然文章就是大段的代码了...

    3.根据输入的图像,用高阶魔方拼出来

    首先,对于N阶魔方,只有中间的(N-2)*(N-2)的范围可以用来表示图像。我们需要将输入的图像,灰度化,二值化成为一个(N-2)*(N-2)的矩阵。

    以一个70阶矩阵为例,其中要表示的图片来自于我之前的一篇文章。(裁掉了周围的空白)

    易夕:MATLAB:如何画南开大学校徽?zhuanlan.zhihu.com
    73623ed0e0049df96176472f21cbcd37.png

    图像预处理(读取图像,灰度化,二值化,resize图片大小)

    N = 70;
    data = imread('NKlogo.png');
    data = rgb2gray(data);
    data = imbinarize(data);
    data = imresize(data,[N-2,N-2]);

    70阶魔方的生成。大约需要10分钟来生成如此高阶的魔方。(目前实际存在的最高阶的魔方是一个模仿爱好者用3D打印DIY的33阶魔方,花了200多个小时组装,重点是,我觉得很丑...链接在这里)

    figure()
    ax = gca;
    ax.Box = 'off';
    axis(ax,'equal','off',[-N,N,-N,N,-N,N]/2);
    ax.Projection = 'perspective';
    t = magicCube(N);
    [A,map] = rgb2ind(frame2im(getframe),256);
    imwrite(A,map,'2.gif','LoopCount',65535,'DelayTime',0);

    看一看效果图,令人震撼的70阶魔方!

    286dc682d1976bf9684ed7252a7e416a.png

    按照给出的图片信息,实现魔方的旋转。

    for ii = 1:N-2
        ids = N-find(~data(ii,:));
        t = rotZ_(t,N-ii);
        t = rotY(t,ids);
        t = rotZ(t,N-ii);
        t = rotY_(t,ids);`
    end

    魔方整个旋转的过程,我写入到了一个动图中,如下图所示。Gif大小超过10M,无法上传,这是压缩后的结果。(整个程序,包含写入动图在内,跑了大概10个小时。)

    9fca3483ef5bcb985497f43666863f8b.gif
    这张图片,花了10个多小时

    从不同的角度来看最后的结果。有重影,具体不是很清楚怎么造成的。

    5eca72e24f7e60f29c6927d6107ff1e1.gif
    哪位大佬知道重影是怎么回事

    最后,附送一张32阶魔方拼出的渣打银行logo图。

    1e3c109c697874c449d541a0e8d7c0aa.png
    搞定了!

    专栏目录

    易夕:MATLAB Tricks 专栏目录zhuanlan.zhihu.com
    展开全文
  • matlab魔方

    2019-06-30 22:53:21
    matlab魔方
  • matlab 验证魔方矩阵

    2019-12-06 21:16:09
    function mofang(A) [n,m]=size(A); if n<3||m<3,disp('error'); elseif n~=m,disp('the size of M X must be N-by-N M'); else B=[sum(A,1),sum(A,2)',sum(diag(A))',sum(diag(rot90(A)))'];...
  • Matlab魔方阵magic

    千次阅读 2020-02-15 15:15:17
    magic函数是用于创建魔方阵。魔方阵的特点是:每行每列以及对角线的元素之和相等的方阵。 2、代码示例 clc; clear all; A = magic(4) sum(A(1,:)) %求第一行的元素之和 sum(A(:,1)) %求第一列的元素之和 sum...
  • MATLAB三维魔方GUI.zip

    2020-05-21 16:14:33
    大二的时候,没什么事情,打算用MATLAB做一个三阶魔方机器人,所以使用GUI做了个上位机,使用MATLAB编写的3阶魔方GUI,有两套解算算法,可以实现魔方状态设置(始末状态都可以设置),使用 patch 实现的魔方的旋转...
  • 里面是使用matlab实现的三维魔方,有按钮可以对魔方进行旋转,魔方的六个面颜色都不同,类似现实中玩的三阶魔方,源代码可以直接运行(.m文件)。
  • 1.魔方基础知识 1.1魔方各面表示 根据魔方各面所处位置将三阶魔方六个面分别用六个大写英文字母进行表示,相应面上的颜色也分别用这六个大写英文字母进行表示。 魔方六个面对应的大写英文字母及颜色 顶...
  • Matlab与线性代数 -- 魔方矩阵

    千次阅读 2016-11-10 11:34:42
    本图文主要介绍了如何利用Matlab实现魔方矩阵。
  • MATLAB工具箱大全- 魔方模拟器与规划求解
  • 有一个酷爱魔方的朋友,托我给他定制一个专门用于“训练魔方观察和预判能力”的程序。听完需求之后觉得很有趣,就答应了,并决定把整个制作过程公开。上次已经画好三阶魔方,是时候让它动起来了。话不多说,直接上...
  • Matlab环境下画3D魔方并且实现旋转
  • 【手把手制作三阶魔方模拟器】用MATLAB绘制一个一阶魔方绘制三阶魔方每个块的中心为每个块六面上色# 其他 by 今天不飞了 有一个酷爱魔方的朋友,托我给他定制一个专门用于“训练魔方观察和预判能力”的程序。听完...
  • matlab中魔法矩阵的程序是隐藏的,用type命令显示magic.m。魔方矩阵的设计思路之一,是构造一个扩展的零矩阵A ,随后用顺序数矩阵v填入A的相应对角线,再用行、列叠加使矩阵A的中心n阶矩阵零元素填满。最后取出中心n...
  • 如果只是画一个静态的魔方,必然是很简单的,6个不同颜色的面,中间加上若干条线就OK了。但我想实现的是一个真正的能够转的魔方,就要从最基础的小立方体开始搭起来了。1.搭建一个基本立方体主要思路是,用fill3函数...
  • LOGISTIC魔方图像加密

    2016-11-21 16:26:50
    logistic 图像加密 解密 matlab 魔方变换
  • 有一个酷爱魔方的朋友,托我给他定制一个专门用于“训练魔方观察和预判能力”的程序。听完需求之后觉得很有趣,就答应了,并决定把整个制作过程公开。
  • 三阶魔方自动求解及动态可视化matlab代码思路与步骤三阶魔方有6个面,每个面有3×33\times33×3小块,用一个6×3×36\times3\times36×3×3的矩阵来保存魔方的状态;定义4+12种魔方旋转行为:整体旋转(左右上下共4种...
  • 本微信图文详细介绍了利用Matlab实现奇数阶魔方矩阵的编程。
  • 三阶魔方自动求解及动态可视化matlab代码

    千次阅读 多人点赞 2021-01-23 16:44:57
    三阶魔方自动求解及动态可视化matlab代码欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 188
精华内容 75
关键字:

matlab魔方

matlab 订阅