Python 旋轉(zhuǎn)立方體的實(shí)現(xiàn)示例
效果圖
運(yùn)行環(huán)境
python版本:python3.x
依賴包:
$ pip install pygame $ pip install numpy
完整代碼
import numpy as np # 導(dǎo)入 NumPy 庫,用于數(shù)值計(jì)算和處理多維數(shù)組 import pygame # 導(dǎo)入 Pygame 庫,用于游戲開發(fā)和圖形界面設(shè)計(jì) # 定義屏幕的寬度和高度 WIDTH = 800 HEIGHT = 800 # 定義顏色常量 BLACK = (0, 0, 0) # 黑色 WHITE = (255, 255, 255) # 白色 class Cube: """ 表示一個(gè)立方體。 """ def __init__(self, pos: np.ndarray, a: float) -> None: """ 初始化立方體。 :param pos: 立方體的中心位置,是一個(gè)包含三個(gè)元素的 NumPy 數(shù)組。 :param a: 立方體的邊長。 """ self.pos = pos # 立方體的中心位置 self.angle = np.pi / 4 # 立方體的旋轉(zhuǎn)角度,初始化為 45 度 self.center_offset = np.array([-a / 2, -a / 2, -a / 2]) # 立方體頂點(diǎn)到中心的偏移量 self.edges = np.array([ # 立方體的邊,是一個(gè)包含 12 條邊的數(shù)組 # 前臉的四條邊 np.array([np.array([0, 0, 0]), np.array([a, 0, 0])]), np.array([np.array([a, 0, 0]), np.array([a, a, 0])]), np.array([np.array([a, a, 0]), np.array([0, a, 0])]), np.array([np.array([0, a, 0]), np.array([0, 0, 0])]), # 右臉的四條邊 np.array([np.array([0, 0, 0]), np.array([0, 0, a])]), np.array([np.array([a, a, 0]), np.array([a, a, a])]), np.array([np.array([a, 0, 0]), np.array([a, 0, a])]), np.array([np.array([0, a, 0]), np.array([0, a, a])]), # 上臉的四條邊 np.array([np.array([0, 0, a]), np.array([a, 0, a])]), np.array([np.array([a, 0, a]), np.array([a, a, a])]), np.array([np.array([a, a, a]), np.array([0, a, a])]), np.array([np.array([0, a, a]), np.array([0, 0, a])]), ]) def draw(self, screen: pygame.surface.Surface, rotation_rate: float) -> None: """ 在屏幕上繪制立方體。 :param screen: 要繪制立方體的 Pygame 屏幕對(duì)象。 :param rotation_rate: 立方體的旋轉(zhuǎn)速率,用于控制立方體旋轉(zhuǎn)的速度。 """ # 將立方體的邊加上中心偏移量,得到實(shí)際的頂點(diǎn)位置 rotated_cube = np.add(self.edges, self.center_offset) # 計(jì)算繞 X、Y、Z 軸旋轉(zhuǎn)的矩陣 rotation_matrix_x = np.array([ [1, 0, 0], [0, np.cos(self.angle), -np.sin(self.angle)], [0, np.sin(self.angle), np.cos(self.angle)] ]) rotation_matrix_y = np.array([ [np.cos(self.angle), 0, np.sin(self.angle)], [0, 1, 0], [-np.sin(self.angle), 0, np.cos(self.angle)] ]) rotation_matrix_z = np.array([ [np.cos(self.angle), -np.sin(self.angle), 0], [np.sin(self.angle), np.cos(self.angle), 0], [0, 0, 1], ]) # 對(duì)立方體進(jìn)行旋轉(zhuǎn) rotated_cube = np.matmul(rotated_cube, rotation_matrix_x) rotated_cube = np.matmul(rotated_cube, rotation_matrix_y) rotated_cube = np.matmul(rotated_cube, rotation_matrix_z) # 將旋轉(zhuǎn)后的立方體移動(dòng)到正確的位置 moved_cube = np.add(self.pos, rotated_cube) # 在屏幕上繪制立方體的邊 for edge in moved_cube: # 獲取邊的兩個(gè)端點(diǎn)的屏幕坐標(biāo) start_pos = edge[0][0:2] end_pos = edge[1][0:2] # 繪制邊 pygame.draw.line(screen, WHITE, start_pos, end_pos) # 更新立方體的旋轉(zhuǎn)角度 self.angle += rotation_rate def main(): """ 主函數(shù),啟動(dòng) Pygame 并創(chuàng)建旋轉(zhuǎn)的立方體。 """ # 初始化 Pygame pygame.init() # 創(chuàng)建屏幕對(duì)象 screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 設(shè)置窗口標(biāo)題 pygame.display.set_caption("旋轉(zhuǎn)立方體 By stormsha") # 創(chuàng)建立方體對(duì)象,中心位于 (400, 400, 200),邊長為 200 cube = Cube(np.array([400, 400, 200]), 200) # 主循環(huán) running = True while running: # 處理 Pygame 事件,如關(guān)閉窗口等 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 清空屏幕 screen.fill(BLACK) # 繪制立方體 cube.draw(screen, 0.001) # 更新屏幕 pygame.display.flip() if __name__ == "__main__": # 如果腳本被直接運(yùn)行,則執(zhí)行主函數(shù) main()
實(shí)現(xiàn)思路
使用Pygame和NumPy創(chuàng)建旋轉(zhuǎn)立方體
在這篇文章中,我們將詳細(xì)介紹如何使用Python的Pygame庫和NumPy庫創(chuàng)建一個(gè)旋轉(zhuǎn)的立方體。我們將逐步講解代碼的實(shí)現(xiàn)思路,并解釋關(guān)鍵部分的作用。
1. 導(dǎo)入庫和定義常量
首先,我們需要導(dǎo)入所需的庫,包括NumPy和Pygame。NumPy庫用于數(shù)值計(jì)算和處理多維數(shù)組,而Pygame庫用于游戲開發(fā)和圖形界面設(shè)計(jì)。
import numpy as np # 導(dǎo)入 NumPy 庫,用于數(shù)值計(jì)算和處理多維數(shù)組 import pygame # 導(dǎo)入 Pygame 庫,用于游戲開發(fā)和圖形界面設(shè)計(jì) # 定義屏幕的寬度和高度 WIDTH = 800 HEIGHT = 800 # 定義顏色常量 BLACK = (0, 0, 0) # 黑色 WHITE = (255, 255, 255) # 白色
2. 創(chuàng)建Cube類
接下來,我們創(chuàng)建一個(gè)名為Cube的類,用于表示立方體。在Cube類的構(gòu)造函數(shù)中,我們初始化立方體的中心位置、旋轉(zhuǎn)角度和邊長。
class Cube: """ 表示一個(gè)立方體。 """ def __init__(self, pos: np.ndarray, a: float) -> None: """ 初始化立方體。 :param pos: 立方體的中心位置,是一個(gè)包含三個(gè)元素的 NumPy 數(shù)組。 :param a: 立方體的邊長。 """ self.pos = pos # 立方體的中心位置 self.angle = np.pi / 4 # 立方體的旋轉(zhuǎn)角度,初始化為 45 度 self.center_offset = np.array([-a / 2, -a / 2, -a / 2]) # 立方體頂點(diǎn)到中心的偏移量 self.edges = np.array([ # 立方體的邊,是一個(gè)包含 12 條邊的數(shù)組 # 前臉的四條邊 np.array([np.array([0, 0, 0]), np.array([a, 0, 0])]), np.array([np.array([a, 0, 0]), np.array([a, a, 0])]), np.array([np.array([a, a, 0]), np.array([0, a, 0])]), np.array([np.array([0, a, 0]), np.array([0, 0, 0])]), # 右臉的四條邊 np.array([np.array([0, 0, 0]), np.array([0, 0, a])]), np.array([np.array([a, a, 0]), np.array([a, a, a])]), np.array([np.array([a, 0, 0]), np.array([a, 0, a])]), np.array([np.array([0, a, 0]), np.array([0, a, a])]), # 上臉的四條邊 np.array([np.array([0, 0, a]), np.array([a, 0, a])]), np.array([np.array([a, 0, a]), np.array([a, a, a])]), np.array([np.array([a, a, a]), np.array([0, a, a])]), np.array([np.array([0, a, a]), np.array([0, 0, a])]), ])
在上面的代碼中,我們定義了立方體的12條邊,包括前臉、右臉和上臉的邊。每條邊由兩個(gè)頂點(diǎn)組成,使用NumPy的數(shù)組表示。
3. 實(shí)現(xiàn)Cube類的draw方法
接下來,我們實(shí)現(xiàn)Cube類的draw方法,用于在屏幕上繪制立方體。在draw方法中,我們首先將立方體的邊加上中心偏移量,得到實(shí)際的頂點(diǎn)位置。然后,我們計(jì)算繞X、Y、Z軸旋轉(zhuǎn)的矩陣,并對(duì)立方體進(jìn)行旋轉(zhuǎn)。最后,我們將旋轉(zhuǎn)后的立方體移動(dòng)到正確的位置,并在屏幕上繪制立方體的邊。
def draw(self, screen: pygame.surface.Surface, rotation_rate: float) -> None: """ 在屏幕上繪制立方體。 :param screen: 要繪制立方體的 Pygame 屏幕對(duì)象。 :param rotation_rate: 立方體的旋轉(zhuǎn)速率,用于控制立方體旋轉(zhuǎn)的速度。 """ # 將立方體的邊加上中心偏移量,得到實(shí)際的頂點(diǎn)位置 rotated_cube = np.add(self.edges, self.center_offset) # 計(jì)算繞 X、Y、Z 軸旋轉(zhuǎn)的矩陣 rotation_matrix_x = np.array([ [1, 0, 0], [0, np.cos(self.angle), -np.sin(self.angle)], [0, np.sin(self.angle), np.cos(self.angle)] ]) rotation_matrix_y = np.array([ [np.cos(self.angle), 0, np.sin(self.angle)], [0, 1, 0], [-np.sin(self.angle), 0, np.cos(self.angle)] ]) rotation_matrix_z = np.array([ [np.cos(self.angle), -np.sin(self.angle), 0], [np.sin(self.angle), np.cos(self.angle), 0], [0, 0, 1], ]) # 對(duì)立方體進(jìn)行旋轉(zhuǎn) rotated_cube = np.matmul(rotated_cube, rotation_matrix_x) rotated_cube = np.matmul(rotated_cube, rotation_matrix_y) rotated_cube = np.matmul(rotated_cube, rotation_matrix_z) # 將旋轉(zhuǎn)后的立方體移動(dòng)到正確的位置 moved_cube = np.add(self.pos, rotated_cube) # 在屏幕上繪制立方體的邊 for edge in moved_cube: # 獲取邊的兩個(gè)端點(diǎn)的屏幕坐標(biāo) start_pos = edge[0][0:2] end_pos = edge[1][0:2] # 繪制邊 pygame.draw.line(screen, WHITE, start_pos, end_pos) # 更新立方體的旋轉(zhuǎn)角度 self.angle += rotation_rate
在上面的代碼中,我們使用NumPy的matmul函數(shù)進(jìn)行矩陣乘法,以實(shí)現(xiàn)立方體的旋轉(zhuǎn)。然后,我們使用pygame的draw.line函數(shù)在屏幕上繪制立方體的邊。
4. 實(shí)現(xiàn)主函數(shù)
最后,我們實(shí)現(xiàn)主函數(shù)main,用于啟動(dòng)Pygame并創(chuàng)建旋轉(zhuǎn)的立方體。在主函數(shù)中,我們首先初始化Pygame,并創(chuàng)建屏幕對(duì)象。然后,我們創(chuàng)建一個(gè)Cube對(duì)象,并進(jìn)入主循環(huán)。在主循環(huán)中,我們處理Pygame事件,清空屏幕,繪制立方體,并更新屏幕。
def main(): """ 主函數(shù),啟動(dòng) Pygame 并創(chuàng)建旋轉(zhuǎn)的立方體。 """ # 初始化 Pygame pygame.init() # 創(chuàng)建屏幕對(duì)象 screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 設(shè)置窗口標(biāo)題 pygame.display.set_caption("旋轉(zhuǎn)立方體 By stormsha") # 創(chuàng)建立方體對(duì)象,中心位于 (400, 400, 200),邊長為 200 cube = Cube(np.array([400, 400, 200]), 200) # 主循環(huán) running = True while running: # 處理 Pygame 事件,如關(guān)閉窗口等 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 清空屏幕 screen.fill(BLACK) # 繪制立方體 cube.draw(screen, 0.001) # 更新屏幕 pygame.display.flip() if __name__ == "__main__": # 如果腳本被直接運(yùn)行,則執(zhí)行主函數(shù) main()
在上面的代碼中,我們使用pygame的event.get函數(shù)獲取事件,并判斷是否為關(guān)閉窗口事件。如果是關(guān)閉窗口事件,則退出主循環(huán)。然后,我們使用screen.fill函數(shù)清空屏幕,并使用cube.draw函數(shù)繪制立方體。最后,我們使用pygame的display.flip函數(shù)更新屏幕。
到此這篇關(guān)于Python 旋轉(zhuǎn)立方體的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python 旋轉(zhuǎn)立方體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于python制作簡易版學(xué)生信息管理系統(tǒng)
這篇文章主要介紹了基于python制作簡易版學(xué)生信息管理系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-04-04python實(shí)時(shí)分析日志的一個(gè)小腳本分享
這篇文章主要給大家分享了一個(gè)實(shí)時(shí)分析日志的python小腳本,文中給出了詳細(xì)的介紹和示例代碼供大家參考學(xué)習(xí),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05在Python中定義函數(shù)并調(diào)用的操作步驟
這篇文章主要介紹了在Python中如何定義函數(shù)并調(diào)用它,函數(shù)的定義和調(diào)用是Python編程中最基本也是最重要的概念之一,掌握它們對(duì)于進(jìn)行有效的Python編程至關(guān)重要,需要的朋友可以參考下2024-01-01python計(jì)數(shù)排序和基數(shù)排序算法實(shí)例
這篇文章主要介紹了python計(jì)數(shù)排序和基數(shù)排序算法實(shí)例,需要的朋友可以參考下2014-04-04pytorch 利用lstm做mnist手寫數(shù)字識(shí)別分類的實(shí)例
今天小編就為大家分享一篇pytorch 利用lstm做mnist手寫數(shù)字識(shí)別分類的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01