-
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魔方矩阵的创建及逻辑矩阵的用法
2021-03-12 17:35:56Matlab魔方矩阵的创建及逻辑矩阵的用法前言一、魔方矩阵二、代码部分总结 前言 看书上关于n阶魔方矩阵创建的例题的时候,对逻辑矩阵的相关语句产生了些疑惑,解决以后感觉有点意思,记录一下 一、魔方矩阵 魔方矩阵...前言
看书上关于n阶魔方矩阵创建的例题的时候,对逻辑矩阵的相关语句产生了些疑惑,解决以后感觉有点意思,记录一下
一、魔方矩阵
魔方矩阵(magic matrix),是指由1~的正整数按照一定规则排列而成,且每行每列、每对角线的和都等于。
就生成规则而言,魔方矩阵可分为三类: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=
A =
解释一下第7行:由于K为逻辑阵,对于A(K)而言,先找到K中值为1元素的位置,取出A阵相应位置的元素,并按顺序排成列数组,即得到A(K)。
未进行第7行前的,代入第7行进行加减运算,最后赋回A(K)。此时。而matlab最后一步返回的是A的值,因为A(K)表示A相应位置上的值,A(K)变了,所以此时的A也变了A =
即是最终得到的魔方矩阵。
总结
这里主要就是逻辑矩阵的应用,最后一行直接返回A的值还是挺有意思的。
-
imresize函数matlab_我的MATLAB魔方新玩法:拼出任意图案!
2020-11-28 12:50:43更新:添加代码链接:nkyang/MagicCube有时间的话,会陆续把之前文章的代码都整理好了传到github上去,这样个人文章里面就...易夕:MATLAB画图技巧:让魔方转起来!zhuanlan.zhihu.com进一步地,能否拼出更复杂的...更新:
添加代码链接:nkyang/MagicCube
有时间的话,会陆续把之前文章的代码都整理好了传到github上去,这样个人文章里面就不会出现代码,文章可读性更好。
我又回来更新了,在上一次的文章中,我写了一个可以用来玩魔方的程序,当时在文章的结尾处,我展示了一个用七阶魔方拼出心形图案的例子。
易夕:MATLAB画图技巧:让魔方转起来!zhuanlan.zhihu.com进一步地,能否拼出更复杂的图案?给定一张图片作为参考,能否使用高阶魔方拼出清晰的画面?这就是本文要解决的问题。
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图像预处理(读取图像,灰度化,二值化,resize图片大小)
N
70阶魔方的生成。大约需要10分钟来生成如此高阶的魔方。(目前实际存在的最高阶的魔方是一个模仿爱好者用3D打印DIY的33阶魔方,花了200多个小时组装,重点是,我觉得很丑...链接在这里)
figure
看一看效果图,令人震撼的70阶魔方!
按照给出的图片信息,实现魔方的旋转。
for
魔方整个旋转的过程,我写入到了一个动图中,如下图所示。Gif大小超过10M,无法上传,这是压缩后的结果。(整个程序,包含写入动图在内,跑了大概10个小时。)
这张图片,花了10个多小时 从不同的角度来看最后的结果。有重影,具体不是很清楚怎么造成的。
哪位大佬知道重影是怎么回事 最后,附送一张32阶魔方拼出的渣打银行logo图。
搞定了! 专栏目录
易夕:MATLAB Tricks 专栏目录zhuanlan.zhihu.com -
css3魔方3乘3每层旋转_我的MATLAB魔方新玩法:拼出任意图案!
2021-01-06 17:49:22更新:添加代码链接:nkyang/MagicCube有时间的话,会陆续把之前文章的代码都整理好了传到github上去,这样个人文章里面就...易夕:MATLAB画图技巧:让魔方转起来!zhuanlan.zhihu.com进一步地,能否拼出更复杂的...更新:
添加代码链接:nkyang/MagicCube
有时间的话,会陆续把之前文章的代码都整理好了传到github上去,这样个人文章里面就不会出现代码,文章可读性更好。
我又回来更新了,在上一次的文章中,我写了一个可以用来玩魔方的程序,当时在文章的结尾处,我展示了一个用七阶魔方拼出心形图案的例子。
易夕:MATLAB画图技巧:让魔方转起来!zhuanlan.zhihu.com进一步地,能否拼出更复杂的图案?给定一张图片作为参考,能否使用高阶魔方拼出清晰的画面?这就是本文要解决的问题。
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图像预处理(读取图像,灰度化,二值化,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阶魔方!
按照给出的图片信息,实现魔方的旋转。
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个小时。)
这张图片,花了10个多小时 从不同的角度来看最后的结果。有重影,具体不是很清楚怎么造成的。
哪位大佬知道重影是怎么回事 最后,附送一张32阶魔方拼出的渣打银行logo图。
搞定了! 专栏目录
易夕:MATLAB Tricks 专栏目录zhuanlan.zhihu.com -
matlab画魔方
2019-06-30 22:53:21matlab画魔方 -
matlab 验证魔方矩阵
2019-12-06 21:16:09function 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:17magic函数是用于创建魔方阵。魔方阵的特点是:每行每列以及对角线的元素之和相等的方阵。 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三维魔方(GUI设计界面)
2021-01-06 17:01:59里面是使用matlab实现的三维魔方,有按钮可以对魔方进行旋转,魔方的六个面颜色都不同,类似现实中玩的三阶魔方,源代码可以直接运行(.m文件)。 -
魔方还原过程MATLAB仿真/魔方二维平面展开
2021-01-30 13:20:141.魔方基础知识 1.1魔方各面表示 根据魔方各面所处位置将三阶魔方六个面分别用六个大写英文字母进行表示,相应面上的颜色也分别用这六个大写英文字母进行表示。 魔方六个面对应的大写英文字母及颜色 顶... -
Matlab与线性代数 -- 魔方矩阵
2016-11-10 11:34:42本图文主要介绍了如何利用Matlab实现魔方矩阵。 -
MATLAB工具箱大全- 魔方模拟器与规划求解
2021-02-09 13:48:33MATLAB工具箱大全- 魔方模拟器与规划求解 -
【手把手制作三阶魔方模拟器】用MATLAB让你的魔方动起来
2021-02-06 17:37:42有一个酷爱魔方的朋友,托我给他定制一个专门用于“训练魔方观察和预判能力”的程序。听完需求之后觉得很有趣,就答应了,并决定把整个制作过程公开。上次已经画好三阶魔方,是时候让它动起来了。话不多说,直接上... -
Matlab环境下画3D魔方并且实现旋转
2015-02-05 14:00:34Matlab环境下画3D魔方并且实现旋转 -
【手把手制作三阶魔方模拟器】用MATLAB绘制一个三阶魔方
2021-02-05 09:05:45【手把手制作三阶魔方模拟器】用MATLAB绘制一个一阶魔方绘制三阶魔方每个块的中心为每个块六面上色# 其他 by 今天不飞了 有一个酷爱魔方的朋友,托我给他定制一个专门用于“训练魔方观察和预判能力”的程序。听完... -
matlab基础学习打卡 魔方矩阵(3)
2019-10-22 23:29:14matlab中魔法矩阵的程序是隐藏的,用type命令显示magic.m。魔方矩阵的设计思路之一,是构造一个扩展的零矩阵A ,随后用顺序数矩阵v填入A的相应对角线,再用行、列叠加使矩阵A的中心n阶矩阵零元素填满。最后取出中心n... -
matlab心形代码_MATLAB画图技巧:让魔方转起来!
2020-11-20 18:45:30如果只是画一个静态的魔方,必然是很简单的,6个不同颜色的面,中间加上若干条线就OK了。但我想实现的是一个真正的能够转的魔方,就要从最基础的小立方体开始搭起来了。1.搭建一个基本立方体主要思路是,用fill3函数... -
LOGISTIC魔方图像加密
2016-11-21 16:26:50logistic 图像加密 解密 matlab 魔方变换 -
【手把手制作三阶魔方模拟器】用MATLAB绘制一个一阶魔方
2021-02-04 17:43:35有一个酷爱魔方的朋友,托我给他定制一个专门用于“训练魔方观察和预判能力”的程序。听完需求之后觉得很有趣,就答应了,并决定把整个制作过程公开。 -
python三阶魔方_三阶魔方自动求解及动态可视化matlab代码
2021-01-29 02:54:45三阶魔方自动求解及动态可视化matlab代码思路与步骤三阶魔方有6个面,每个面有3×33\times33×3小块,用一个6×3×36\times3\times36×3×3的矩阵来保存魔方的状态;定义4+12种魔方旋转行为:整体旋转(左右上下共4种... -
Matlab编程与数据类型 -- 奇数阶魔方矩阵的编程
2017-02-07 12:17:32本微信图文详细介绍了利用Matlab实现奇数阶魔方矩阵的编程。 -
三阶魔方自动求解及动态可视化matlab代码
2021-01-23 16:44:57三阶魔方自动求解及动态可视化matlab代码欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格...