The Nature of Code閱讀心得與Python實作:1.6 Normalizing Vectors

更新於 發佈於 閱讀時間約 3 分鐘

向量的正規化,是指在不改變向量方向的情況下,讓它的長度變成1,也就是變成單位向量(unit vector)。

要找出向量u的單位向量,記做,其實挺簡單的,計算方式為

= u / ‖u‖ 

稍微計算一下,就可以知道‖‖=1。

在pygame中,可以使用normalize()來做向量的正規化。

在做向量的正規化時,由於要除以向量的長度,所以長度為0的向量,也就是零向量,是沒辦法正規化的。因此,在寫程式的時候,必須先排除零向量的情況,然後才能進行向量正規化。例如,要做向量vec的正規化時,可以這樣寫:

unit_vec = vec.normalize() if vec.length() > 0 else 0*vec

這樣子,如果vec是零向量,就不會進行正規化,而直接把單位向量設定成零向量。要注意的是,視vec是二維或三維向量而定,程式中的0*vec也可以寫成pygame.Vector2(0, 0)pygame.Vector3(0, 0, 0)。寫成0*vec的好處,在於可以不需要多費心去注意vec是二維或三維向量,最後得到的,一定會是和vec有相同維度的零向量。

接下來的這個例子,是由畫面中心點,沿著滑鼠游標位置的方向,畫出長度為50的向量。不管滑鼠游標如何移動改變位置,向量的長度都固定為50。

Example 1.6: Normalizing 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.6: Normalizing 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)

# 計算向量及其單位向量,如果向量是零向量,則不進行正規化,並將單位向量設為零向量
vec = mouse - center
unit_vec = vec.normalize() if vec.length() > 0 else 0*vec

# 畫長度為50的向量
endpoint = center + 50*unit_vec
pygame.draw.line(screen, BLACK, center, endpoint, 10)

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


avatar-img
15會員
131內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
介紹pygame支援的向量運算,以及向量的減法、乘法、除法實際上是怎麼計算的。
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
使用向量來處理問題有很多好處,其中一個好處,就是可以減少變數的數量。在這節中,會用一個簡單的例子來介紹,使用向量跟不使用向量,對變數的數量會有什麼樣的影響。
這一章介紹向量(vector)這個在物理、工程等領域非常重要的數學工具,以及如何用它來模擬一些物理現象。
介紹pygame支援的向量運算,以及向量的減法、乘法、除法實際上是怎麼計算的。
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
使用向量來處理問題有很多好處,其中一個好處,就是可以減少變數的數量。在這節中,會用一個簡單的例子來介紹,使用向量跟不使用向量,對變數的數量會有什麼樣的影響。
這一章介紹向量(vector)這個在物理、工程等領域非常重要的數學工具,以及如何用它來模擬一些物理現象。
你可能也想看
Google News 追蹤
Thumbnail
最近國泰世華CUBE App推出的「美股定期定額」功能,讓使用者可以方便地進行跨境理財(但讀者仍需根據自身需求審慎考量),除了享有美股定期定額的新功能,也同時享有台股定期定額的功能,可以一站滿足我們理財的需求! 透過國泰世華CUBE App線上開台股證券戶+複委託戶,流程最快僅需要5分鐘。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
直觀理解 導數:考慮的是單一變數的函數,描述的是函數在某點的斜率或變化率。 偏導數:考慮的是多變數函數,描述的是函數在某個變數變化時的變化率,其他變數保持不變。  (針對各維度的調整 或者稱變化 你要調多少) 應用 導數:在物理學中應用廣泛,例如描述速度和加速度。 偏導數:在多變量分析、優
Thumbnail
最近國泰世華CUBE App推出的「美股定期定額」功能,讓使用者可以方便地進行跨境理財(但讀者仍需根據自身需求審慎考量),除了享有美股定期定額的新功能,也同時享有台股定期定額的功能,可以一站滿足我們理財的需求! 透過國泰世華CUBE App線上開台股證券戶+複委託戶,流程最快僅需要5分鐘。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
直觀理解 導數:考慮的是單一變數的函數,描述的是函數在某點的斜率或變化率。 偏導數:考慮的是多變數函數,描述的是函數在某個變數變化時的變化率,其他變數保持不變。  (針對各維度的調整 或者稱變化 你要調多少) 應用 導數:在物理學中應用廣泛,例如描述速度和加速度。 偏導數:在多變量分析、優