The Nature of Code閱讀心得與Python實作:3.6 Properties of...

更新 發佈閱讀 3 分鐘
這一節的標題是
3.6 Properties of Oscillation
因為方格子標題字數限制,所以沒完整顯現

這一節談的是振盪(oscillation),也就是在兩個點之間來回的週期性運動。日常生活中,隨處都可見到振盪的現象。例如,彈奏弦樂器時,弦的振動、盪鞦韆時的來回擺動、音叉的振動、單擺的來回擺動、彈簧的振動等。除了這些眼睛看得到的之外,麥克風、交流電、收音機、手機等許許多多的電子產品,也都是利用振盪的原理來運作的。

要談振盪,就免不了要來看一下正弦函數sin的圖形。

vocus|新世代的創作平台

從圖中可以看出來,sin的值會在-1到1之間來回改變。利用sin的這個特性,我們可以寫個程式,讓一個球在螢幕上,從左到右,再從右到左,不斷地來回擺盪。這種不斷來回擺盪的運動方式,叫做簡諧運動(simple harmonic motion, SHM)。這個程式很容易寫,不過在開始寫之前,要先熟悉一下振盪的相關術語。

一個進行簡諧運動的物體,它的位置會是時間的函數,而且可以用下列兩個性質來描述:

  • 振幅(amplitude):從運動中心點到端點的距離。
  • 週期(period):一個完整運動循環所需的時間。

當我們知道簡諧運動的振幅和週期之後,就可以造出能描述該簡諧運動的函數。有了能描述簡諧運動的函數之後,要寫程式來模擬它,就是水到渠成的事了。

根據上述振幅和週期的定義,可以很容易就從sin的圖形看出來,它的振幅是1,週期是2π。

知道振幅和週期所代表的意義之後,接下來就要來看看,那個讓一個球在螢幕上左右來回擺盪的程式要怎麼寫。

要想寫出讓一個球在螢幕上左右來回擺盪的程式,第一件要做的事,是要先確定:那個球擺盪的幅度有多大?速度又有多快?這兩個問題,其實也就是在問:振幅有多大?週期是多少?既然那個球是模擬世界中的球,要回答這兩個問題,就必須要知道,在模擬世界中,是怎麼衡量振幅和週期的。

既然振幅指的是距離,而週期指的是時間,那一直以來,我們用來衡量模擬世界中的距離和時間的方法,也就順理成章可以直接套用。這也就是說,我們會用像素和幀,當成衡量振幅和週期的單位。所以,如果有個振盪運動,中心點到端點的距離是100個像素,而且每隔120幀就會重複一次,那它的振幅就是100個像素,而週期則是120幀。

現在假設我們要讓那顆球以振幅A,週期T的方式擺盪,這時如果有個函數具有相同的振幅和週期,那我們不就可以利用它來計算,在不同的時間點球的位置了嗎?很幸運的,我們可以很容易的就用正弦函數sin,造出這樣子的函數來。

假設有個正弦函數長這樣

sin(ωt)

那它的週期會是

/ ω

這個其實也不難理解,把sin(ωt)稍微換個樣子就可以看出來了。令t'=ωt,則sin(ωt)=sint'。因為sint'的週期是2π,而這是以t'來衡量的,也就是畫圖時,橫軸是t'。所以把橫軸由t'=ωt還原成t,也就是改回用t來衡量時,週期會是2π/ω。

利用sin的這個特性,可以很容易就造出週期是T的sin函數。因為

/ ω = T

所以

ω = / T

也就是說

sin(2πt / T)

就是我們要的,週期為T的sin函數。

至於在振幅部分,因為sin函數的振幅是1,所以

A sin(2πt / T)

的振幅就會是A。

利用這個造出來的sin函數,那顆以振幅A週期T的方式擺盪的球的位置,就可以寫成下列程式

amplitude = A
period = T
x = amplitude*math.sin(2*math.pi*frame_count/period)

這裡的frame_count指的是已經執行的幀的數量。

下面是完整的程式。

Example 3.5: Simple Harmonic Motion I

# python version 3.10.9
import math
import sys

import pygame # version 2.3.0

pygame.init()

pygame.display.set_caption("Example 3.5: Simple Harmonic Motion I")

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

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

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

amplitude = 150
period = 120

frame_count = 0

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

screen.fill(WHITE)

