The Nature of Code閱讀心得與Python實作:1.4 More Vector Math

更新於 2024/07/01閱讀時間約 7 分鐘

pygame的Vector2()、Vector3()支援許多向量的運算,例如

vec + vec
vec - vec
vec * number
number * vec
vec / number
vec // number
vec += vec
vec -= vec
vec *= number
vec /= number
vec //= number
round(vec, ndigits=0)
vec * vec 等同於 dot()
cross()
magnitude() 等同於 length()
normalize()
scale_to_length()

更多更詳細的向量運算,可查閱pygame的說明文件

接下來,就來看看向量的減法、乘法、除法實際上是怎麼計算的。

先來看向量的減法。假設

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

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

因為-v是個大小和v相等,但方向相反的向量,所以,減掉一個向量,其實就是加上一個方向相反的向量而已。

下面這個例子,是要在滑鼠游標位置和畫面中心點間畫出直線,而這條直線所代表的,就是畫面中心點到滑鼠游標位置的向量。
Example 1.3: Vector Subtraction

raw-image


# python version 3.10.9
import sys

import pygame # version 2.3.0

pygame.init()


pygame.display.set_caption("Example 1.3: Vector Subtraction")

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

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

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

center = pygame.Vector2(WIDTH//2, HEIGHT//2)

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

screen.fill(WHITE)

mouse = pygame.Vector2(pygame.mouse.get_pos())

pygame.draw.line(screen, BLACK, center, mouse, 5)
pygame.draw.line(screen, GRAY, (0, 0), center, 5)
pygame.draw.line(screen, GRAY, (0, 0), mouse, 5)

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

這個例子在原書中的做法,是使用向量減法算出從畫面中心點到滑鼠游標位置的向量,接著將座標系統的原點平移到畫面中心點,最後畫出新的原點到向量間的直線。因為pygame並沒有轉換座標系統的函數可供使用,所以就直接畫出從畫面中心到滑鼠游標位置的線段。這個例子,對pygame而言,並不是那麼適合用來展現向量減法的用途和好處。

接下來介紹向量的乘法。

向量的乘法指的是向量乘上一個實數,也就是縮放向量的大小。假設要把u縮放α倍,做法如下:

u × α = (ux, uy) × α = (uxα, uyα)

這也就是說,要縮放向量,只要同時把各個分量乘上相同的縮放倍數就可以了。

向量乘法滿足交換率、結合律和分配率(distributive rule):

交換率:u × α = α × u
結合律:(α × β) × u = α × (β × u)
分配律:
(α + β) × u = α × u + β × u
(u + v) × α = u × α + v × α

下面這個例子,是從畫面中心點到滑鼠游標位置畫出一條線段,然後將其縮短1/2。

Example 1.4: Multiplying a Vector

raw-image
# python version 3.10.9
import sys

import pygame # version 2.3.0


pygame.init()

pygame.display.set_caption("Example 1.4: Multiplying a Vector")

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

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

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

center = pygame.Vector2(WIDTH//2, HEIGHT//2)

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

screen.fill(WHITE)

mouse = pygame.Vector2(pygame.mouse.get_pos())

pygame.draw.line(screen, GRAY, center, mouse, 3)

endpoint = center + 0.5*(mouse - center)
pygame.draw.line(screen, BLACK, center, endpoint, 5)

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

程式的重點在於端點的求法。以向量的觀點來看,端點為

endpoint = center + 0.5*(mouse - center)

如果純粹以座標的觀點來看,端點為

endpoint = 0.5*(mouse + center)

事實上,這兩個不同觀點算出來的,是一模一樣的東西,只是呈現的方式不同罷了。

結束這節前,也來看一下除法的計算方式。和乘法一樣,除法的計算方式也是依各分量分別計算就可以了,也就是說

u / α = (ux, uy) / α = (ux/α, uy/α)

除法和乘法其實是一體兩面,因為

u / α = (1/α)×u

avatar-img
15會員
130內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
使用向量來處理問題有很多好處,其中一個好處,就是可以減少變數的數量。在這節中,會用一個簡單的例子來介紹,使用向量跟不使用向量,對變數的數量會有什麼樣的影響。
這一章介紹向量(vector)這個在物理、工程等領域非常重要的數學工具,以及如何用它來模擬一些物理現象。
這一節的標題是A Smoother Approach with Perlin Noise,介紹由Ken Perlin所開發的Perlin noise,及其應用方式。
這一節介紹使用accept-reject algorithm來產生符合特定機率分布的亂數,使得random walker具備Lévy flight的能力。
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
使用向量來處理問題有很多好處,其中一個好處,就是可以減少變數的數量。在這節中,會用一個簡單的例子來介紹,使用向量跟不使用向量,對變數的數量會有什麼樣的影響。
這一章介紹向量(vector)這個在物理、工程等領域非常重要的數學工具,以及如何用它來模擬一些物理現象。
這一節的標題是A Smoother Approach with Perlin Noise,介紹由Ken Perlin所開發的Perlin noise,及其應用方式。
這一節介紹使用accept-reject algorithm來產生符合特定機率分布的亂數,使得random walker具備Lévy flight的能力。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
As we navigate through 2024, the mobile app development landscape continues to evolve, driven by changing consumer behaviors...
Thumbnail
複習今日所學英文~有關於運動~ 內容:成長過程中對運動的興趣、運動的正面影響。從小時候習慣了每天運動、運動選擇的改變、現在面臨的挑戰~
Thumbnail
"You live for yourselves, not for humans." About trees and their feelings of sadness due to human interference.
Now I understand: there is no need for futile treatment or ineffective care, allowing our mother nature to take over may be the kindest approach for t
Thumbnail
  簡直像站在球場中看著真實的比賽讓人目不轉睛,呼吸為之屏息——傳說中灌籃高手動畫版的遺珠之憾:湘北對山王之戰終於出世。當年所有人期盼卻沒盼得的最重要的一場比賽,在生父手下脫胎而出,讓這部作品畫下奇蹟的句點。  
Thumbnail
《The Writer And Her Story》是香港漫畫家智海在1999年的作品,黑白色調的漫畫,描寫一個抑鬱的作者,被自己腦袋裡沉重的想法壓駝了背,寫下作品想為腦袋「減重」,卻被各種瑣碎問題所困,就連繪者也彷彿以上帝之手,延伸再延伸,給他沒有盡頭的樓梯和前路...
Thumbnail
在海上看美景,也不忘笑話別人的英語口音👉「It's gorgis, ain't it?」一起來領略一世紀前馬克•吐溫的不倒幽默!
Thumbnail
英文有一些慣用的句子,字面上怎麼讀都參不透,因為不知道背後隱含的思考邏輯。「給他懷疑的好處(give him the benefit of the doubt)」這種話在中文的邏輯中根本不成文也說不通,到底是在講什麼鬼?你只能用外國人的邏輯來想!
Thumbnail
《Queen’s Gambit》第一眼看會以為又是另一個關於天才兒童戰無不勝或者自甘墮落的故事。其實這一套劇集,講的是一個高敏感又內向的女生,如何在女權崛起之前的冷戰年代,以人生輸家之姿,晉身頂級棋手的故事,同時講述一個女孩子的前半生。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
As we navigate through 2024, the mobile app development landscape continues to evolve, driven by changing consumer behaviors...
Thumbnail
複習今日所學英文~有關於運動~ 內容:成長過程中對運動的興趣、運動的正面影響。從小時候習慣了每天運動、運動選擇的改變、現在面臨的挑戰~
Thumbnail
"You live for yourselves, not for humans." About trees and their feelings of sadness due to human interference.
Now I understand: there is no need for futile treatment or ineffective care, allowing our mother nature to take over may be the kindest approach for t
Thumbnail
  簡直像站在球場中看著真實的比賽讓人目不轉睛,呼吸為之屏息——傳說中灌籃高手動畫版的遺珠之憾:湘北對山王之戰終於出世。當年所有人期盼卻沒盼得的最重要的一場比賽,在生父手下脫胎而出,讓這部作品畫下奇蹟的句點。  
Thumbnail
《The Writer And Her Story》是香港漫畫家智海在1999年的作品,黑白色調的漫畫,描寫一個抑鬱的作者,被自己腦袋裡沉重的想法壓駝了背,寫下作品想為腦袋「減重」,卻被各種瑣碎問題所困,就連繪者也彷彿以上帝之手,延伸再延伸,給他沒有盡頭的樓梯和前路...
Thumbnail
在海上看美景,也不忘笑話別人的英語口音👉「It's gorgis, ain't it?」一起來領略一世紀前馬克•吐溫的不倒幽默!
Thumbnail
英文有一些慣用的句子,字面上怎麼讀都參不透,因為不知道背後隱含的思考邏輯。「給他懷疑的好處(give him the benefit of the doubt)」這種話在中文的邏輯中根本不成文也說不通,到底是在講什麼鬼?你只能用外國人的邏輯來想!
Thumbnail
《Queen’s Gambit》第一眼看會以為又是另一個關於天才兒童戰無不勝或者自甘墮落的故事。其實這一套劇集,講的是一個高敏感又內向的女生,如何在女權崛起之前的冷戰年代,以人生輸家之姿,晉身頂級棋手的故事,同時講述一個女孩子的前半生。