三维坐标系中的三阶魔方旋转

python的第三方图库Matplotlib用于显示三维坐标系中的三维图形基本上就够用了,还可以拖拽旋转坐标系,从不同的视角看图形,这个功能那可就相当的赞了。
三阶魔方大家都很熟悉,在三维坐标系中画出它的图形非常简单,就不赘述了。效果如下:
在这里插入图片描述
我们现在关注是旋转的算法,一般情况下,魔方的旋转操作是只旋转六个面的表面一层,顺时针或逆时针转90度。
如果只是画出转完后的状态,那非常简单,但是没有旋转的过渡效果,视觉体验是比较差的,为此,我们可以加入一些旋转中间状态的图形,比如15度,30度,45度,60度,75度,这样旋转的过程就更富有动画感,平滑过渡,而不是像变魔术一样,闪变成目标状态。
关于平面坐标系中的旋转,我们首先要知晓下面这个公式:
点(x,y)逆时针旋转θ后的点(x1,y1)的坐标满足:
x1=xcosθ-ysinθ
y1=xsinθ+ycosθ
魔方虽然在三维空间旋转,但是其实每次旋转都是保持三维坐标中的某个坐标不变,旋转另外两个坐标,所以可以简单应用上面这个平面旋转的公式。
在这里插入图片描述
我们定义魔方每个小方块,共有27个小方块,每个小方块8个顶点,6个面,可以定义魔方内部面的颜色是灰色;每次旋转是重新画出固定不转的两层18个小方块,再显示旋转的一层9个小方块,旋转的9个小方块位置是不断变化的。为表示方便,我们只从3个正视角看魔方:前,右,上,这样看的好处是右和上两个坐标轴都是正向的。这样的话,左,下,后的顺转就相当于正视角的逆转。
我们可以定义从某层正向看小方块数组序0-8对应小方块中心坐标为(-1,-1),(0,-1),(1,-1),(-1,0),(0,0),(1,0),(-1,1),(0,1),(1,1)。那么它们的内层这两个坐标跟外层是一样的,不同的是表示层的另一个坐标。
像图中的小方块,我们打算对其绕y轴逆时针旋转θ,它的旋转不变的两个面的y坐标分别是y1和y2,它原先的心坐标是(cx,cz),那么旋转θ后,它的顶点坐标分别是

#ABCD的X坐标
    x=[(cx-0.5)*np.cos(ceta)-(cz-0.5)*np.sin(ceta),(cx+0.5)*np.cos(ceta)-(cz-0.5)*np.sin(ceta),(cx+0.5)*np.cos(ceta)-(cz+0.5)*np.sin(ceta),(cx-0.5)*np.cos(ceta)-(cz+0.5)*np.sin(ceta)]
#ABCD的Z坐标
    z=[(cx-0.5)*np.sin(ceta)+(cz-0.5)*np.cos(ceta),(cx+0.5)*np.sin(ceta)+(cz-0.5)*np.cos(ceta),(cx+0.5)*np.sin(ceta)+(cz+0.5)*np.cos(ceta),(cx-0.5)*np.sin(ceta)+(cz+0.5)*np.cos(ceta)]

这样附带上y坐标,就可以对正方形ABCD和A1B1C1D1填色,同样也可以对ABB1A1,BCC1B1,CDD1C1,DAA1D1,这4个正方形填色。
当θ从0取到π/2,也就完成了一次90度的旋转。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值