本文主要用来炫技......涉及图形对象的平移与旋转。

如果只是画一个静态的魔方,必然是很简单的,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,:,:)));
end

Y轴方向旋转:

%% 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);
end

Z轴方向旋转:

%% 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画图技巧:让魔方转起来!相关推荐

  1. css3魔方3乘3每层旋转_学习做旋转魔方 (css3)

    学习做旋转魔方 (css3) 看到一个帖子做了一个旋转魔方, 想着试着学习练练手. 看着高手的代码按照自己的思路, 码了一下, 记下遇到的一些问题. html 代码片段 3D 魔方 Rubik's C ...

  2. css3魔方3乘3每层旋转_在玩魔方中学数学,原来魔方与矩阵还有这样的关系

    ▼承包你所有的壁纸▼ 每天推送一张魔方壁纸 请看倒数第二篇 矩阵与魔方 --魔方中的数学 孟昭旭 笔名:十日 M 上海交通大学 笔者作为魔方速拧运动的爱好者,此前就了解到魔方与线性代数有着某些关系,由 ...

  3. css3魔方3乘3每层旋转_如何使用css3设计出一个立体旋转魔方?

    需要先了解的知识: ①了解CSS的2d下的transform变化下的平移(translate)和旋转(rotate). ②了解CSS的3d下的transform变化下的平移和旋转. ③使用transf ...

  4. css3魔方3乘3每层旋转_CSS3旋转魔方

    /*全局样式*/ * { margin: 0; padding: 0; } h1 { text-align: center; margin-top: 50px; } /*外层容器样式*/ .outer ...

  5. css3魔方3乘3每层旋转_CSS3 旋转魔方效果

    [HTML] 纯文本查看 复制代码运行代码 蚂蚁部落 * { margin: 0; padding: 0; } html { height: 100%; } .stage { width: 21em; ...

  6. html5鼠标滑过图片 图片弹出层,纯CSS3鼠标滑过图片遮罩层动画特效

    简要教程 这是一款使用纯CSS3制作的鼠标滑过图片遮罩层动画特效.该特效中,当鼠标滑过或悬停在图片上面时,会在图片上出现遮罩层动画,展示出图片的描述信息和链接图标按钮. 使用方法 在页面中引入boot ...

  7. 旋转360 css 动画效果,使用CSS3动画属性实现360°无限循环旋转【代码片段】

    使用CSS3的animation动画属性实现360°无限循环旋转. 代码片段:   //图片路径自定义 CSS样式书写如下: #change{ position:absolute; right:200 ...

  8. jQuery+css3实现极具创意的罗盘旋转时钟效果源码

    效果 HTML代码 <!DOCTYPE html> <html><head><meta charset="UTF-8"><ti ...

  9. 用计算机编程解魔方,4 分钟!OpenAI 的机器手学会单手解魔方了,完全自学无需编程...

    OpenAI 的机器手学会单手解魔方了,而且还原一个三阶魔方全程只花了 4 分钟,其灵巧程度让人自叹不如. 给你一个魔方,只允许使用一只手,还时不时有人给你捣乱,你能在 4 分钟内还原它吗?我不能,两 ...

最新文章

  1. 30分钟 Keras 创建一个图像分类器
  2. 独家 | 教你使用torchlayers 来构建PyTorch 模型(附链接)
  3. 一道题,最小操作次数使数组元素相等引发的思考
  4. CVPR 2019笔迹识别论文:逆鉴别网络+八路Attention
  5. 快速傅里叶变换(FFT)——按频率抽取DIF的基
  6. 云服务器怎么装mysql_云服务器(windows环境)安装mysql图文教程
  7. add结果 bigdecimal_java.math.BigDecimal.add(BigDecimal augend)方法
  8. ​2022年中国医疗信息化研究报告
  9. JavaScript之常见算法排序
  10. 心理学家、实验与效应
  11. 【Spark】Spark是什么
  12. 数据挖掘技术之关联分析
  13. linux批量分区,Linux磁盘批量分区格式化和挂载脚本
  14. 加入收藏与设为首页代码(兼容各种浏览器)
  15. 5.(高级)CS效果之:边框border
  16. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则
  17. SOLIDWORKS中如何使用配置创建系列零件
  18. idea 在创建maven 时出现报错org.codehaus.plexus.component.repository.exception.ComponentLookupException:
  19. 账号泄露如何检测查询
  20. 多迪php,多迪PHP项目经理深度解析:PHP应用性能优化指南!

热门文章

  1. 基于VTK的Qt应用程序开发
  2. 我与计算机编程的不解之缘(2015.9~2022.1)
  3. 科大星云诗社动态20211108
  4. [Medical Image Processing] 1. Introduction
  5. ASP.NET 页面事件执行顺序 收藏
  6. wireshark一招掌握如何过滤想要的数据再也不用查找天书般的说明文档
  7. Nginx: 413 Request Entity Too Large Error and Solu
  8. phonegap在android中如何退出程序
  9. Unity3D:创建对象
  10. python 中的 for-else 和 while-else 语句