css3魔方3乘3每层旋转_MATLAB画图技巧:让魔方转起来!
本文主要用來炫技......涉及圖形對象的平移與旋轉(zhuǎn)。
如果只是畫一個靜態(tài)的魔方,必然是很簡單的,6個不同顏色的面,中間加上若干條線就OK了。但我想實現(xiàn)的是一個真正的能夠轉(zhuǎn)的魔方,就要從最基礎(chǔ)的小立方體開始搭起來了。
1.搭建一個基本立方體
主要思路是,用fill3函數(shù)畫一個面,然后用transform對象將其變換到相應(yīng)的位置。6個不同顏色的面,就構(gòu)成了一個小立方體。
%% 在指定的父級對象(Parent)下創(chuàng)建一個立方體 % Parent可以是Axes、Group或Transform對象 function Parent = makeCube(Parent) x = [0 0 1 1]; y = [0 1 1 0]; z = [0 0 0 0]; c = colormap(jet(6)); h = gobjects(1,6); t = gobjects(1,6); for ii = 1:6t(ii) = hgtransform('Parent',Parent);h(ii) = fill3(x,y,z,c(ii,:),'Parent',t(ii),'LineWidth',2); end t(2).Matrix = makehgtform('xrotate',pi/2); t(3).Matrix = makehgtform('yrotate',-pi/2); t(4).Matrix = makehgtform('translate',[0,1,0],'xrotate',-pi/2,'translate',[0,-1,0]); t(5).Matrix = makehgtform('translate',[1,0,0],'yrotate',pi/2,'translate',[-1,0,0]); t(6).Matrix = makehgtform('translate',[0,0,1]); end大致介紹下涉及的函數(shù)。
- colormap: 從預(yù)定義的顏色空間選擇若干個顏色。
- gobjects: 創(chuàng)建一個圖形對象數(shù)組,用于預(yù)定義。
- hgtransform:新建Transform對象。
- makehgtform:設(shè)置Transform對象的變換矩陣。
2.利用基本立方體構(gòu)建一個N階魔方
這個相對簡單些,for循環(huán)調(diào)用上面的小立方體生成函數(shù),用Transform對象將其平移到相應(yīng)的位置就可以了。注意讓x,y,z軸位于面的中心位置。
function t = magicCube(N) h = gobjects(N,N,N); t = gobjects(N,N,N); for x = 1:Nfor y = 1:Nfor z = 1:Nt(x,y,z) = hgtransform('Parent',gca);h(x,y,z) = makeCube(t(x,y,z));t(x,y,z).Matrix = makehgtform('translate',[x-1-N/2,y-1-N/2,z-1-N/2]);endend end end調(diào)用一下,看看3階魔方的效果。
N = 3; figure() ax = gca; ax.Box = 'off'; axis(ax,'equal','off'); ax.Projection = 'perspective'; t = magicCube(N);注意: 當(dāng)魔方的階數(shù)較大(N>9)時,生成魔方的函數(shù)magicCube會明顯變慢,解決方法是內(nèi)部的立方體可以不用畫,只需要外部的就可以了。具體的代碼就不寫了。
本文的題圖為一個21階魔方,(目前量產(chǎn)的最高階魔方為17階,所以,你可以用MATLAB玩到更高階的魔方)
3.讓魔方轉(zhuǎn)起來!
X軸方向旋轉(zhuǎn):
%% X軸方向第idx層逆時針旋轉(zhuǎn)90度. function t = rotateX(t,idx) N = length(t); Rx = makehgtform('xrotate',pi/2);%,'translate',[0,0,-1]); for y = 1:Nfor z = 1:Nt(idx,y,z).Matrix = Rx*t(idx,y,z).Matrix;end end t(idx,:,:) = rot90(squeeze(t(idx,:,:))); endY軸方向旋轉(zhuǎn):
%% Y軸方向第idx層逆時針旋轉(zhuǎn)90度. function t = rotateY(t,idx) N = length(t); Ry = makehgtform('yrotate',pi/2); for x = 1:Nfor z = 1:Nt(x,idx,z).Matrix = Ry*t(x,idx,z).Matrix;end end t(:,idx,:) = rot90(squeeze(t(:,idx,:)),3); endZ軸方向旋轉(zhuǎn):
%% Z軸方向第idx層逆時針旋轉(zhuǎn)90度 function t = rotateZ(t,idx) N = length(t); Rz = makehgtform('zrotate',pi/2); for x = 1:Nfor y = 1:Nt(x,y,idx).Matrix = Rz*t(x,y,idx).Matrix;end7 end t(:,:,idx) = rot90(squeeze(t(:,:,idx))); end現(xiàn)在,可以開始玩魔方了!!!
當(dāng)然,由于沒有做圖形界面,只能以寫代碼的形式來玩。函數(shù)都在上面寫好了,具體怎么調(diào)用的我就不寫了。
下面是我用上述程序做的一些魔方圖案。
動圖,9階魔方的打亂與還原經(jīng)典的七階6面心形圖案。最后是專欄目錄:
易夕:MATLAB Tricks 專欄目錄?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的css3魔方3乘3每层旋转_MATLAB画图技巧:让魔方转起来!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cmd imp导入dmp文件_PLSQL
- 下一篇: 网页版登录入口_企业微信网页版怎么登录?