最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 旋轉(zhuǎn)立方體的實現(xiàn)示例

 更新時間:2024年05月13日 09:04:18   作者:????????stormsha  
本文主要介紹了Python 旋轉(zhuǎn)立方體的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

效果圖

請?zhí)砑訄D片描述

運行環(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  # 立方體的旋轉(zhuǎn)角度,初始化為 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: 立方體的旋轉(zhuǎn)速率,用于控制立方體旋轉(zhuǎn)的速度。
        """
        # 將立方體的邊加上中心偏移量,得到實際的頂點位置
        rotated_cube = np.add(self.edges, self.center_offset)

        # 計算繞 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],
        ])

        # 對立方體進行旋轉(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)后的立方體移動到正確的位置
        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)

        # 更新立方體的旋轉(zhuǎn)角度
        self.angle += rotation_rate


def main():
    """
    主函數(shù),啟動 Pygame 并創(chuàng)建旋轉(zhuǎn)的立方體。
    """
    # 初始化 Pygame
    pygame.init()
    # 創(chuàng)建屏幕對象
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    # 設置窗口標題
    pygame.display.set_caption("旋轉(zhuǎn)立方體 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)建旋轉(zhuǎn)立方體

在這篇文章中,我們將詳細介紹如何使用Python的Pygame庫和NumPy庫創(chuàng)建一個旋轉(zhuǎn)的立方體。我們將逐步講解代碼的實現(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ù)中,我們初始化立方體的中心位置、旋轉(zhuǎn)角度和邊長。

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  # 立方體的旋轉(zhuǎn)角度,初始化為 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軸旋轉(zhuǎn)的矩陣,并對立方體進行旋轉(zhuǎn)。最后,我們將旋轉(zhuǎn)后的立方體移動到正確的位置,并在屏幕上繪制立方體的邊。

def draw(self, screen: pygame.surface.Surface, rotation_rate: float) -> None:
        """
        在屏幕上繪制立方體。
        :param screen: 要繪制立方體的 Pygame 屏幕對象。
        :param rotation_rate: 立方體的旋轉(zhuǎn)速率,用于控制立方體旋轉(zhuǎn)的速度。
        """
        # 將立方體的邊加上中心偏移量,得到實際的頂點位置
        rotated_cube = np.add(self.edges, self.center_offset)

        # 計算繞 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],
        ])

        # 對立方體進行旋轉(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)后的立方體移動到正確的位置
        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)

        # 更新立方體的旋轉(zhuǎn)角度
        self.angle += rotation_rate

在上面的代碼中,我們使用NumPy的matmul函數(shù)進行矩陣乘法,以實現(xiàn)立方體的旋轉(zhuǎn)。然后,我們使用pygame的draw.line函數(shù)在屏幕上繪制立方體的邊。

4. 實現(xiàn)主函數(shù)

最后,我們實現(xiàn)主函數(shù)main,用于啟動Pygame并創(chuàng)建旋轉(zhuǎn)的立方體。在主函數(shù)中,我們首先初始化Pygame,并創(chuàng)建屏幕對象。然后,我們創(chuàng)建一個Cube對象,并進入主循環(huán)。在主循環(huán)中,我們處理Pygame事件,清空屏幕,繪制立方體,并更新屏幕。

def main():
    """
    主函數(shù),啟動 Pygame 并創(chuàng)建旋轉(zhuǎn)的立方體。
    """
    # 初始化 Pygame
    pygame.init()
    # 創(chuàng)建屏幕對象
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    # 設置窗口標題
    pygame.display.set_caption("旋轉(zhuǎn)立方體 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 旋轉(zhuǎn)立方體的實現(xiàn)示例的文章就介紹到這了,更多相關Python 旋轉(zhuǎn)立方體內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python與js進行MD5取hash有什么不同

    python與js進行MD5取hash有什么不同

    這篇文章主要講解得內(nèi)容是python與js進行MD5取hash有什么不同,我們在做前端做滲透測試時會遇到一些關鍵字進行了加密得情況,而且python和js對json進行md5取hash,MD5結果值還不一致,下面我們就爛看看到底是哪里不同吧,需要的朋友可以參考一下
    2022-02-02
  • python時間整形轉(zhuǎn)標準格式的示例分享

    python時間整形轉(zhuǎn)標準格式的示例分享

    這篇文章主要介紹了python時間整形轉(zhuǎn)標準格式的示例,需要的朋友可以參考下
    2014-02-02
  • python關鍵字and和or用法實例

    python關鍵字and和or用法實例

    這篇文章主要介紹了python關鍵字and和or用法實例,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-05-05
  • OpenCV進階之鼠標事件的回調(diào)函數(shù)使用方法詳解

    OpenCV進階之鼠標事件的回調(diào)函數(shù)使用方法詳解

    鼠標事件的回調(diào)函數(shù)使用方法是計算機視覺領域的核心知識點之一,掌握這項技能對于提升視覺算法開發(fā)效率和應用效果至關重要,本文深入講解了OpenCV中鼠標事件回調(diào)函數(shù)的使用方法,感興趣的小伙伴可以了解下
    2026-05-05
  • Python與MongoDB交互的代碼實現(xiàn)

    Python與MongoDB交互的代碼實現(xiàn)

    Python與MongoDB的交互通常通過pymongo庫來實現(xiàn),pymongo是一個官方的Python驅(qū)動程序,用于與MongoDB數(shù)據(jù)庫進行交互,以下是一個簡單的示例,具有一定的參考價值,需要的朋友可以參考下
    2024-10-10
  • Python合并同一個文件夾下所有PDF文件的方法

    Python合并同一個文件夾下所有PDF文件的方法

    今天小編就為大家分享一篇關于Python合并同一個文件夾下所有PDF文件的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 使用Python+OpenCV進行卡類型及16位卡號數(shù)字的OCR功能

    使用Python+OpenCV進行卡類型及16位卡號數(shù)字的OCR功能

    本文將使用Python+OpenCV實現(xiàn)模板匹配算法,以自動識別卡的類型和以及16位卡號數(shù)字,通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-08-08
  • Python MySQLdb 使用utf-8 編碼插入中文數(shù)據(jù)問題

    Python MySQLdb 使用utf-8 編碼插入中文數(shù)據(jù)問題

    這篇文章主要介紹了Python MySQLdb 使用utf-8 編碼插入中文數(shù)據(jù)問題,需要的朋友可以參考下
    2018-03-03
  • django Admin文檔生成器使用詳解

    django Admin文檔生成器使用詳解

    這篇文章主要介紹了django Admin文檔生成器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 利用Python自制一個批量圖片水印添加器

    利用Python自制一個批量圖片水印添加器

    這篇文章主要為大家詳細介紹了如何利用Python語言自制一個批量圖片水印添加器,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以了解一下
    2022-10-10

最新評論

隆安县| 仁布县| 金华市| 井研县| 礼泉县| 齐河县| 长春市| 闻喜县| 远安县| 历史| 砀山县| 沂源县| 英超| 定日县| 肇源县| 永平县| 新郑市| 陆河县| 宁阳县| 龙岩市| 泰顺县| 布拖县| 天水市| 延安市| 湛江市| 民和| 万源市| 福建省| 河北省| 普定县| 榕江县| 林州市| 德庆县| 遂溪县| 桓台县| 浮山县| 浪卡子县| 德格县| 康平县| 安图县| 姚安县|