更新:
添加代码链接: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个小时。)
从不同的角度来看最后的结果。有重影,具体不是很清楚怎么造成的。
最后,附送一张32阶魔方拼出的渣打银行logo图。
专栏目录
易夕:MATLAB Tricks 专栏目录zhuanlan.zhihu.com