The Nature of Code閱讀心得與Python實作:1.3 Vector Addition

更新 發佈閱讀 5 分鐘

假設向量w=(wx, wy),這時候wx、wy就稱為w的分量(component)。如果要更清楚地區分指的是wx還是wy,會把wx叫做x分量(x-component),而wy就叫做y分量(y-component)。在pygame中,Vector2()所建造的向量vec,其x、y分量就寫成vec.xvec.y

現在來看看向量的加法要怎麼算。假設u=(ux, uy)、v=(vx, vy),則

u + v = (ux+vx, uy+vy)

也就是說,向量的加法,就只是把分量相加而已。

向量加法跟實數加法一樣,都滿足交換律(commutative rule)和結合律(associative rule):

交換律:u + v = v + u
結合律:u + (v + w) = (u + v) + w

這個用大白話來說就是:誰排前面誰排後面,誰先加誰後加,都不影響最後的結果。

綜合上節和這節的結果,1.1節Example 1.1的程式,可以改寫成如下使用向量的版本。

Example 1.2: Bouncing Ball with Vectors!

# python version 3.10.9
import sys

import pygame # version 2.3.0


pygame.init()

pygame.display.set_caption("Example 1.2: Bouncing Ball with Vectors")

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

RADIUS = 24 # 球的半徑

screen_size = WIDTH, HEIGHT = 640, 360
screen = pygame.display.set_mode(screen_size)

FPS = 60
frame_rate = pygame.time.Clock()

position = pygame.Vector2(100, 100)
velocity = pygame.Vector2(2.5, 2)

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

screen.fill(WHITE)

# 依據球的速度計算球的位置來移動球
position += velocity

# 檢查是不是碰到左、右邊界回彈
if (position.x > WIDTH) or (position.x < 0):
velocity.x = -velocity.x

# 檢查是不是碰到上、下邊界回彈
if (position.y > HEIGHT) or (position.y < 0):
velocity.y = -velocity.y

# 在位置(x, y)顯示球
pygame.draw.circle(screen, BLACK, position, RADIUS)

pygame.display.update()
frame_rate.tick(FPS)


Exercise 1.1

把Example 0.1改成用向量來寫。Walker這個class改寫為

class Walker:
def __init__(self, x, y):
self.position = pygame.Vector2(x, y)

def show(self, screen, color=(0, 0, 0)):
pt = (int(self.position.x), int(self.position.y))
screen.set_at(pt, color)

def step(self):
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
self.position += pygame.Vector2(random.choice(directions))


Exercise 1.2

Exercise 1.3

假設球是在長、寬、高分別為LENGTHWIDTHHEIGHT的方盒內運動。由於pygame並不支援3D繪圖,所以無法顯示動畫效果。不過,利用pygame提供的3D向量功能,還是可以計算出球的位置,以及是否碰到方盒邊界而回彈,這部分的程式如下:

# 檢查是不是碰到左、右邊界回彈
if (position.x > HEIGHT) or (position.x < 0):
velocity.x = -velocity.x

# 檢查是不是碰到前、後邊界回彈
if (position.y > WIDTH) or (position.y < 0):
velocity.y = -velocity.y

# 檢查是不是碰到上、下邊界回彈
if (position.z > HEIGHT) or (position.z < 0):
velocity.z = -velocity.z


留言
avatar-img
ysf的沙龍
27會員
168內容數
寫點東西自娛娛人
ysf的沙龍的其他內容
2024/07/16
介紹以物件導向的方式,以向量來實作物體運動的模擬程式。
2024/07/16
介紹以物件導向的方式,以向量來實作物體運動的模擬程式。
2024/07/15
介紹如何在模擬物體運動時,引入加速度這個物理量。
2024/07/15
介紹如何在模擬物體運動時,引入加速度這個物理量。
看更多
你可能也想看
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
高中數學主題練習—平面向量內積計算
Thumbnail
高中數學主題練習—平面向量內積計算
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
介紹pygame支援的向量運算,以及向量的減法、乘法、除法實際上是怎麼計算的。
Thumbnail
介紹pygame支援的向量運算,以及向量的減法、乘法、除法實際上是怎麼計算的。
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
高中數學主題練習—向量分點公式
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
本文介紹了各種運算符的用法和優先級,包括算術運算符、比較運算符、賦值運算符、邏輯運算符、位元運算符、成員運算符和身份運算符。每種運算符都有詳細的描述和示例程式碼,幫助理解其功能和用法。
Thumbnail
本文介紹了各種運算符的用法和優先級,包括算術運算符、比較運算符、賦值運算符、邏輯運算符、位元運算符、成員運算符和身份運算符。每種運算符都有詳細的描述和示例程式碼,幫助理解其功能和用法。
Thumbnail
一、基本算術運算符號 加法:+ 減法:- 乘法:* 除法:/(返回浮點數) a = 1 b = 2 print( a + b ) # 加法 輸出:3 print( a - b ) # 減法 輸出:-1 print( a * b ) # 乘法 輸出:2 print( a / b ) #
Thumbnail
一、基本算術運算符號 加法:+ 減法:- 乘法:* 除法:/(返回浮點數) a = 1 b = 2 print( a + b ) # 加法 輸出:3 print( a - b ) # 減法 輸出:-1 print( a * b ) # 乘法 輸出:2 print( a / b ) #
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News