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

閱讀時間約 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

13會員
94內容數
寫點東西自娛娛人
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
Thumbnail
avatar
黑貓老師
2024-06-29
防曬產品係數測試報告彙整(2024年)從2014年起,自己對於市售防曬產品的效能產生了濃厚的興趣。因為當時候發現不少產品的防曬係數其實標示是有問題的,像是原本應該是人體測試的SPF與PA數值,實際上沒有做,只用機器測試的數據來充當,但這兩者卻有很大的差異。像是防曬係數其實有強度、廣度與平均度三個面向需要一起判斷,但多數廠商並沒有完整標示
Thumbnail
avatar
邱品齊皮膚科醫師
2023-04-27
The Evolution of Mobile App Development Frameworks in 2024As we navigate through 2024, the mobile app development landscape continues to evolve, driven by changing consumer behaviors...
Thumbnail
avatar
Digiworld
2024-04-26
The benefits on exercise_2024.04.25複習今日所學英文~有關於運動~ 內容:成長過程中對運動的興趣、運動的正面影響。從小時候習慣了每天運動、運動選擇的改變、現在面臨的挑戰~
Thumbnail
avatar
天上的一片雲
2024-04-25
《Compassion》The sorrow of trees - a message from nature"You live for yourselves, not for humans." About trees and their feelings of sadness due to human interference.
Thumbnail
avatar
靈魂共感療域 EmpathyCave
2023-11-12
自然死亡,很難嗎? Allowing the mother nature taking over our deathNow 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
avatar
雙魚鏡方格子檔案館
2023-07-13
《The First Slam Dunk》:即使心臟噗通噗通跳,也要表現得若無其事  簡直像站在球場中看著真實的比賽讓人目不轉睛,呼吸為之屏息——傳說中灌籃高手動畫版的遺珠之憾:湘北對山王之戰終於出世。當年所有人期盼卻沒盼得的最重要的一場比賽,在生父手下脫胎而出,讓這部作品畫下奇蹟的句點。  
Thumbnail
avatar
薄荷糖
2023-01-28
The Writer And Her Story 遇見香港漫畫家智海《The Writer And Her Story》是香港漫畫家智海在1999年的作品,黑白色調的漫畫,描寫一個抑鬱的作者,被自己腦袋裡沉重的想法壓駝了背,寫下作品想為腦袋「減重」,卻被各種瑣碎問題所困,就連繪者也彷彿以上帝之手,延伸再延伸,給他沒有盡頭的樓梯和前路...
Thumbnail
avatar
林倚
2023-01-03
The Innocents Abroad👉跟馬克•吐溫遊歐亞在海上看美景,也不忘笑話別人的英語口音👉「It's gorgis, ain't it?」一起來領略一世紀前馬克•吐溫的不倒幽默!
Thumbnail
avatar
Mary Ventura
2022-09-11
the benefit of the doubt? 「懷疑的好處」是什麼語感來著?英文有一些慣用的句子,字面上怎麼讀都參不透,因為不知道背後隱含的思考邏輯。「給他懷疑的好處(give him the benefit of the doubt)」這種話在中文的邏輯中根本不成文也說不通,到底是在講什麼鬼?你只能用外國人的邏輯來想!
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2021-06-23
《The Queen's Gambit》 你是一個奇蹟,但要學習如何生活《Queen’s Gambit》第一眼看會以為又是另一個關於天才兒童戰無不勝或者自甘墮落的故事。其實這一套劇集,講的是一個高敏感又內向的女生,如何在女權崛起之前的冷戰年代,以人生輸家之姿,晉身頂級棋手的故事,同時講述一個女孩子的前半生。
Thumbnail
avatar
Kayla 陳韻如
2021-03-19
avatar
神勇火球
2007-08-16