css3魔方3乘3每层旋转_MATLAB画图技巧:让魔方转起来!
生活随笔
收集整理的這篇文章主要介紹了
css3魔方3乘3每层旋转_MATLAB画图技巧:让魔方转起来!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要用來炫技......涉及圖形對象的平移與旋轉。
如果只是畫一個靜態的魔方,必然是很簡單的,6個不同顏色的面,中間加上若干條線就OK了。但我想實現的是一個真正的能夠轉的魔方,就要從最基礎的小立方體開始搭起來了。
1.搭建一個基本立方體
主要思路是,用fill3函數畫一個面,然后用transform對象將其變換到相應的位置。6個不同顏色的面,就構成了一個小立方體。
%% 在指定的父級對象(Parent)下創建一個立方體 % 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大致介紹下涉及的函數。
- colormap: 從預定義的顏色空間選擇若干個顏色。
- gobjects: 創建一個圖形對象數組,用于預定義。
- hgtransform:新建Transform對象。
- makehgtform:設置Transform對象的變換矩陣。
2.利用基本立方體構建一個N階魔方
這個相對簡單些,for循環調用上面的小立方體生成函數,用Transform對象將其平移到相應的位置就可以了。注意讓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調用一下,看看3階魔方的效果。
N = 3; figure() ax = gca; ax.Box = 'off'; axis(ax,'equal','off'); ax.Projection = 'perspective'; t = magicCube(N);注意: 當魔方的階數較大(N>9)時,生成魔方的函數magicCube會明顯變慢,解決方法是內部的立方體可以不用畫,只需要外部的就可以了。具體的代碼就不寫了。
本文的題圖為一個21階魔方,(目前量產的最高階魔方為17階,所以,你可以用MATLAB玩到更高階的魔方)
3.讓魔方轉起來!
X軸方向旋轉:
%% X軸方向第idx層逆時針旋轉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軸方向旋轉:
%% Y軸方向第idx層逆時針旋轉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軸方向旋轉:
%% Z軸方向第idx層逆時針旋轉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現在,可以開始玩魔方了!!!
當然,由于沒有做圖形界面,只能以寫代碼的形式來玩。函數都在上面寫好了,具體怎么調用的我就不寫了。
下面是我用上述程序做的一些魔方圖案。
動圖,9階魔方的打亂與還原經典的七階6面心形圖案。最后是專欄目錄:
易夕:MATLAB Tricks 專欄目錄?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的css3魔方3乘3每层旋转_MATLAB画图技巧:让魔方转起来!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cmd imp导入dmp文件_PLSQL
- 下一篇: 网页版登录入口_企业微信网页版怎么登录?