# 球的位置
x = amplitude*math.sin(2*math.pi*frame_count/period)
position = (x+WIDTH//2, HEIGHT//2)

pygame.draw.circle(screen, BLACK, position, 20)
pygame.draw.line(screen, BLACK, position, screen_center, 3)

frame_count += 1

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

振盪的術語,除了振幅和週期這兩個之外,還有一個是頻率(frequency)。頻率指的是,單位時間內循環的次數,所以頻率會等於週期的倒數。例如,週期是120幀,那麼在1幀的時間內,會完成1/120個循環,所以頻率是1/120。從這裡可以看出來,週期和頻率,其實是一體兩面,都可以用來描述振盪的速度。那到底要用哪個比較好呢?其實青菜蘿蔔各有所好,覺得哪個好用,就用哪個囉!

Exercise 3.7

# python version 3.10.9
import math
import sys

import pygame # version 2.3.0

pygame.init()

pygame.display.set_caption("Exercise 3.7")

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

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

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

amplitude = 100
period = 120

frame_count = 0

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

screen.fill(WHITE)

# 球的位置
y = amplitude*math.sin(2*math.pi*frame_count/period)
position = (WIDTH//2, y+HEIGHT//2)

pygame.draw.circle(screen, BLACK, position, 20)
pygame.draw.line(screen, BLACK, position, (WIDTH//2, 0), 3)

frame_count += 1

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


留言
avatar-img
ysf的沙龍
32會員
168內容數
寫點東西自娛娛人
ysf的沙龍的其他內容
2024/09/20
這一節要模擬的是擺(pendulum)這個裝置中,構造最簡單、具有理想化性質的單擺(simple pendulum)。
Thumbnail
2024/09/20
這一節要模擬的是擺(pendulum)這個裝置中,構造最簡單、具有理想化性質的單擺(simple pendulum)。
Thumbnail
2024/09/16
我們曾經利用sin函數來模擬彈簧吊錘(bob)的運動,雖然這樣子的做法程式很容易寫,但是卻沒辦法模擬彈簧吊錘受到如風力、重力等環境中其他作用力的影響下,在空間中的運動狀況。要克服這樣子的問題,就不能再倚靠sin函數,而必須改用能夠用來計算彈簧彈力的虎克定律(Hooke's law)。
Thumbnail
2024/09/16
我們曾經利用sin函數來模擬彈簧吊錘(bob)的運動,雖然這樣子的做法程式很容易寫,但是卻沒辦法模擬彈簧吊錘受到如風力、重力等環境中其他作用力的影響下,在空間中的運動狀況。要克服這樣子的問題,就不能再倚靠sin函數,而必須改用能夠用來計算彈簧彈力的虎克定律(Hooke's law)。
Thumbnail
2024/09/13
在x軸上依序取一些點,然後把這些點以及其對應的sin函數的值所構成的二維座標點畫出來時,就可以看到由這個sin函數所產生的像波一樣的圖案,也就是波型(wave pattern)。不同樣式的波型,可以用來設計生物的軀幹或肢體,也可以用來模擬像水這類柔軟的表面。
Thumbnail
2024/09/13
在x軸上依序取一些點,然後把這些點以及其對應的sin函數的值所構成的二維座標點畫出來時,就可以看到由這個sin函數所產生的像波一樣的圖案,也就是波型(wave pattern)。不同樣式的波型,可以用來設計生物的軀幹或肢體,也可以用來模擬像水這類柔軟的表面。
Thumbnail
看更多
你可能也想看
Thumbnail
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
Thumbnail
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 四 在這個背景下,法國物理學家達朗貝爾 (見貼文 32) 是論爭成員中發表振動弦運動的第一人,因此也是將這
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 四 在這個背景下,法國物理學家達朗貝爾 (見貼文 32) 是論爭成員中發表振動弦運動的第一人,因此也是將這
Thumbnail
這篇要來分享關於「頻率」這件事,談到頻率,不免就要順便談談「吸引力法則」,現在訪間已經有多書籍、影片都有詳細描述吸引力法則的運行方式。它並不是什麼怪力亂神也不是什麼偽科學,實則吸引力法則是個再科學不過的量子力學,同頻相吸的概念而已。
Thumbnail
這篇要來分享關於「頻率」這件事,談到頻率,不免就要順便談談「吸引力法則」,現在訪間已經有多書籍、影片都有詳細描述吸引力法則的運行方式。它並不是什麼怪力亂神也不是什麼偽科學,實則吸引力法則是個再科學不過的量子力學,同頻相吸的概念而已。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
模擬世界是我們寫程式造出來的,我們就是模擬世界的主宰,所以各種作用力要長什麼樣子、要怎麼個作用法,都由我們決定。不過,如果希望這些作用力看起來像真實世界的作用力一樣,那在寫程式的時候,套用這些作用力在真實世界中的物理公式,會是比較省時省力的做法。
Thumbnail
模擬世界是我們寫程式造出來的,我們就是模擬世界的主宰,所以各種作用力要長什麼樣子、要怎麼個作用法,都由我們決定。不過,如果希望這些作用力看起來像真實世界的作用力一樣,那在寫程式的時候,套用這些作用力在真實世界中的物理公式,會是比較省時省力的做法。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News