角度有兩種單位,一個就是大家耳熟能詳的「度」(degree),記做 °;另一個是「弳度」(radian),也翻譯成「弧度」,記做rad。當使用弳度來度量角度的大小時,通常會把rad省略,不寫出來。
弳度的定義是:一個圓的圓弧長度,和這個圓的半徑的比值。所以,1 rad就相當於是圓弧長度和半徑相等時的角度大小。
利用弳度的定義,可以很容易就推導出度和弳度間的關係。假設圓的半徑是r,那整個圓繞一圈的長度,也就是圓周長,就是2πr。所以,整個圓繞一圈,就相當於是繞了
2πr / r = 2π rad
眾所周知,整個圓繞一圈是360°,所以
2π = 360°
也就是說
π = 180°
有了這個關係式,可以很容易就看出,弳度和度之間的轉換可以寫成
弳度 / 度 = π / 180
在python的math module裡頭,提供了兩個方法,可以很方便地在度和弳度間進行轉換
math.radians(deg)
:把度轉換成弳度。math.degrees(rad)
:把弳度轉換成度。關於角度,除了要注意單位之外,還要注意正負號代表的意思。正的角度,代表的是逆時針方向旋轉的角度;負的角度,則代表順時針方向旋轉的角度。
Exercise 3.1
用pygame.transform.rotate()
來旋轉圖案。不過,要注意的是,這個方法使用的角度單位是度,而不是弳度。
# python version 3.10.9
import sys
import pygame # version 2.3.0
pygame.init()
pygame.display.set_caption("Exercise 3.1")
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()
baton_length = 200 # 指揮棒長度
radius = 10 # 指揮棒端點球半徑
# 建造用來繪製指揮棒圖案的surface並以白色清空
surface_size = (baton_length, baton_length)
surface = pygame.Surface(surface_size)
surface.fill(WHITE)
# 在surface上繪製指揮棒圖案
endpoint1 = (radius, baton_length//2)
endpoint2 = (baton_length-radius, baton_length//2)
pygame.draw.circle(surface, BLACK, endpoint1, radius)
pygame.draw.circle(surface, BLACK, endpoint2, radius)
pygame.draw.line(surface, BLACK, endpoint1, endpoint2, 5)
# surface的旋轉角度,單位是度
angle = 1
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill(WHITE)
angle -= 1 # 順時針旋轉
rotated_surface = pygame.transform.rotate(surface, angle)
rect = rotated_surface.get_rect(center=(WIDTH//2, HEIGHT//2))
screen.blit(rotated_surface, (rect.x, rect.y))
pygame.display.update()
frame_rate.tick(FPS)