Python 旋轉立方體的實現(xiàn)示例
效果圖

運行環(huán)境
python版本:python3.x
依賴包:
$ pip install pygame $ pip install numpy
完整代碼
import numpy as np # 導入 NumPy 庫,用于數(shù)值計算和處理多維數(shù)組
import pygame # 導入 Pygame 庫,用于游戲開發(fā)和圖形界面設計
# 定義屏幕的寬度和高度
WIDTH = 800
HEIGHT = 800
# 定義顏色常量
BLACK = (0, 0, 0) # 黑色
WHITE = (255, 255, 255) # 白色
class Cube:
"""
表示一個立方體。
"""
def __init__(self, pos: np.ndarray, a: float) -> None:
"""
初始化立方體。
:param pos: 立方體的中心位置,是一個包含三個元素的 NumPy 數(shù)組。
:param a: 立方體的邊長。
"""
self.pos = pos # 立方體的中心位置
self.angle = np.pi / 4 # 立方體的旋轉角度,初始化為 45 度
self.center_offset = np.array([-a / 2, -a / 2, -a / 2]) # 立方體頂點到中心的偏移量
self.edges = np.array([ # 立方體的邊,是一個包含 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 屏幕對象。
:param rotation_rate: 立方體的旋轉速率,用于控制立方體旋轉的速度。
"""
# 將立方體的邊加上中心偏移量,得到實際的頂點位置
rotated_cube = np.add(self.edges, self.center_offset)
# 計算繞 X、Y、Z 軸旋轉的矩陣
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],
])
# 對立方體進行旋轉
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)
# 將旋轉后的立方體移動到正確的位置
moved_cube = np.add(self.pos, rotated_cube)
# 在屏幕上繪制立方體的邊
for edge in moved_cube:
# 獲取邊的兩個端點的屏幕坐標
start_pos = edge[0][0:2]
end_pos = edge[1][0:2]
# 繪制邊
pygame.draw.line(screen, WHITE, start_pos, end_pos)
# 更新立方體的旋轉角度
self.angle += rotation_rate
def main():
"""
主函數(shù),啟動 Pygame 并創(chuàng)建旋轉的立方體。
"""
# 初始化 Pygame
pygame.init()
# 創(chuàng)建屏幕對象
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 設置窗口標題
pygame.display.set_caption("旋轉立方體 By stormsha")
# 創(chuàng)建立方體對象,中心位于 (400, 400, 200),邊長為 200
cube = Cube(np.array([400, 400, 200]), 200)
# 主循環(huán)
running = True
while running:
# 處理 Pygame 事件,如關閉窗口等
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__":
# 如果腳本被直接運行,則執(zhí)行主函數(shù)
main()
實現(xiàn)思路
使用Pygame和NumPy創(chuàng)建旋轉立方體
在這篇文章中,我們將詳細介紹如何使用Python的Pygame庫和NumPy庫創(chuàng)建一個旋轉的立方體。我們將逐步講解代碼的實現(xiàn)思路,并解釋關鍵部分的作用。
1. 導入庫和定義常量
首先,我們需要導入所需的庫,包括NumPy和Pygame。NumPy庫用于數(shù)值計算和處理多維數(shù)組,而Pygame庫用于游戲開發(fā)和圖形界面設計。
import numpy as np # 導入 NumPy 庫,用于數(shù)值計算和處理多維數(shù)組 import pygame # 導入 Pygame 庫,用于游戲開發(fā)和圖形界面設計 # 定義屏幕的寬度和高度 WIDTH = 800 HEIGHT = 800 # 定義顏色常量 BLACK = (0, 0, 0) # 黑色 WHITE = (255, 255, 255) # 白色
2. 創(chuàng)建Cube類
接下來,我們創(chuàng)建一個名為Cube的類,用于表示立方體。在Cube類的構造函數(shù)中,我們初始化立方體的中心位置、旋轉角度和邊長。
class Cube:
"""
表示一個立方體。
"""
def __init__(self, pos: np.ndarray, a: float) -> None:
"""
初始化立方體。
:param pos: 立方體的中心位置,是一個包含三個元素的 NumPy 數(shù)組。
:param a: 立方體的邊長。
"""
self.pos = pos # 立方體的中心位置
self.angle = np.pi / 4 # 立方體的旋轉角度,初始化為 45 度
self.center_offset = np.array([-a / 2, -a / 2, -a / 2]) # 立方體頂點到中心的偏移量
self.edges = np.array([ # 立方體的邊,是一個包含 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條邊,包括前臉、右臉和上臉的邊。每條邊由兩個頂點組成,使用NumPy的數(shù)組表示。
3. 實現(xiàn)Cube類的draw方法
接下來,我們實現(xiàn)Cube類的draw方法,用于在屏幕上繪制立方體。在draw方法中,我們首先將立方體的邊加上中心偏移量,得到實際的頂點位置。然后,我們計算繞X、Y、Z軸旋轉的矩陣,并對立方體進行旋轉。最后,我們將旋轉后的立方體移動到正確的位置,并在屏幕上繪制立方體的邊。
def draw(self, screen: pygame.surface.Surface, rotation_rate: float) -> None:
"""
在屏幕上繪制立方體。
:param screen: 要繪制立方體的 Pygame 屏幕對象。
:param rotation_rate: 立方體的旋轉速率,用于控制立方體旋轉的速度。
"""
# 將立方體的邊加上中心偏移量,得到實際的頂點位置
rotated_cube = np.add(self.edges, self.center_offset)
# 計算繞 X、Y、Z 軸旋轉的矩陣
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],
])
# 對立方體進行旋轉
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)
# 將旋轉后的立方體移動到正確的位置
moved_cube = np.add(self.pos, rotated_cube)
# 在屏幕上繪制立方體的邊
for edge in moved_cube:
# 獲取邊的兩個端點的屏幕坐標
start_pos = edge[0][0:2]
end_pos = edge[1][0:2]
# 繪制邊
pygame.draw.line(screen, WHITE, start_pos, end_pos)
# 更新立方體的旋轉角度
self.angle += rotation_rate
在上面的代碼中,我們使用NumPy的matmul函數(shù)進行矩陣乘法,以實現(xiàn)立方體的旋轉。然后,我們使用pygame的draw.line函數(shù)在屏幕上繪制立方體的邊。
4. 實現(xiàn)主函數(shù)
最后,我們實現(xiàn)主函數(shù)main,用于啟動Pygame并創(chuàng)建旋轉的立方體。在主函數(shù)中,我們首先初始化Pygame,并創(chuàng)建屏幕對象。然后,我們創(chuàng)建一個Cube對象,并進入主循環(huán)。在主循環(huán)中,我們處理Pygame事件,清空屏幕,繪制立方體,并更新屏幕。
def main():
"""
主函數(shù),啟動 Pygame 并創(chuàng)建旋轉的立方體。
"""
# 初始化 Pygame
pygame.init()
# 創(chuàng)建屏幕對象
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 設置窗口標題
pygame.display.set_caption("旋轉立方體 By stormsha")
# 創(chuàng)建立方體對象,中心位于 (400, 400, 200),邊長為 200
cube = Cube(np.array([400, 400, 200]), 200)
# 主循環(huán)
running = True
while running:
# 處理 Pygame 事件,如關閉窗口等
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__":
# 如果腳本被直接運行,則執(zhí)行主函數(shù)
main()
在上面的代碼中,我們使用pygame的event.get函數(shù)獲取事件,并判斷是否為關閉窗口事件。如果是關閉窗口事件,則退出主循環(huán)。然后,我們使用screen.fill函數(shù)清空屏幕,并使用cube.draw函數(shù)繪制立方體。最后,我們使用pygame的display.flip函數(shù)更新屏幕。
到此這篇關于Python 旋轉立方體的實現(xiàn)示例的文章就介紹到這了,更多相關Python 旋轉立方體內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
pytorch 利用lstm做mnist手寫數(shù)字識別分類的實例
今天小編就為大家分享一篇pytorch 利用lstm做mnist手寫數(shù)字識別分類的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

