Numpy用不熟?結合Matplotlib 來畫一個魔方玩玩兒吧!

專注的阿熊發表於2021-08-30

# -*- coding: utf-8 -*-

# @Time : DATE:2021/8/29

# @Author : yan

# @Email : 1792659158@qq.com

# @File : blogDemo.py

import matplotlib.pyplot as plt

import numpy as np

def generate_rubik_cube(nx, ny, nz):

     """

     根據輸入生成指定尺寸的魔方

     :param nx:

     :param ny:

     :param nz:

     :return:

     """

     # 準備一些座標

     n_voxels = np.ones((nx + 2, ny + 2, nz + 2), dtype=bool)

     # 生成間隙

     size = np.array(n_voxels.shape) * 2

     filled_2 = np.zeros(size - 1, dtype=n_voxels.dtype)

     filled_2[::2, ::2, ::2] = n_voxels

     # 縮小間隙

     # 構建 voxels 頂點控制網格

     # x, y, z 均為 6x6x8 的矩陣,為 voxels 的網格, 3x3x4 個小方塊,共有 6x6x8 個頂點。

     # 這裡 //2 是精髓,外匯跟單gendan5.com把索引範圍從 [0 1 2 3 4 5] 轉換為 [0 0 1 1 2 2], 這樣就可以單獨設立每個方塊的頂點範圍

     x, y, z = np.indices(np.array(filled_2.shape) + 1).astype(float) // 2  # 3x6x6x8 ,其中 x,y,z 均為 6x6x8

     x[1::2, :, :] += 0.95

     y[:, 1::2, :] += 0.95

     z[:, :, 1::2] += 0.95

     # 修改最外面的面

     x[0, :, :] += 0.94

     y[:, 0, :] += 0.94

     z[:, :, 0] += 0.94

     x[-1, :, :] -= 0.94

     y[:, -1, :] -= 0.94

     z[:, :, -1] -= 0.94

     # 去除邊角料

     filled_2[0, 0, :] = 0

     filled_2[0, -1, :] = 0

     filled_2[-1, 0, :] = 0

     filled_2[-1, -1, :] = 0

     filled_2[:, 0, 0] = 0

     filled_2[:, 0, -1] = 0

     filled_2[:, -1, 0] = 0

     filled_2[:, -1, -1] = 0

     filled_2[0, :, 0] = 0

     filled_2[0, :, -1] = 0

     filled_2[-1, :, 0] = 0

     filled_2[-1, :, -1] = 0

     # 給魔方六個面賦予不同的顏色

     colors = np.array(['#ffd400', "#fffffb", "#f47920", "#d71345", "#145b7d", "#45b97c"])

     facecolors = np.full(filled_2.shape, '#77787b')  # 設一個灰色的基調

     # facecolors = np.zeros(filled_2.shape, dtype='U7')

     facecolors[:, :, -1] = colors[0] # 上黃

     facecolors[:, :, 0] = colors[1]      # 下白

     facecolors[:, 0, :] = colors[2]   # 左橙

     facecolors[:, -1, :] = colors[3] # 右紅

     facecolors[0, :, :] = colors[4]      # 前藍

     facecolors[-1, :, :] = colors[5] # 後綠

     ax = plt.figure().add_subplot(projection='3d')

     ax.voxels(x, y, z, filled_2, facecolors=facecolors)

     plt.show()

if __name__ == '__main__':

     generate_rubik_cube(3, 3, 3)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2789523/,如需轉載,請註明出處,否則將追究法律責任。

相關文章